Блог им. SciFi

Применение ARIMA для предсказания цены на RIM6 на R

    • 08 июня 2016, 12:48
    • |
    • SciFi
  • Еще
Решил копнуть чуть глубже в ARIMA и другие подобные модели. Попробовал предсказывать цену, а точнее, диапазон цен на ближайшую минуту и 5 минут и на этом сделать какие-то деньги. И что интересно, получилось. Хотя, возможно, это случайность отчасти, не тестировал на большом горизонте времени.

В комментариях к коду все есть.

ARIMA (англ. autoregressive integrated moving average, иногда модель Бокса — Дженкинса, методология Бокса — Дженкинса) — интегрированная модель авторегрессии — скользящего среднего — модель и методология анализа временных рядов. 

Основная идея этой модели в том, что цена в будущем зависит от цен в прошлом (авторегрессионная часть AR) и возврата к среднему (MA часть). А интегрированность означает то, что предварительно определяется порядок интегрированности для временного ряда. К примеру, порядок 1 означает, что разности 1 порядка являются стационарными. Для самой цены порядок интегрированности должен получаться равным 1, а для доходностей — 0. 

Заработал 230 рублей за 2 сделки 1 лотом на RIM6. Первая сделка была за счет предсказания на минутке, вторая на 5 минутке.

График

Применение ARIMA для предсказания цены на RIM6 на R




Код на R

#install.packages("forecast")
#install.packages("tseries")
#install.packages("quantmod")
#install.packages("rusquant", repos="http://R-Forge.R-project.org")
# Установка пакетов. Она не требуется, если уже все установлено.

library(tseries)
library(quantmod)
library(rusquant)
library(forecast)
library(arfima)
# Подключение библиотек. ARFIMA и quantmod пока не используются. 

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

#candleChart(RIM6)
# По желанию можно построить график, чтобы убедиться в правильности загрузки данных.

closes <- Cl(RIM6)
returns <- OpCl(RIM6)
# Цены закрытия и доходности

print("Best ARIMA Model for Close Prices")
print(arimaorder(auto.arima(closes)))
# Автоматический поиск лучшей ARIMA модели для цен закрытия с помощью критериев типа AIC

print("Best ARIMA Model for Returns")
print(arimaorder(auto.arima(returns)))
# Аналогично для доходностей

fit.closes <- Arima(closes, order=c(3, 1, 2))
fit.returns <- Arima(returns, order=c(2, 0, 2))
# После того, как нашли лучшую математическую модель, заново оптимизируем ее под цены

print("AIC Closes:")
print(AIC(fit.closes))
# Вывод AIC для цен закрытия

print("AIC Returns:")
print(AIC(fit.returns))
# Аналогично для доходностей

par(mfrow=c(2,1))
# Создаем график с 2 строками и 1 столбцом

plot(forecast(fit.closes), main='Close Prediction', lwd = 2, type="l", col="red")
lines(fitted(fit.closes),col="blue", lwd = 2)
# Добавляем цены закрытия (красные) и предсказания цен закрытия (синие)
# Если взять меньший период, чем 30 дней, эти линии будут видны

plot(forecast(fit.returns), main='Return Prediction', lwd = 2, type="l", col="red")
lines(fitted(fit.returns),col="blue", lwd = 2)
# Аналогично для доходностей

print('Close Price Predictions')
print(predict(fit.closes, n.ahead = 3))
# Распечатываем предсказания цены и ее диапазона (отклонение)

print('Return Predictions')
print(predict(fit.returns, n.ahead = 3))
# Аналогично для доходностей

#residuals.closes <- residuals(fit.closes)
#adf.test(residuals.closes)
#acf(residuals.closes)
# По желанию можно проанализировать остатки модели на автокорреляцию и стационарность
# с помощью теста Дики-Фуллера
# Остатки будут представлять из себя белый шум

Список источников

ARIMA

In R plot arima fitted model with the original series


Forecast from ARIMA fits

AUTOREGRESSIVE INTEGRATED MOVING AVERAGE ARIMA(P, D, Q) MODELS FOR TIME SERIES ANALYSIS
★22
58 комментариев
Если ограничиться AR моделью, Вы получите гораздо более эффективную с вычислительной точки зрения модель. Де-факто, МНК с обращением матрицы специального вида.
Но, если честно, я не очень верю в примитивное предсказание цены. На моей памяти, даже использование продвинутой ARFIMA с использованием CUDA для численного решения не показало ничего, пригодного для торговли. Правда, реализация была не моя, а моего знакомого, тонкостей я не знаю, и не поручусь, что он выжал из темы все, что возможно. 
avatar
SergeyJu, не совсем так. Если реальная модель содержит MA-часть, то AR-часть в чисто авторегрессионной модели будет стремиться к бесконечности, т.е. AIC/AICc будут всё время уменьшаться с ростом порядка модели. При этом качество оценки коэффициентов будет ухудшаться с ростом порядка модели.
Бобровский Дмитрий, теоретически Вы правы, конечно. 
НО!
Правильная постановка вопроса не «если модель содержит», а «какая модель лучше подходит». 
Это как в вопросе с ФНЧ. Можно проектировать фильтр с идеальной АЧХ, или с минимальной задержкой или еще как. Но по факту лично моих исследований, простая ЕМА оказывается в моих системах лучше и продвинутых КИХ и продвинутых БИХ. фильтров. И медианных фильтров, и прямой оценки производной численными методами.
Жизнь как бы мне намекает, сложность не окупается.  Возможно, у Вас и не так.
avatar
SergeyJu, да, зачастую модели порядка 4-5 чисто в AR-коэффициентах оказывается достаточно для более-менее хорошего описания даже ARMA-модели. Плюс у AR-подхода есть одно сравнительное преимущество — AR-GARCH модель можно фитить 2-хшаговым методом — сначала оценить порядок AR-части, потом уже порядок GARCH-части, при этом оценки будут вполне себе корректными. Для чисто ARMA подхода это не так. Но есть и минус — если модель «околообратимая» (корни MA-части лежат близко к единичному кругу), то для более-менее адекватной модели чисто на AR понадобится туева хуча коэффициентов.
Бобровский Дмитрий, чисто по физическому смыслу, а там должны быть корни близкие по модулю к 1?
avatar

SergeyJu, могут быть оные. В качестве примера можно привести КИХ-фильтр на 2 точки с h_{1} = 1, h_{0} = 0.95 и белым шумом на входе. Как-то так. 

Бобровский Дмитрий, не слишком ли хорошо будет прогнозируем такой ряд? Наши ряды все же плохо прогнозируемые.
avatar
SergeyJu, такой, кстати, не очень будет, откровенно говоря. Вообще MA-ряды не айс в прогнозировании.
Бобровский Дмитрий, на следующем шаге Вы легко предсказываете практически половину дисперсии нового отсчета. Это гораздо больше, чем получается на ценовых рядах.
avatar
SergeyJu, тут полностью согласен. Интервальные оценки получаются шикарными. Точечные не очень…
Предсказания? Нюню…
kbrobot.ru, ну прогнозирования, прогнозирования.))) Правда, он ещё зелёный, не знает, что точечные прогнозы весьма и весьма условная вещь. )) Нужно смотреть распределение прогноза на шаге t+1, использовать точечный прогноз как некоторую оценку отклонения от цены на шаге t, а дальше хотя бы тот же VaR использовать для оценки дохода.)))
Интересная тема кстати с АРИМОЙ, сам думал с этого начинать, потом рукой махнул, вроде еще более совершенные модели есть arch/garch, хотя в них уже не вникал. Тема реально интересная, думаю, если вы хороший спец, стоит в этом направлении покапать и потестировать 
Максим Андреев, а кто Вам сказал, что эти модели более совершенные и в каком смысле? 
Модели могут иметь больше или меньше параметров, лучше или хуже соответствовать конкретной задаче. 
Качество модели безотносительно области применения оценить практически невозможно.
avatar
SergeyJu, в какой-то книжечке прочитал, про прогнозирование временных рядов,  якобы, эти модели более точно описывают ряд, и специально их для прогнозов финансовых показателей используют с их большОй волатильностью 
Максим Андреев, автор книжки уже миллиардер?
avatar
SergeyJu, автор книжки профессор и зав кафедрой какого-то ВУЗА СПб, так что думаю не до фондовых рынков  ему)
Максим Андреев, те, кто не пытался реально торговать алгоритмы на рынке, обычно не понимают специфики проблем. 
avatar
SergeyJu, кстати, полагаю, что если применить модель к более старшим фреймам, точность модели должна возрасти, дневка или 4н думаю идеально бы подошли, а может сразу 2 фрейма или 3, допустим, дневка, 4н и 15м, и как прогноз по всем рядам будет совпадать, так и вставать в позицию. 
Максим Андреев, зачем думать, трясти надо :)
Попробуйте, авось что и выйдет. Чисто идеологически, все, что работает в предположении стационарности ряда, или стационарности с точностью до одного оцениваемого и медленно меняющегося параметра, на ценовых рядах работать должно плохо. Наши ряды более зашумлены и менее стационарны, чем то, с чем обычно имеют дело в технике.
avatar
SergeyJu, не силен я в программировании, поэтому быстро отошел от этого, но, более умному человеку стоит этим заняться) 
Максим Андреев, более профессионально подготовленному, наверное. Вот Карл Маркс, наверняка был очень умный, а программировать не умел :)
avatar
SergeyJu, говорят не очень. И имел такой плохой почерк что с работы выгнали, а жил за счет жены. Такой вот он Карл Маркс.
avatar
IliaM, я его много читал. Поверьте, производит впечатление чрезвычайно умного человека.
avatar
SergeyJu, у меня сосед-алкаш такое же впечатление производил. А в библии сказано что судить о человек по делам его надо.
avatar
IliaM, дела Маркса всем известны, и его книги в том числе — дела. Ваш сосед-алкаш, похоже, слишком сильно ограничил Ваш кругозор.
avatar
SergeyJu, вот я Вам и говорю — жиголо и бумагомарака он был. Вот и все его дела.
avatar
IliaM, а я знаю, что Ваш взгляд поверхностный и глупый. 
avatar
SergeyJu, ааааа понятно
avatar
SergeyJu, рекомендую погуглить «локально-стационарные процессы». У Nason'а на вейвлетах есть соответствующие библиотеки по оценке.
Бобровский Дмитрий, читал кое что об этом. Опять же, по моим личным впечатлениям, гипотеза стационарности мне не нужна даже локально. Наоборот, я бы хотел научиться хоть как-то, хоть чуть-чуть прогнозировать изменение волатильности. 
avatar
Максим Андреев, нужно копать в сторону ARIMA-GARCH или ARFIMA-GARCH, но тут есть ньюансы выбора ширины окна и типа модели. Маленькое окно даёт плохое качество оценок параметров составляющих модели как AR/MA частей, так и sigma/e частей (для GARCH). Большая ширина окна не учитывает структурные изменения ряда — зарождение локальных трендов или, например, ХевиСайда.
Бобровский Дмитрий, Вы так странно пишете фамилию Хевисайд, это что, какой-то новый термин?
avatar
SergeyJu, Эмммм, да вроде стандартно пишу... https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%A5%D0%B5%D0%B2%D0%B8%D1%81%D0%B0%D0%B9%D0%B4%D0%B0
Бобровский Дмитрий, С — большое, словно не фамилия, а два корня. 

