SciFi
SciFi личный блог
08 июня 2016, 12:48

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

Решил копнуть чуть глубже в 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
58 Комментариев
  • SergeyJu
    08 июня 2016, 14:33
    Если ограничиться AR моделью, Вы получите гораздо более эффективную с вычислительной точки зрения модель. Де-факто, МНК с обращением матрицы специального вида.
    Но, если честно, я не очень верю в примитивное предсказание цены. На моей памяти, даже использование продвинутой ARFIMA с использованием CUDA для численного решения не показало ничего, пригодного для торговли. Правда, реализация была не моя, а моего знакомого, тонкостей я не знаю, и не поручусь, что он выжал из темы все, что возможно. 
    • SergeyJu, не совсем так. Если реальная модель содержит MA-часть, то AR-часть в чисто авторегрессионной модели будет стремиться к бесконечности, т.е. AIC/AICc будут всё время уменьшаться с ростом порядка модели. При этом качество оценки коэффициентов будет ухудшаться с ростом порядка модели.
      • SergeyJu
        08 июня 2016, 16:32
        Бобровский Дмитрий, теоретически Вы правы, конечно. 
        НО!
        Правильная постановка вопроса не «если модель содержит», а «какая модель лучше подходит». 
        Это как в вопросе с ФНЧ. Можно проектировать фильтр с идеальной АЧХ, или с минимальной задержкой или еще как. Но по факту лично моих исследований, простая ЕМА оказывается в моих системах лучше и продвинутых КИХ и продвинутых БИХ. фильтров. И медианных фильтров, и прямой оценки производной численными методами.
        Жизнь как бы мне намекает, сложность не окупается.  Возможно, у Вас и не так.
        • SergeyJu, да, зачастую модели порядка 4-5 чисто в AR-коэффициентах оказывается достаточно для более-менее хорошего описания даже ARMA-модели. Плюс у AR-подхода есть одно сравнительное преимущество — AR-GARCH модель можно фитить 2-хшаговым методом — сначала оценить порядок AR-части, потом уже порядок GARCH-части, при этом оценки будут вполне себе корректными. Для чисто ARMA подхода это не так. Но есть и минус — если модель «околообратимая» (корни MA-части лежат близко к единичному кругу), то для более-менее адекватной модели чисто на AR понадобится туева хуча коэффициентов.
          • SergeyJu
            08 июня 2016, 16:49
            Бобровский Дмитрий, чисто по физическому смыслу, а там должны быть корни близкие по модулю к 1?
            • SergeyJu, могут быть оные. В качестве примера можно привести КИХ-фильтр на 2 точки с h_{1} = 1, h_{0} = 0.95 и белым шумом на входе. Как-то так. 

              • SergeyJu
                08 июня 2016, 17:06
                Бобровский Дмитрий, не слишком ли хорошо будет прогнозируем такой ряд? Наши ряды все же плохо прогнозируемые.
                • SergeyJu, такой, кстати, не очень будет, откровенно говоря. Вообще MA-ряды не айс в прогнозировании.
                  • SergeyJu
                    08 июня 2016, 19:51
                    Бобровский Дмитрий, на следующем шаге Вы легко предсказываете практически половину дисперсии нового отсчета. Это гораздо больше, чем получается на ценовых рядах.
                    • SergeyJu, тут полностью согласен. Интервальные оценки получаются шикарными. Точечные не очень…
  • Евгений Черных
    08 июня 2016, 14:37
    Предсказания? Нюню…
    • kbrobot.ru, ну прогнозирования, прогнозирования.))) Правда, он ещё зелёный, не знает, что точечные прогнозы весьма и весьма условная вещь. )) Нужно смотреть распределение прогноза на шаге t+1, использовать точечный прогноз как некоторую оценку отклонения от цены на шаге t, а дальше хотя бы тот же VaR использовать для оценки дохода.)))
  • Максим Андреев
    08 июня 2016, 15:38
    Интересная тема кстати с АРИМОЙ, сам думал с этого начинать, потом рукой махнул, вроде еще более совершенные модели есть arch/garch, хотя в них уже не вникал. Тема реально интересная, думаю, если вы хороший спец, стоит в этом направлении покапать и потестировать 
    • SergeyJu
      08 июня 2016, 15:56
      Максим Андреев, а кто Вам сказал, что эти модели более совершенные и в каком смысле? 
      Модели могут иметь больше или меньше параметров, лучше или хуже соответствовать конкретной задаче. 
      Качество модели безотносительно области применения оценить практически невозможно.
      • Максим Андреев
        08 июня 2016, 16:01
        SergeyJu, в какой-то книжечке прочитал, про прогнозирование временных рядов,  якобы, эти модели более точно описывают ряд, и специально их для прогнозов финансовых показателей используют с их большОй волатильностью 
        • SergeyJu
          08 июня 2016, 16:13
          Максим Андреев, автор книжки уже миллиардер?
          • Максим Андреев
            08 июня 2016, 16:16
            SergeyJu, автор книжки профессор и зав кафедрой какого-то ВУЗА СПб, так что думаю не до фондовых рынков  ему)
            • SergeyJu
              08 июня 2016, 16:22
              Максим Андреев, те, кто не пытался реально торговать алгоритмы на рынке, обычно не понимают специфики проблем. 
      • Максим Андреев
        08 июня 2016, 16:06
        SergeyJu, кстати, полагаю, что если применить модель к более старшим фреймам, точность модели должна возрасти, дневка или 4н думаю идеально бы подошли, а может сразу 2 фрейма или 3, допустим, дневка, 4н и 15м, и как прогноз по всем рядам будет совпадать, так и вставать в позицию. 
        • SergeyJu
          08 июня 2016, 16:12
          Максим Андреев, зачем думать, трясти надо :)
          Попробуйте, авось что и выйдет. Чисто идеологически, все, что работает в предположении стационарности ряда, или стационарности с точностью до одного оцениваемого и медленно меняющегося параметра, на ценовых рядах работать должно плохо. Наши ряды более зашумлены и менее стационарны, чем то, с чем обычно имеют дело в технике.
          • Максим Андреев
            08 июня 2016, 16:13
            SergeyJu, не силен я в программировании, поэтому быстро отошел от этого, но, более умному человеку стоит этим заняться) 
            • SergeyJu
              08 июня 2016, 16:16
              Максим Андреев, более профессионально подготовленному, наверное. Вот Карл Маркс, наверняка был очень умный, а программировать не умел :)
              • IliaM
                08 июня 2016, 16:30
                SergeyJu, говорят не очень. И имел такой плохой почерк что с работы выгнали, а жил за счет жены. Такой вот он Карл Маркс.
                • SergeyJu
                  08 июня 2016, 16:34
                  IliaM, я его много читал. Поверьте, производит впечатление чрезвычайно умного человека.
                  • IliaM
                    08 июня 2016, 16:45
                    SergeyJu, у меня сосед-алкаш такое же впечатление производил. А в библии сказано что судить о человек по делам его надо.
                    • SergeyJu
                      08 июня 2016, 16:52
                      IliaM, дела Маркса всем известны, и его книги в том числе — дела. Ваш сосед-алкаш, похоже, слишком сильно ограничил Ваш кругозор.
                      • IliaM
                        08 июня 2016, 17:21
                        SergeyJu, вот я Вам и говорю — жиголо и бумагомарака он был. Вот и все его дела.
                        • SergeyJu
                          08 июня 2016, 17:24
                          IliaM, а я знаю, что Ваш взгляд поверхностный и глупый. 
                          • IliaM
                            08 июня 2016, 17:25
                            SergeyJu, ааааа понятно
          • SergeyJu, рекомендую погуглить «локально-стационарные процессы». У Nason'а на вейвлетах есть соответствующие библиотеки по оценке.
            • SergeyJu
              08 июня 2016, 16:38
              Бобровский Дмитрий, читал кое что об этом. Опять же, по моим личным впечатлениям, гипотеза стационарности мне не нужна даже локально. Наоборот, я бы хотел научиться хоть как-то, хоть чуть-чуть прогнозировать изменение волатильности. 
    • Максим Андреев, нужно копать в сторону ARIMA-GARCH или ARFIMA-GARCH, но тут есть ньюансы выбора ширины окна и типа модели. Маленькое окно даёт плохое качество оценок параметров составляющих модели как AR/MA частей, так и sigma/e частей (для GARCH). Большая ширина окна не учитывает структурные изменения ряда — зарождение локальных трендов или, например, ХевиСайда.
      • SergeyJu
        08 июня 2016, 16:26
        Бобровский Дмитрий, Вы так странно пишете фамилию Хевисайд, это что, какой-то новый термин?
        • 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
          • SergeyJu
            08 июня 2016, 16:39
            Бобровский Дмитрий, С — большое, словно не фамилия, а два корня. 

            • 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
              ))
              • SergeyJu
                08 июня 2016, 16:53
                Бобровский Дмитрий, так лучше. Вы имели в виду, я так понимаю, даже не функцию Хевисайда, а смену режима?
                • SergeyJu, да. Просто функция Хевисайда — один из примеров структурного изменения ряда.
                  • SergeyJu
                    08 июня 2016, 17:03
                    Бобровский Дмитрий, вот. Задача обнаружения разладки (смены режима), в известном смысле ближе к нашей проблематике, чем задача прогнозирования ряда. 

                    • SergeyJu, тут есть ряд интересных наблюдений у меня, например. Вообще — да, и задача поиска структурных изменений весьма интересна и сложна. Но если посмотреть на длинные ряды данных рынка, то можно с некоторым приближением говорить о стационарности на достаточно большом промежутке времени. Я как раз об этом писал — локально стационарные ряды.
                      • SergeyJu
                        08 июня 2016, 17:09
                        Бобровский Дмитрий, Вы явно используете эту гипотезу, она дает Вам, как принято говорить, альфу?
  • IliaM
    08 июня 2016, 16:32
     А сделки то вручную вводили? Т.е. каждую минуту пересчет и ручной ввод?
      • IliaM
        08 июня 2016, 18:16
        SciFi, так-то 100р/минута — хорошо. Но в таком варианте — жесть будет
  •  Автор, 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)

  • Можно просто взять сразу готовую модель, которая даётся в auto.arima. Для неё использовать predict (вроде так называется эта функция в пакете). 
      • SergeyJu
        08 июня 2016, 18:21
        SciFi, информируйте народ по мере получения нового материала. Некоторым аутсайдерам, как выяснилось, это интересно :)
          • RomSunZ
            21 ноября 2016, 09:17
            SciFi, поделитесь, если не секрет, продолжаете использовать эту тему в торговле, или уже нет? Сам наткнулся на модели авторегрессии в контексте расчета лага при расчете коинтеграции для торговли корзинами, и поэтому хочу понять имеет ли смысл тратить время на изучение еще и этой темы.
              • RomSunZ
                24 ноября 2016, 09:39
                SciFi, А пробовали строить модели авторегрессии по нескольким взаимосвязанным инструментам? Не ARIMA с регрессором, как Вы описывали в своем блоге, а vector autoregression (VAR). Может быть там ошибка предсказания будет меньше?
        • Илья Гаврилов
          10 июня 2016, 05:45
          SergeyJu, Во всей этой статье больше всего понравились ваши комментарии на самом деле… :)
          • SergeyJu
            14 июня 2016, 13:07
            Илья Гаврилов, спасибо
  • trump-card
    10 июня 2016, 20:06
    Для тех, кто мало что тут понял (как я) книга «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

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

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