Продолжаю изучать R и делиться кодом. На этот раз проанализируем коинтегрированность. Вообще, торговать корреляции опасно, так как они могут оказаться случайными. Гораздо безопаснее коинтеграцию. Хотя и она может ломаться.
Далее используется тест Энгла-Грэнджера. Тест основан на коинтеграционном уравнении, оценённом с помощью обычного МНК. Идея теста заключается в том, что если остатки этой модели нестационарны (имеют единичный корень), то коинтеграция временных рядов отсутствует. Нулевая гипотеза — отсутствие коинтеграции, то есть наличие единичного корня в ошибках модели (коинтеграционного уравнения). Для проверки гипотезы единичного корня применяется статистика расширенного теста Дики-Фулера, однако в отличие от классического случая этого теста в данном случае критические значения статистики иные, они больше по абсолютной величине.
Коинтеграция Si со спотом
(очевидно, что должна быть) как проверочный случай
Коинтеграция RIM6 и BRM6
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
Трендовая стационарность
Тест Дики-Фуллера
я сейчас тоже R изучаю, правда, для аналитики данных
пока дальше qplot не зашел
И да в plot можно задавать максимальное значение для оси X и Y что бы графики полностью попадали в область вывода, а не как у тебя во втором случае. Его можно задать через max() от двух рядов.
=) Будьте ближе к народу: посчитайте попарные коинтеграции для нашего рынка, пожалуйста.
Кого с кем можно ставить в стационарный спред?
Вот так выглядят их спред, синхронизированный по тикам в R на примере первого торгового часа 6 апреля 2016 года:
Извините конечно, но R такое жуткое говнище — работает в один поток, только вывод графиков хорош. Когда он меня окончательно довел взял кресты, и сейчас добавляю V8 в проект для динамичности.
Тоже самое относится и к питошке.
Андрей Л (division_by_zero),
Кресты — C++
V8 — движок для javascript. Очень хорошо работает с крестами. Можно определить js функции как коллбеки, вызывать js-код из крестов.