SciFi
SciFi личный блог
02 июня 2016, 06:47

Анализ коинтеграции пар активов на 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.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

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

Тест Дики-Фуллера
31 Комментарий
  • Гуру Хренов
    02 июня 2016, 07:05
    круто !
    я сейчас тоже R изучаю, правда, для аналитики данных
    пока дальше qplot не зашел
  • evgen000
    02 июня 2016, 09:15
    CAC40 vs Eurostoxx 50. P-value Дики Фуллера покажет что они коинтегрированны, но торговать такое врятли возможно.

    И
     да в plot можно задавать максимальное значение для оси X и Y что бы графики полностью попадали в область вывода, а не как у тебя во втором случае. Его можно задать через max() от двух рядов.
    • ch5oh
      02 июня 2016, 09:50
      evgen000, а какие проблемы их торговать?
  • ch5oh
    02 июня 2016, 09:51

     =) Будьте ближе к народу: посчитайте попарные коинтеграции для нашего рынка, пожалуйста.

     

    Кого с кем можно ставить в стационарный спред?

  • По графику SI/USDRUB смещение специально сделано или фьючерс действительно запаздывает? Если запаздывает, то непонятно, почему арбитражные роботы этот дисбаланс не выравнивают.
    • Михаил Пиписькин
      02 июня 2016, 12:06
      Трейдер Квадратный, это у ТС ряды съехали, такого быть не может
    • Sergey Pavlov
      02 июня 2016, 12:09
      Трейдер Квадратный, они идут настолько тика в тику, что там почти нечего делать. Это ошибка у автора скорее всего из-за визуализации несинхронизированных данных.
      Вот так выглядят их спред, синхронизированный по тикам в R на примере первого торгового часа 6 апреля 2016 года:


    • Sergey Pavlov
      02 июня 2016, 12:11
      SciFi, контанго даст смещения по ординате. У вас смещение по абсциссе, нарастающее слева направо. Из-за этого возникает ложный эффект запаздывания/опережения.
  • evgen000
    02 июня 2016, 12:29
    На арбитраже Спот-Фьюч сидит ММ мафия, феникс еще говорил )
    • MyProfit
      03 июня 2016, 03:05
      evgen000, т.е. там не реально откусить себе пирожок?
      • evgen000
        03 июня 2016, 08:50
        MyProfit, абсолютно не реально, посмотрите кто маркетит фьюч РТС, эти же самые ребята являются лидерами в предоставлении DMA доступа к бирже. И активно пиарят регулярную торговлю через своих агентов. Ничего личного только бизнесс.
  • Евгений Макеев
    02 июня 2016, 12:29
    Поделитесь, какую книгу (источник) взяли как основу для изучения R?  Язык замечательный, но как мне показалось  информация по нему довольно фрагментирована. 
    • evgen000
      02 июня 2016, 12:30
      Макеев Евгений, информации по нему просто завались ))
    • Евгений Макеев
      02 июня 2016, 12:33
      SciFi, я так и думал. Спасибо. Хотите ссыль на 600 МБ литературы по R?
  • crast
    02 июня 2016, 15:12

    Извините конечно, но R такое жуткое говнище — работает в один поток, только вывод графиков хорош. Когда он меня окончательно довел взял кресты, и сейчас добавляю V8 в проект для динамичности.

    Тоже самое относится и к питошке. 

    • Гуру Хренов
      02 июня 2016, 16:59
      crast, что такое «кресты» и «v8»? спасибо!
      • crast
        03 июня 2016, 10:45

        Андрей Л (division_by_zero), 

        Кресты — C++

        V8 — движок для javascript. Очень хорошо работает с крестами. Можно определить js функции как коллбеки, вызывать js-код из крестов.

      • crast
        03 июня 2016, 10:46
        SciFi, ну да. Пробовал работать с quantmod. Опыт очень плохой. 
  • MyProfit
    02 июня 2016, 23:59
    Что за язык R?
  • MyProfit
    03 июня 2016, 03:07
     На арбитраже Спот-Фьюч кто нибудь пробовал торговать? там местечко еще свободно на рынке?
  • Mrak
    02 июня 2017, 18:44
     Макеев Евгений, добрый, можно ссылку на R в 600 мб?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн