Блог им. SciFi

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

    • 02 июня 2016, 06:47
    • |
    • SciFi
  • Еще
Продолжаю изучать 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

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

Тест Дики-Фуллера
★26
31 комментарий
круто !
я сейчас тоже R изучаю, правда, для аналитики данных
пока дальше qplot не зашел
CAC40 vs Eurostoxx 50. P-value Дики Фуллера покажет что они коинтегрированны, но торговать такое врятли возможно.

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

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

 

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

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


avatar
Оно возникает из-за контанго, я думаю. Алгоритм использовался тот же самый.
avatar
SciFi, контанго даст смещения по ординате. У вас смещение по абсциссе, нарастающее слева направо. Из-за этого возникает ложный эффект запаздывания/опережения.
avatar
Sergey Pavlov, тут строится линейная регрессия с коэффициентом бета = 1007 и втупую умножается котировка спота на это число. Поэтому и нет полного совпадения. Хотя может быть и даты разные (по индексу), я не проверял еще. Но это маловероятно, так как я создаю структуру data и удаляю потом неполные строки. Это косяк методики самой, не моя ошибка. Модель линейной регрессии слишком простая и тут цель не столько определить точную справедливую цену на фьючерс по споту, сколько грубо проверить наличие коинтеграции. Мне кажется, контанго в процентах просто меняется со временем из-за дисбаланса спроса и предложения. На нефти, к примеру, иногда возникает даже беквордация. Обратите внимание, что вначале ряды почти лежат друг на друге, потом смещение усиливается.
avatar
ch5oh, Попарные коинтеграции бесполезно считать. Я взял наиболее коррелированную пару и не получил ничего хорошего. Можно получить коинтеграцию, если взять топ ММВБ и фьючерс на индекс ММВБ. Или нефть и нефтяной индекс долларовый, скорее всего.
avatar
На арбитраже Спот-Фьюч сидит ММ мафия, феникс еще говорил )
avatar
evgen000, т.е. там не реально откусить себе пирожок?
avatar
MyProfit, абсолютно не реально, посмотрите кто маркетит фьюч РТС, эти же самые ребята являются лидерами в предоставлении DMA доступа к бирже. И активно пиарят регулярную торговлю через своих агентов. Ничего личного только бизнесс.
avatar
Поделитесь, какую книгу (источник) взяли как основу для изучения R?  Язык замечательный, но как мне показалось  информация по нему довольно фрагментирована. 
Макеев Евгений, информации по нему просто завались ))
avatar
evgen000, ага ты мне очень помог, дружище )))
Читаю все подряд в интернете. Гугл в помощь. Все задачи уже решены
avatar
SciFi, я так и думал. Спасибо. Хотите ссыль на 600 МБ литературы по R?
Макеев Евгений, не откажусь )
avatar
SciFi, см в личке

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

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

avatar
crast, что такое «кресты» и «v8»? спасибо!

Андрей Л (division_by_zero), 

Кресты — C++

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

avatar
crast, R для аналитики, а не торговли.
avatar
SciFi, ну да. Пробовал работать с quantmod. Опыт очень плохой. 
avatar
Что за язык R?
avatar
 На арбитраже Спот-Фьюч кто нибудь пробовал торговать? там местечко еще свободно на рынке?
avatar
MyProfit, думаю на гэпах можно половить редкие выносы (флеш-креши). Сам не пробовал.
avatar
 Макеев Евгений, добрый, можно ссылку на R в 600 мб?
avatar

теги блога SciFi

....все тэги



UPDONW
Новый дизайн