HackIT-2017 - Форум по кибербезопасности - защити свой код, проект, бизнес. Харьков, 23 сентября
×Закрыть

Прогнозирование временных рядов с помощью Prophet от Facebook

Прогнозирование временных рядов — это весьма популярная аналитическая задача. Для прогнозирования временных рядов в Python используют такие подходы, как ARIMA, ARCH и т. д. Но подбор параметров для ARIMA — сложный и трудоемкий процесс. Однако 23-го февраля 2017 года команда Core Data Science из Facebook выпустила новую библиотеку для работы с временными рядами — Prophet. Попробуем применить новую библиотеку и посмотрим на удобство в использовании и качество предсказания.

Будем прогнозировать колебания котировки валюты для пары UAH/USD. Prophet предоставляет API для Python и R, я использую Python. Установку необходимых библиотек произведем с помощью пакетного менеджера Сonda. Для анализа будем использовать данные за период 01.02.2012 / 05.09.2017.

Целевой переменной возьмем цену закрытия (Adj Close). Посмотрим, как выглядят исходные данные:

Подготовка исходных данных

На графике есть ряд «пиков», которые не относятся к сезонным колебаниям. В контексте текущей задачи — это выбросы. В соответствии с документацией, лучшее решение — удалить выбросы. Библиотека автоматически обработает пропущенные значения.

Праздники

Prophet позволяет указать отдельно даты, на которые выпадают праздники. Модель учтет это в предсказании. Также можно регулировать степень влияния праздников — holidays_prior_scale, что очень удобно, если модель переобучилась.

Построение прогноза

Интерфейс библиотеки полностью соответствует популярной библиотеке машинного обучения scikit-learn: создаем модель, обучаем ее с помощью метода .fit(), строим предсказание .predict(). Для обучения нужно передать DataFrame с колонками:

  • ds — время, формат поля должен быть datetime;
  • y — целевая переменная в числовом формате.

Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).

Оценка качества модели

Для оценки качества предсказаний отделим период в последние 60 дней. Построим модель, обучим и сделаем прогноз:

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(train_df);
 
future = m.make_future_dataframe(periods=60)
forecast_test = m.predict(future)

Оценивать будем среднеквадратичную и среднюю абсолютную ошибки:

Mean squared error: 1.0407109491747677
Mean absolute error: 0.9977340371358951

Похоже, что модель работает весьма неплохо. Обучим модель на полной выборке и построим прогноз на следующие 4 месяца.

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(predict_df);
 
future = m.make_future_dataframe(periods=120)
forecast = m.predict(future)

Прогноз

В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:

  • ds — временная метка для прогнозируемого значения;
  • yhat— прогнозируемое значение;
  • yhat_lower — нижняя граница прогноза;
  • yhat_upper — высшая граница прогноза.

Визуализация

Библиотека из коробки предоставляет удобные методы визуализации. Первый метод Prophet.plot отображает график прогноза:

Модель неплохо аппроксимирует исторические данные.

Второй метод Prophet.plot_components позволяет визуализировать отдельные компоненты: тренд, праздники, годовую и недельную сезонность:

Наиболее интересным оказался график годовой сезонности. Максимальные пики попадают на февраль и март — наиболее «депрессивные» месяцы. Следующий пик аж в сентябре — школьники и студенты возвращаются с каникул. Следующий пик в начале октября — начало отопительного сезона.

Посмотрим на прогноз более подробно:

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

Выводы

  • Библиотека Prophet — удобный инструмент для прогнозирования временных рядов. Модель работает достаточно хорошо из коробки, при этом есть набор гиперпараметров, которые позволяют улучшить прогноз.
  • Отдельно стоит отметить встроенные возможности визуализации.
  • Из минусов — проект молодой, возможны какие-то неточности в работе. Неполная документация.
  • Задача прогнозировать колебания валюты — сложная. Особенно для украинской валюты в данный период времени.
  • Prophet хорошо аппроксимирует обучающую выборку. Стоит отметить и разумно выделенную годовую сезонность.
  • Полученные предсказания можно использовать как новый признак для других алгоритмов машинного обучения.

Ссылка на полный код — github.com/...​luctuation_currency_quote.

Пишите возможные идеи улучшения прогноза. Было бы интересно послушать отзывы о Prophet тех, кто пытался применить в реальных проектах.

