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

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

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