iqoption

Анализ коинтеграции пар активов на R и можно ли торговать RTS только по Brent

Продолжаю изучать R и делиться кодом. На этот раз проанализируем коинтегрированность. Вообще, торговать корреляции опасно, так как они могут оказаться случайными. Гораздо безопаснее коинтеграцию. Хотя и она может ломаться.


Коинтеграция Si со спотом
 
(очевидно, что должна быть) как проверочный случай
Анализ коинтеграции пар активов на R и можно ли торговать RTS только по Brent

Коинтеграция RIM6 и BRM6
Анализ коинтеграции пар активов на R и можно ли торговать RTS только по Brent


Augmented Dickey-Fuller Test

data:  as.vector(spread)
Dickey-Fuller = -2.2626, Lag order = 0, p-value = 0 <a name="cut" id="cut"></a> 
.4671
alternative hypothesis: stationary


Вывод

Торговать RTS только по Brent или эту пару нельзя, так как процесс нестационарный (p-value сильно больше 0.05)


Вызывать так
> source("D:\\Dropbox\\R\\Cointegration.r")

Скрипт на R
# КОИНТЕГРАЦИЯ МЕЖДУ RIM6 И BRM6

#install.packages("tseries")
# Установка пакета tseries (анализ временных рядов и количественные финансы)

#install.packages("quantmod")
# Установка пакета quantmod (количественный анализ торговых стратегий)

#install.packages("rusquant", repos="http://R-Forge.R-project.org")
# Установка пакета rusquant (адаптированная под Россию версия quantmod)

library(tseries)
library(quantmod)
library(rusquant)
# Подключение библиотек

tickerArray <- c("RIM6", "BRM6")
# Создаем массив из тикеров, для которых будем получать данные
# Если получать по очереди, то возникают ошибки в скрипте, хотя при
# построчном выполнении это делать можно

getSymbols(tickerArray, from=Sys.Date()-30, src="Finam", period="5min")
# Получение 5 минутных данных за последний месяц (а точнее, 30 дней)

# candleChart(BRM6)
# Строим свечной график, чтобы убедиться в том, что данные скачались
# В скрипте это бесполезно

data <- cbind(Cl(RIM6), Cl(BRM6))
# Создание структуры данных из цен закрытия 5 минутных свечей двух активов

data <- data[complete.cases(data)]
# Убираем те данные, в которых есть пробелы (одна цена закрытия есть, а другой нет)

print(summary(data))
# Смотрим, что из себя представляют наши данные: общие статистические параметры
# Обратите внимание, что в скрипте print нужен, хотя при построчном выполнении не нужен

print(head(data))
# Смотрим, что из себя представляют наши данные: первые 6 строк

names(data) <- c("RIM6", "BRM6")
# Переименовываем столбцы в data на более удобные

model <- lm(RIM6~BRM6+0, data)
# Создаем модель линейной регрессии

print(summary(model))
# Смотрим модель

spread <- data$RIM6 - coef(model)[1]*data$BRM6
# Расчитываем остатки модели

# plot(spread, type="l")
# Рисуем график остатков в виде линии
# В скрипте это бесполезно

print(adf.test(as.vector(spread), k=0))
# Проводим расширенный тест Дики-Фуллера на стационарность
# И тут же выводим результаты

plot(as.vector(Cl(RIM6)), col='blue', type='l', main='Cointegration between RIM6 and BRM6', ylab='price')
# Рисуем график цен закрытия RIM6

lines(as.vector(Cl(BRM6)*coef(model)[1]), col='red', type='l')
# Добавляем к нему график BRM6, чтобы увидеть коинтегрированность


Список использованных источников

Коинтеграция в вики

Сравнение временных рядов

О коинтеграции временных рядов на R

Описание библиотеки tseries

Подробнее про функцию complete.cases

Трендовая стационарность

Тест Дики-Фуллера