51 комментарий

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

мастерФорекс- 5 хороший ресурс по курсам валют: там правда для трейдеров, но все теории там в одном месте в книжке: Этот ресурс кстати очень не любят биржевые кухни.
www.masterforex-v.org/mf_books/book2.html
Вам скорее всего ближе будет волновой анализ Эллиота.
А вообще прогнозирование дело неблагодарное)

Но подбор параметров для ARIMA — сложный и трудоемкий процесс.

В R испокон веков имеется функция auto.arima() для автоматического подбора параметров.
Другое дело, что ARIMA — далеко не вездесущая и не единственная модель.
А вот подбор модели — действительно сложный и трудоемкий процес.
Универсальных рецептов тут нет, но полезно посмотреть на QQ-Plot residuals.
Вот пример модели, которую я сделал для DayAhead цены природного газа на немецком рынке
yetanotherquant.com/fig5b.pdf
Кстати, таки ARIMA, только вот (нормально распределенные) residuals пришлось полностью заменить кое-чем более адекватным.

Будем прогнозировать колебания котировки валюты для пары UAH/USD

Ну да, хотите насмешить народ, попробуйте спрогнозировать рынок (особенно валюты).

Ну да, хотите насмешить народ, попробуйте спрогнозировать рынок (особенно валюты).

Легких путей не ищем :) Было интересно опробовать инструмент на сложном примере, а не на очевидном.

Forex — пример как раз несложный, а очень простой. В том смысле, что легко доказать НЕпринимость ARIMA. Как?
Построить график автокорреляции, вот такой: letyourmoneygrow.com/...​sOf_VTI_VXUS_BND_BNDX.png
В R это делается функцией acf()
Наверняка значения автокорреляции будут внутри пунктирных линий, что означает их статистическую НЕзначимость.

На самом деле неправильное применение моделей порой хуже отсутствия таковых.
Тот же финансовый кризис случился в т.ч. потому, что модели расчет рисков (между прочим, предписанные, или как минимум, одобренные регуляторами) были совершенно неадекватны реальности. Как говорится — не давайте пилоту альтиметра, и посадит самолет на глаз.
Дайте ему неисправный альтиметр (и предпишите полет по приборам) — все закончится катастрофой.

Как я понял, они просто попробовли инструмент на работает или нет. Инсрумент работает, дальше голова и руки нужны, чтобы пользоваться.

Ну, в общем, да. Работает, как и длинный список других аналогичных методов/пакетов.
Но, как по мне, топик очень важный. Он еще раз подчеркнул, что нет на DOU отдельного раздела для обсуждения задач DS, BD, AI и всего,что вокруг этого — ведь все таки это не программирование в традиционном понимании. А люди, которым это интересно — есть.
А может — даже не раздела, а отдельного форума, которого на просторах русскоязычного интернет тоже вроде — хотя это и очень странно — нет.

dou — это просто поболтать не о чем ... когда начинаешь искать чтото на русском к примеру чтобы лучьше понять материал — хабр помогает куда больше

Ну, в области по крейней мере DS хабр — это тоже на уровне журнала «Знание — сила»

Ну на Хабре есть плюс, там можно почитать о какой новой теме для тебя в варианте на пальцах.
За это мне некоторые посты там нравятся.
А с глубоким раскапыванием темы — это уже в толстые книжки и статьи.

нет на DOU отдельного раздела для обсуждения задач DS

Тут просто нет достаточного количества людей для комьюнити.
Так что даже если и сделают, то он сам помрет.
Вот тут один чел сделал пару дайджестов в этой области, большое спасибо ему, и всё, кончился запал.

Ну так вносите свой вклад в развитие комьюнити ;) Будут обсуждения на форуме, будут статьи — сообщество будет развиваться.

Мне хватило уже выше крыши разговора о мультипоточности.

А что в том разговоре было не так. Больше 400 сообщений было в теме -это очень неплохо для тем не о политике и не о отношениях полов.

Из них 80% снобизма и 20% с полезной инфой и техническими спорами.

Вы только что просто- напросто очередной раз подтвердили закон Парето.