avatar
SergeyJu, а если так? https://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D0%B2%D0%B8%D1%81%D0%B0%D0%B9%D0%B4,_%D0%9E%D0%BB%D0%B8%D0%B2%D0%B5%D1%80
))
Бобровский Дмитрий, так лучше. Вы имели в виду, я так понимаю, даже не функцию Хевисайда, а смену режима?
avatar
SergeyJu, да. Просто функция Хевисайда — один из примеров структурного изменения ряда.
Бобровский Дмитрий, вот. Задача обнаружения разладки (смены режима), в известном смысле ближе к нашей проблематике, чем задача прогнозирования ряда. 

avatar
SergeyJu, тут есть ряд интересных наблюдений у меня, например. Вообще — да, и задача поиска структурных изменений весьма интересна и сложна. Но если посмотреть на длинные ряды данных рынка, то можно с некоторым приближением говорить о стационарности на достаточно большом промежутке времени. Я как раз об этом писал — локально стационарные ряды.
Бобровский Дмитрий, Вы явно используете эту гипотезу, она дает Вам, как принято говорить, альфу?
avatar
 А сделки то вручную вводили? Т.е. каждую минуту пересчет и ручной ввод?
avatar
IliaM, пока да, просто испытал модель на практике. Хотел показать, как выглядят сделки для представления. Вводил с помощью скальперского стакана ) 
avatar
SciFi, так-то 100р/минута — хорошо. Но в таком варианте — жесть будет
avatar
 Автор, auto.arima даёт Вам лучшую модель по выбранному информационному критерию сразу, кусок 
fit.closes <- Arima(closes, order=c(3, 1, 2))
fit.returns <- Arima(returns, order=c(2, 0, 2))
является лажой, т.к. почему-то вне зависимости от того, что дала Вам библиотека forecast, Вы используете только модели ARIMA(3, 1, 2) и ARIMA(2, 0, 2)

Бобровский Дмитрий, ага, спасибо. Так-то я руками подставлял order из предыдущего этапа. Понял, что не нужно этого делать. 
avatar
Можно просто взять сразу готовую модель, которая даётся в auto.arima. Для неё использовать predict (вроде так называется эта функция в пакете). 
Бобровский Дмитрий, да, я понял
avatar
SciFi, информируйте народ по мере получения нового материала. Некоторым аутсайдерам, как выяснилось, это интересно :)
avatar
SergeyJu, да, буду выкладывать, пока будут давать ценные советы в комментариях ) 
avatar
SciFi, поделитесь, если не секрет, продолжаете использовать эту тему в торговле, или уже нет? Сам наткнулся на модели авторегрессии в контексте расчета лага при расчете коинтеграции для торговли корзинами, и поэтому хочу понять имеет ли смысл тратить время на изучение еще и этой темы.
avatar
RomSunZ, это работает плохо в моменты увеличения волатильности. Так что перестал использовать. Но я продолжаю использовать математические методы. Они работают. 
avatar
SciFi, А пробовали строить модели авторегрессии по нескольким взаимосвязанным инструментам? Не ARIMA с регрессором, как Вы описывали в своем блоге, а vector autoregression (VAR). Может быть там ошибка предсказания будет меньше?
avatar
RomSunZ, пробовал, в одной из статей я писал про связь между Brent и RTS. Но между этими инструментами нет постоянной коинтеграции — только локальная, поэтому тоже не работает при увеличении волатильности. А в парах инструментов, где есть хорошая коинтеграция, все неэффективности уже устранены, там можно пытаться ловить копейки, но комиссия не окупится. 
avatar
SergeyJu, Во всей этой статье больше всего понравились ваши комментарии на самом деле… :)
Илья Гаврилов, спасибо
avatar
Для тех, кто мало что тут понял (как я) книга «Forecasting: principles and practice».
www.otexts.org/fpp

Table of contents

Forecasting: principles and practice
Getting started
The forecaster's toolbox
Judgmental forecasts
Simple regression
Multiple regression
Time series decomposition
Exponential smoothing
ARIMA models
Advanced forecasting methods
Data
Using R
Resources
Reviews

avatar

теги блога SciFi

....все тэги



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