Кстати, вопрос к комьюнити.
Как то странно сложилось. Да, есть Хабр — для легкого старта. Умные и толстые книги — для «прочного фундамента», Сайты и блоги — «для рука на пульсе». Но есть еще потребность в текущем обмене информацией, вопросов, обсуждений, дискуссий.
Конечно есть Steckoverflow. Знаю активный немецкий форум. А в русскоязычном сегменте? Ну, есть один форум медстатистиков — но там, в силу их задач, в основном гипотезы, регрессия да АNOVA. Ну, есть dxdy — полуживой форум по чистой статистике. И пожалуй все.
Не верю я, что люди в этой теме не ощущают потребности в живом общении. Может, кто «знает места» — поделитесь ссылочками?

Боюсь, что таких мест нет на местных языках. Специалистов, причем средней паршивости на пальцах рук пересчитать можно (гипербола).
У нас нет ни ВУЗов с приличной подготовкой по этому профилю, ни научных групп, ни соответственно публикаций и толковых защит. По сути есть две с половиной конторы. Где иногда требуются специалисты этого профиля, причем часто хотят за 3 копейки кого уровня Эндрю Нг или Тони Робинсона.

кому интересно есть весьма активное и немаленькое DataScience / DataAnalysis — коммюнити в slack — opendatascience.slack.com там про трейдинг отдельная ветка

Какое-то уж больно секретное сообщество. Редко нынче найдешь таких форумов, что для захода на них требуется «Contact the team administrator for an invitation». Т.е. даже для того, что-бы посмотреть, что там такое, надо поучать высочайшее разрешение.
Ну и вообще, замечу по ходу. Тут не про «трейдинг». Тут несколько про другое речь.

Стаття цікава, але прогноз ні. Власне — восени завши долар росте. В Україні — це багаторічна тенденція.

Те що прогноз підверджує наші спостереження, каже о гарній якості прогнозу :)
Тобто можно використовувати бібліотеку для аналізу інших даних с тенденціями яких ми не знайомі, чи використовувати в атоматичних системах.

вдохновились статьей на хабре? очень они похожи между собой

Да, читал статью на хабре :) инструмент показался интересным и решил опробовать на чем-то сложном)

Надеюсь этот пакет может больше, чем рисовать «веник» в конце тренда ))

Ну, ахи и охи от желающих заработать на Форесксе малость поутихли. Теперь впору начать задавть вопросы профессиональные.
Итак — очередная библиотека для

ARIMA, ARCH и т. д.
. Вопрос — проводили ли Вы сравнение этой б-ки с другими библиотеками для решения задач это класса (коих десятки если не сотни)? Если да, то что показал этот анализ. Почему Ваш выбор пал именно на этот проект?
И еще — «идеи» на счет «улучшения прогноза» . Простите, Вы это серьезно?

Давайте попорядку :)

Я не проводил сравнения с другими библиотеками. Но в публикации Sean J. Taylor, Benjamin Letham Forecasting at scale (где подробно описан принцип работы библиотеки) приводится график сравнение mean absolute percentage error для существующих подходов прогнозирования временных рядов, согласно которому Prophet имеет существенно более низкую ошибку.

Про выбор проекта. Для Python существующие решения требуют приличных затраты времени и усилий для настройки модели и подбора гиперпараметров. При этом качество результат остается под вопросом. Prophet работает достаточно хорошо «из коробки», о чем сами разработчики и пишут у себя в блоге. То есть, можно оперативно получить baseline решение.

По поводу «идей» :) Я предполагал, что возможно кто-то уже использовал библиотеку и поделится практическими советами по настройки и улучшению модели.

Ссылка на статью у Вас какая-то странная :-), подправьте.
Без нее непонятно, что за методы на графике — «mean» (?), "naive«(?) - про эти можно хоть предположить «що воно таке»), «ets» (??) - про это даже не могу представить себе, а далее — «arima» и «prophet» — т.е. они как бы противопоставляются между собой, в то время как Вы написали что prophet использует ARIMA. А это — классика. Поэтому не совсем ясно, как пакет, который реализует метод, может обеспечить более низкую ошибку, чем сам метод. (Кстати, серьезно про горизонт предсказания 120 тиков — улыбнуло).
Не знаю, как для Python, так как я для задач DS предпочитаю R, но про «приличные затраты» при работе с традиционными методами анализа временных рядов я бы говорил с осторожностью. Ну, например, добавляя «для новичков», или «для форекс-трейдеров» :-)
Про идею — упокоили. Я уж заволновался, что ищите «подельников» на "выиграть бешеные деньги на паре "USD/UAH«.:-) А если идея — как улучшить ARIMA, то это тема весьма перспективна и интересна, но, все таки, не для этого форума.
В целом, за «наводку» на очередной пакет — спасибо. При случае — надо будет глянуть.

А как она работает на процессах, которые действительно можно спрогнозировать?

Все очень зависит от данных, которые надо предсказать. Чем больше влияние несезонных факторов (рекламная компания, появление конкурентов, технический сбой и т.д.), тем хуже будет работать любая модель по предсказанию временных рядов.

Преимущество Prophet в том, что библиотека хорошо работает из коробки. Вы можете быстро обучить модель, оценить качество прогноза и визуализировать компоненты.

Даниил, давайте объединим усилия, у нас есть данные за два года :-)
dou.ua/...​u-projector-hryvna-today

Давайте обсудим :) отписал в личку

Ох лень читать, скажите стоит бакс сейчас покупать или опять упадет на пару копеек на следующий день?

Очень интересно, спасибо за статью.

В смысле показателей качества модели было бы интересно увидеть прогноз, например, на первый квартал 2016 года, составленный по данным до конца 2015 года. Все же последние 60 дней сравнительно стабильны )))

Я писал в статье, да и в комментариях упоминали, что валютная пара — не самый лучший пример для анализа временных рядов. Не ждите слишком многого от модели :) То что удалось получить интерпретируемые сезонные циклы для колебания валюты — уже очень хорошо)

Є питання від чайника в даній темі:
Якщо мені потрібен короткочасний прогноз до 5 значень (y_t+1, ..., y_t+5) — можливо краще використати лінійну регресію?

Чи має цiльова змінна лiнiйну залежнiсть у часi? (Трошки гумору)

Спробуйте розкласти дату на складовi — рiк (якщо достатьно даних), мiсяць, день тижня, день мiсяця, час (якщо пiдходить). Застосуйте OneHotEncoder. Додайте iншi властивостi, якщо є такi. А далi використовуйте RandomForestRegressor.

Якщо маєте достатьно часу спробуйте Prophet i поділіться результатами ;)

Уже заработали кучу бабла на форексе?

Ага. Потому выбор валютных пар в качестве примера, имхо, не особо удачен

При помощи прогнозов по регрессии направленной торговлей не занимаются. Если модельговорит, что через месяц цена будет ± от текущей, то все-таки продавать или покупать, кэп? Регрессию используют для продажи опционов. И базовый инструмент ни при чем (нет, конечно, есть особенности: фарма, или валюты, или сырье, но в целом — простая математика с учетом длинных хвостов)

Ну почему же, попытки были, но прогнозы на отрицательной корреляции — дело такое.

Подскажи, для направленой торговли, какие есть основные подходы?

То, что работало у меня всегда (и на укр и на амер рынках) — это скальпинг (и как разновидность — торговля от уровня). И подозреваю, что подавляющее большинство квантов заняты анализом ленты и стакана.
Также паттерны достаточно хорошо воспроизводятся в pump&dump.
Потом идет арбитраж волатильности в опционах.
Прочие фундаменталы, вайкофвы и свинги какое-то время работают, потом не работают, потом опять работают...

Ок, а болинджер .. сам подход когда применяют квадратное отклонение?

Как «встретить динозавра». Болинжер _по_факту_ рисует каналы исторического статистического отклонения. Но направление выбирает рынок. Нет физического барьера на уровне 2с. Там не увеличивается стоимость удержания актива: ни маржинальные требования: нет там дневного лимита. Кто-то _сегодня_, _утром_ покупает от 30 и перестает покупать от 50. Это одному покупателю известно, почему сегодня такие уровни. Болинжер это нарисует. Продлятся ли закупки на 30 еще час или два, он не скажет. Когда в следующий раз на 50 больше не останется тех, кто шортал от верхней границы, пробьют 50 и улетят.

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

тут есть доступные лекции о алгоритмической торговле и платформа для анализа на рынке акций США и фьючерсов www.quantopian.com/lectures

Ага, сам заработал. Теперь решил остальным рассказать как ;)

На всяк для людей без чувства юмора тут будет закадровый смех:
[гг][applause]

Подписаться на комментарии