Time Series Forecast Indicator

Best Binary Options Brokers 2020:
  • Binarium

    Top Binary Options Broker 2020!
    Perfect For Beginners and Middle-Leveled Traders!
    Free Education How To Trade!
    Free Demo Account!
    Big Sign-up Bonus!

  • Binomo

    Good Choice For Experienced Traders!


Time Series Forecast Indicator

Should I buy today? What will prices be tomorrow, next week, or next year? Wouldn’t investing be easy if we knew the answers to these seemingly simple questions? Alas, if you are reading this book in the hope that technical analysis has the answers to these questions, I’m afraid I have to disappoint you early–it doesn’t. However, if you are reading this book with the hope that technical analysis will improve your investing, I have good news–it will!

The term “technical analysis” is a complicated sounding name for a very basic approach to investing. Simply put, technical analysis is the study of prices, with charts being the primary tool.

The roots of modern-day technical analysis stem from the Dow Theory, developed around 1900 by Charles Dow. Stemming either directly or indirectly from the Dow Theory, these roots include such principles as the trending nature of prices, prices discounting all known information, confirmation and divergence, volume mirroring changes in price, and support/resistance. And of course, the widely followed Dow Jones Industrial Average is a direct offspring of the Dow Theory.

Charles Dow’s contribution to modern-day technical analysis cannot be understated. His focus on the basics of security price movement gave rise to a completely new method of analyzing the markets.

The human element

The price of a security represents a consensus. It is the price at which one person agrees to buy and another agrees to sell. The price at which an investor is willing to buy or sell depends primarily on his expectations. If he expects the security’s price to rise, he will buy it; if the investor expects the price to fall, he will sell it. These simple statements are the cause of a major challenge in forecasting security prices, because they refer to human expectations. As we all know firsthand, humans are not easily quantifiable nor predictable. This fact alone will keep any mechanical trading system from working consistently.

Because humans are involved, I am sure that much of the world’s investment decisions are based on irrelevant criteria. Our relationships with our family, our neighbors, our employer, the traffic, our income, and our previous success and failures, all influence our confidence, expectations, and decisions.

Security prices are determined by money managers and home managers, students and strikers, doctors and dog catchers, lawyers and landscapers, and the wealthy and the wanting. This breadth of market participants guarantees an element of unpredictability and excitement.

If we were all totally logical and could separate our emotions from our investment decisions, then, fundamental analysis the determination of price based on future earnings, would work magnificently. And since we would all have the same completely logical expectations, prices would only change when quarterly reports or relevant news was released. Investors would seek “overlooked” fundamental data in an effort to find undervalued securities.

The hotly debated “efficient market theory” states that security prices represent everything that is known about the security at a given moment. This theory concludes that it is impossible to forecast prices, since prices already reflect everything that is currently known about the security.

The future can be found in the past

If prices are based on investor expectations, then knowing what a security should sell for (i.e., fundamental analysis) becomes less important than knowing what other investors expect it to sell for. That’s not to say that knowing what a security should sell for isn’t important–it is. But there is usually a fairly strong consensus of a stock’s future earnings that the average investor cannot disprove.

Best Binary Options Brokers 2020:
  • Binarium

    Top Binary Options Broker 2020!
    Perfect For Beginners and Middle-Leveled Traders!
    Free Education How To Trade!
    Free Demo Account!
    Big Sign-up Bonus!

  • Binomo

    Good Choice For Experienced Traders!

“I believe the future is only the past again, entered through another gate.”
—Sir Arthur Wing Pinero, 1893

Technical analysis is the process of analyzing a security’s historical prices in an effort to determine probable future prices. This is done by comparing current price action (i.e., current expectations) with comparable historical price action to predict a reasonable outcome. The devout technician might define this process as the fact that history repeats itself while others would suffice to say that we should learn from the past.

The roulette wheel

In my experience, only a minority of technicians can consistently and accurately determine future prices. However, even if you are unable to accurately forecast prices, technical analysis can be used to consistently reduce your risks and improve your profits.

The best analogy I can find on how technical analysis can improve your investing is a roulette wheel. I use this analogy with reservation, as gamblers have very little control when compared to investors (although considering the actions of many investors, gambling may be a very appropriate analogy).

“There are two times in a man’s life when he should not speculate: when he can’t afford it, and when he can.”
—Mark Twain, 1897

A casino makes money on a roulette wheel, not by knowing what number will come up next, but by slightly improving their odds with the addition of a “0” and “00.”

Similarly, when an investor purchases a security, he doesn’t know that its price will rise. But if he buys a stock when it is in a rising trend, after a minor sell off, and when interest rates are falling, he will have improved his odds of making a profit. That’s not gambling–it’s intelligence. Yet many investors buy securities without attempting to control the odds.

Contrary to popular belief, you do not need to know what a security’s price will be in the future to make money. Your goal should simply be to improve the odds of making profitable trades. Even if your analysis is as simple as determining the long-, intermediate-, and short-term trends of the security, you will have gained an edge that you would not have without technical analysis.

Consider the chart of Merck in Figure 1 where the trend is obviously down and there is no sign of a reversal. While the company may have great earnings prospects and fundamentals, it just doesn’t make sense to buy the security until there is some technical evidence in the price that this trend is changing.

If we accept the fact that human emotions and expectations play a role in security pricing, we should also admit that our emotions play a role in our decision making. Many investors try to remove their emotions from their investing by using computers to make decisions for them. The concept of a “HAL,” the intelligent computer in the movie 2001, is appealing.

Mechanical trading systems can help us remove our emotions from our decisions. Computer testing is also useful to determine what has happened historically under various conditions and to help us optimize our trading techniques. Yet since we are analyzing a less than logical subject (human emotions and expectations), we must be careful that our mechanical systems don’t mislead us into thinking that we are analyzing a logical entity.

That is not to say that computers aren’t wonderful technical analysis tools–they are indispensable. In my totally biased opinion, technical analysis software has done more to level the playing field for the average investor than any other non-regulatory event. But as a provider of technical analysis tools, I caution you not to let the software lull you into believing markets are as logical and predictable as the computer you use to analyze them.

Индикатор Time Freezer — точный и простой прогноз цены

Кто из вас не мечтал иметь идеальный предсказатель цены? Один индикатор, который практически без ошибок предсказывает результат еще не совершенной сделки. Сегодня мы рассмотрим индикатор Time Freezer, предсказывающий направление движения цены с помощью рядов Фурье. Автором были сделаны некоторые изменения в оригинальном коде индикатора, что делает этот продукт вдвойне уникальным. В любом случае, можно смело заявлять, что это первое по-настоящему доступное применение рядов Фурье для рынка бинарных опционов.

Что дает индикатор ? Простой и понятный прогноз для открытия опциона.

Характеристики индикатора

Платформа: MetaTrader 4
Валютные пары: Любые
Таймфрейм: Любой
Экспирация опциона: Зависит от таймфрейма
Время торговли: Круглосуточно
Рекомендуемые брокеры: GrandCapital, Alpari


Индикатор устанавливается в MT4 по стандартной инструкции. Если ваш брокер не поддерживает торговлю из MT4, то следуйте инструкциям тут.

Принцип работы

Индикатор Time Freezer воспринимает поведение цены как сумму ее составляющих: волновых, шумовых и трендовых. То есть, алгоритм анализа временного ряда по Фурье заключается в разделении входных данных на сумму синусоид с разными длинами циклов. Длина каждого из циклов, в этом случае, является частью главного цикла. Это первый индикатор, применяющий данную модель в торговле бинарными опционами.

Для применения рыночных циклов в будущем необходимо получить амплитуду, период колебаний и вычислить свойства, присущие данным характеристикам спектра. Для этой цели применяются методы спектрального (или гармонического) анализа. Индикатор проводит спектральный анализ индикатора WPR (Процентный Диапазон Вильямса), и с помощью ряда Фурье экстраполирует эти значения в будущее. Частоты вычисляются с помощью алгоритма Куин-Фернандеса. Алгоритм производит фиттинг каждой гармоники (компонентов ряда Фурье), пока не будет обработано n-е количество гармоник. Фиттинг, в данном случае, отвечает за определение значений сдвига, коэффициентов и частот гармоник. Нахождение частотных характеристик является наиболее сложной частью фиттинга в данной тригонометрической модели.

Осциллятор Вильямса был выбран не случайно. Данный индикатор обладает интересной особенностью предугадывать разворот цены на ее пиках. Главным сигналом для подобного рода индикаторов служит выход из зоны перекупленности или перепроданности. Так как оригинальный индикатор дает отрицательные значения, перед использованием массив значений нормализуется относительно нуля. Ноль – ключевой уровень в данной системе, так как именно в отношении нуля будет определяться направление прогноза. Экстраполируя значение индикатора в будущее, мы, в теории, можем узнать о развороте цены еще до того, как сам индикатор его обнаружит. За оценочное количество прогноза отвечает процент вероятности – это всего лишь численная оценка соответствия прошлого ряда WPR к реальной ситуации на рынке.

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

По сути, форвард-период – это единственный настраиваемый параметр, влияющий на итоговый график прогноза. Этот же параметр отвечает за срок экспирации. Именно поэтому, к выбору форвард-периода нужно подойти со всей серьезностью. Главная задача – попасть в ритм рынка. При этом, нужно, чтобы выбранная частота дискретизации не была слишком низкой и позволяла увидеть неэффективность рынка. Это не означает, что загрузив в индикатор тиковые котировки с 98-го года вы получите идеальные предсказания. Совсем нет, рыночные модели постоянно меняются и видоизменяются, поэтому к выбору периода стоит подходить с немного другой целью – достижения максимальной стационарности ряда. Если этого сделать не получится – качество прогнозирования будет не сильно отличаться от прогнозирования случайных рядов данных.


Осциллятор Вильямса определяет на рынке состояние перекупленности или перепроданности. Действовать по сигналам индикатора лучше всего, дождавшись разворота. Это общее правило для всех индикаторов подобного рода. То есть, что это означает? Если индикатор указывает на то, что рынок находится в состоянии перекупленности – перед покупкой опциона нужно дождаться разворота индикатора в обратном направлении. То же самое справедливо для зоны перепроданности.

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

Чем больше значение вероятности – тем более качественные входы вы получите. Но, при слишком высоком проценте (например 80-90), можно пропустить много хороших входов с вероятностью ниже 80 процентов. С другой стороны, устанавливать значение параметра сильно ниже 70 тоже не стоит. Все-таки индикатор не может гарантировать вам точное соответствие заявленным процентам вероятности, а лишь дает свою оценку рыночной ситуации. Точные результаты будут известны только на большой выборке сделок.

Изменения и новые настройки

Оригинальная разработка (Fourier Extrapolation of Indicator) не нашла четкого применения на валютном рынке форекс. Поэтому, автором было решено немного доработать индикатор для работы на рынке бинарных опционов. Таким образом, в индикаторе были заменены старые настройки и добавлено несколько новых:

ProbabilityLevel – значение от 0 до 100 процентов. Чем больше значение порога вероятности – тем меньше потенциальных сделок, но входы обещают быть качественнее. В данном случае, используется оценка качества прогноза, основанная на подсчете корреляции между прошлым прогнозом и историческими котировками того же периода (по ценам закрытия). Текущий процент вероятности отображается в верхнем левом углу индикатора и загорается синими или красным цветом при появлении сигнала соответствующего направления.

Freeze – ON или OFF. Включает или отключает «замораживание» графика прогноза при получении сигнала на вход в сделку. То есть, индикатор замораживает расчет и ждет истечения срока экспирации. Это помогает сфокусироваться на конкретной сделке и, вместе с тем, наблюдать за ее текущим состоянием прямо из терминала.

ShowTime – включает показ времени на вертикальных метках. Функция добавлена для удобства ориентирования во время покупки опциона.

ExpirationTime – срок экспирации по-умолчанию (в барах). Также, срок экспирации можно изменять прямо на графике, перетаскиванием крайней линии. Выберите объект с пометкой «Время экспирации» и перетащите вправо для увеличения срока экспирации, или влево – для уменьшения. Для удобства, используйте таймфрейм на порядок ниже срока. Это позволит гибко настраивать период так, чтобы тот не выходил за край графика. Увеличение периода также влияет и на длину бэктеста. Чем больше форвард, тем больший отрезок данных анализируется при постройке прогноза.

AlertOn – включение оповещения о сигнале. Используется стандартный алерт MT4, который сообщает о появлении сигнала на покупку CALL или PUT-опциона.

Если вероятность превышает заданный порог, а прогноз показывает четкую направленность (разворот тенденции) – поступает сигнал на покупку опциона. Сигнал приходит в виде штатного алерта MT4. После получения сигнала текущий график замораживается (если включен параметр Freeze), предоставляя вам возможность следить за состоянием сделки из окна графика MT4.

Плюсы и минусы индикатора Time Freezer


  • Предельно простой в понимании индикатор. Не вдаваясь в технические подробности, индикатор прогнозирует направление цены в будущем. Куда идет цена – туда и открываем сделку;
  • Индикатор представляет собой высокоточный цифровой фильтр. Для дополнительного подтверждения прогноза можно также брать во внимание дивергенцию отфильтрованных значений индикатора с ценовым рядом;
  • Индикатор сигнализирует о сделке изменением цвета на графике, и с помощью штатного алерта MT4.


  • Результат сильно зависит от входных данных. На подбор начальных параметров может уйти значительное время;
  • Прогноз может не соответствовать действительности. Чтобы оценить размер погрешности, нужны результаты с большой выборки сделок.

Скачать индикатор Time Freezer


Применение спектрального анализа цен в торговле бинарными опционами – новый и пока еще не до конца изученный раздел. Но сам принцип несет в себе большой потенциал, так как основан на проверенных математических методах. Прелесть алгоритма заключается в том, что его можно с одинаковым успехом использовать как для прогнозирования ценовых движений, так и для фильтрации исторических котировок. Данный индикатор выступает в качестве опровержения неприменимости Фурье к временным рядам. Главное, выбрать подходящий период, в соответствии с ритмом рынка. Если учитывать, что рынок – это не случайные колебание, то наша задача, на самом деле, максимально проста – поймать регулярные колебания рынка и успеть на этом заработать.

Открытый курс машинного обучения. Тема 9. Анализ временных рядов с помощью Python

Доброго дня! Мы продолжаем наш цикл статей открытого курса по машинному обучению и сегодня поговорим о временных рядах.

Посмотрим на то, как с ними работать в Python, какие возможные методы и модели можно использовать для прогнозирования; что такое двойное и тройное экспоненциальное взвешивание; что делать, если стационарность — это не про вас; как построить SARIMA и не умереть; и как прогнозировать xgboost-ом. И всё это будем применять к примеру из суровой реальности.

UPD: теперь курс — на английском языке под брендом mlcourse.ai со статьями на Medium, а материалами — на Kaggle (Dataset) и на GitHub.

Видеозапись лекции по мотивам этой статьи в рамках второго запуска открытого курса (сентябрь-ноябрь 2020).

План этой статьи:

  1. Движемся, сглаживаем и оцениваем
    • Rolling window estimations
    • Экспоненциальное сглаживание, модель Хольта-Винтерса
    • Кросс-валидация на временных рядах, подбор параметров
  2. Эконометрический подход
    • Стационарность, единичные корни
    • Избавляемся от нестационарности и строим SARIMA
  3. Линейные и не очень модели на временных рядах
    • Извлечение признаков (Feature extraction)
    • Линейная регрессия vs XGBoost
  4. Домашнее задание
  5. Полезные ресурсы


На работе я практически ежедневно сталкиваюсь с теми или иными задачами, связанными с временными рядам. Чаще всего возникает вопрос — а что у нас будет происходить с нашими показателями в ближайший день/неделю/месяц/пр. — сколько игроков установят приложения, сколько будет онлайна, как много действий совершат пользователи, и так далее. К задаче прогнозирования можно подходить по-разному, в зависимости от того, какого качества должен быть прогноз, на какой период мы хотим его строить, и, конечно, как долго нужно подбирать и настраивать параметры модели для его получения.

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

Движемся, сглаживаем и оцениваем

Небольшое определение временного ряда:

Временной ряд – это последовательность значений, описывающих протекающий во времени процесс, измеренных в последовательные моменты времени, обычно через равные промежутки

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

Импортируем нужные библиотеки. В основном нам понадобится модуль statsmodels, в котором реализованы многочисленные методы статистического моделирования, в том числе для временных рядов. Для поклонников R, пересевших на питон, он может показаться очень родным, так как поддерживает написание формулировок моделей в стиле ‘Wage

В качестве примера для работы возьмем реальные данные по часовому онлайну игроков в одной из мобильных игрушек:

Rolling window estimations

Начнем моделирование с наивного предположения — “завтра будет, как вчера”, но вместо модели вида будем считать, что будущее значение переменной зависит от среднего её предыдущих значений, а значит, воспользуемся скользящей средней.

Реализуем эту же функцию в питоне и посмотрим на прогноз, построенный по последнему наблюдаемому дню (24 часа)

К сожалению, такой прогноз долгосрочным сделать не удастся — для получения предсказания на шаг вперед предыдущее значение должно быть фактически наблюдаемой величиной. Зато у скользящей средней есть другое применение — сглаживание исходного ряда для выявления трендов. В пандасе есть готовая реализация — DataFrame.rolling(window).mean() . Чем больше зададим ширину интервала — тем более сглаженным окажется тренд. В случае, если данные сильно зашумлены, что особенно часто встречается, например, в финансовых показателях, такая процедура может помочь с определением общих паттернов.

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

Модификацией простой скользящей средней является взвешенная средняя, внутри которой наблюдениям придаются различные веса, в сумме дающие единицу, при этом обычно последним наблюдениям присваивается больший вес.

Экспоненциальное сглаживание, модель Хольта-Винтерса

Простое экспоненциальное сглаживание

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

Здесь модельное значение представляет собой средневзвешенную между текущим истинным и предыдущим модельным значениями. Вес называется сглаживающим фактором. Он определяет, как быстро мы будем “забывать” последнее доступное истинное наблюдение. Чем меньше , тем больше влияния оказывают предыдущие модельные значения, и тем сильнее сглаживается ряд.

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

Двойное экспоненциальное сглаживание

До сих пор мы могли получить от наших методов в лучшем случае прогноз лишь на одну точку вперёд (и ещё красиво сгладить ряд), это здорово, но недостаточно, поэтому переходим к расширению экспоненциального сглаживания, которое позволит строить прогноз сразу на две точки вперед (и тоже красиво сглаживать ряд).

В этом нам поможет разбиение ряда на две составляющие — уровень (level, intercept) и тренд (trend, slope). Уровень, или ожидаемое значение ряда, мы предсказывали при помощи предыдущих методов, а теперь такое же экспоненциальное сглаживание применим к тренду, наивно или не очень полагая, что будущее направление изменения ряда зависит от взвешенных предыдущих изменений.

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

Теперь настраивать пришлось уже два параметра — и . Первый отвечает за сглаживание ряда вокруг тренда, второй — за сглаживание самого тренда. Чем выше значения, тем больший вес будет отдаваться последним наблюдениям и тем менее сглаженным окажется модельный ряд. Комбинации параметров могут выдавать достаточно причудливые результаты, особенно если задавать их руками. А о не ручном подборе параметров расскажу чуть ниже, сразу после тройного экспоненциального сглаживания.

Тройное экспоненциальное сглаживание a.k.a. Holt-Winters

Итак, успешно добрались до следующего варианта экспоненциального сглаживания, на сей раз тройного.

Идея этого метода заключается в добавлении еще одной, третьей, компоненты — сезонности. Соответственно, метод применим только в случае, если ряд этой сезонностью не обделён, что в нашем случае верно. Сезонная компонента в модели будет объяснять повторяющиеся колебания вокруг уровня и тренда, а характеризоваться она будет длиной сезона — периодом, после которого начинаются повторения колебаний. Для каждого наблюдения в сезоне формируется своя компонента, например, если длина сезона составляет 7 (например, недельная сезонность), то получим 7 сезонных компонент, по штуке на каждый из дней недели.

Получаем новую систему:

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

Ниже приведен код для построения модели тройного экспоненциального сглаживания, также известного по фамилиям её создателей — Чарльза Хольта и его студента Питера Винтерса.
Дополнительно в модель включен метод Брутлага для построения доверительных интервалов:

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

Кросс-валидация на временных рядах, подбор параметров

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

Ничего необычного здесь нет, по-прежнему сначала необходимо выбрать подходящуюю для данной задачи функцию потерь: RMSE, MAE, MAPE и др., которая будет следить за качеством подгонки модели под исходные данные. Затем будем оценивать на кросс-валидации значение функции потерь при данных параметрах модели, искать градиент, менять в соответствии с ним параметры и бодро опускаться в сторону глобального минимума ошибки.

Небольшая загвоздка возникает только в кросс-валидации. Проблема состоит в том, что временной ряд имеет, как ни парадоксально, временную структуру, и случайно перемешивать в фолдах значения всего ряда без сохранения этой структуры нельзя, иначе в процессе потеряются все взаимосвязи наблюдений друг с другом. Поэтому придется использовать чуть более хитрый способ для оптимизации параметров, официального названия которому я так и не нашел, но на сайте CrossValidated, где можно найти ответы на всё, кроме главного вопроса Жизни, Вселенной и Всего Остального, предлагают название “cross-validation on a rolling basis”, что не дословно можно перевести как кросс-валидация на скользящем окне.

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

Значение длины сезона 24*7 возникло не случайно — в исходном ряде отчетливо видна дневная сезонность, (отсюда 24), и недельная — по будням ниже, на выходных — выше, (отсюда 7), суммарно сезонных компонент получится 24*7.

В модели Хольта-Винтерса, как и в остальных моделях экспоненциального сглаживания, есть ограничение на величину сглаживающих параметров — каждый из них может принимать значения от 0 до 1, поэтому для минимизации функции потерь нужно выбирать алгоритм, поддерживающий ограничения на параметры, в данном случае — Truncated Newton conjugate gradient.

Передадим полученные оптимальные значения коэффициентов , и и построим прогноз на 5 дней вперёд (128 часов)

Судя по графику, модель неплохо описала исходный временной ряд, уловив недельную и дневную сезонность, и даже смогла поймать аномальные снижения, вышедшие за пределы доверительных интервалов. Если посмотреть на смоделированное отклонение, хорошо видно, что модель достаточно резко регирует на значительные изменения в структуре ряда, но при этом быстро возвращает дисперсию к обычным значениям, “забывая” прошлое. Такая особенность позволяет неплохо и без значительных затрат на подготовку-обучение модели настроить систему по детектированию аномалий даже в достаточно шумных рядах.

Эконометрический подход

Стационарность, единичные корни

Перед тем, как перейти к моделированию, стоит сказать о таком важном свойстве временного ряда, как стационарность.
Под стационарностью понимают свойство процесса не менять своих статистических характеристик с течением времени, а именно постоянство матожидания, постоянство дисперсии (она же гомоскедастичность) и независимость ковариационной функции от времени (должна зависеть только от расстояния между наблюдениями). Наглядно можно посмотреть на эти свойства на картинках, взятых из поста Sean Abu:

  • Временной ряд справа не является стационарным, так как его матожидание со временем растёт
  • Здесь не повезло с дисперсией — разброс значений ряда существенно варьируется в зависимости от периода
  • Наконец, на последнем графике видно, что значения ряда внезапно становятся ближе друг ко другу, образуя некоторый кластер, а в результате получаем непостоянство ковариаций

Почему стационарность так важна? По стационарному ряду просто строить прогноз, так как мы полагаем, что его будущие статистические характеристики не будут отличаться от наблюдаемых текущих. Большинство моделей временных рядов так или иначе моделируют и предсказывают эти характеристики (например, матожидание или дисперсию), поэтому в случае нестационарности исходного ряда предсказания окажутся неверными. К сожалению, большинство временных рядов, с которыми приходится сталкиваться за пределыми учебных материалов, стационарными не являются, но с этим можно (и нужно) бороться.

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

График белого шума:

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

На первом графике получился точно такой же стационарный белый шум, который строился раньше. На втором значение увеличилось до 0.6, в результате чего на графике стали появляться более широкие циклы, но в целом стационарным он быть пока не перестал. Третий график всё сильнее отклоняется от нулевого среднего значения, но всё ещё колеблется вокруг него. Наконец, значение равное единице дало процесс случайного блуждания — ряд не стационарен.

Происходит это из-за того, что при достижении критической единицы, ряд перестаёт возвращаться к своему среднему значению. Если вычесть из левой и правой части , то получим , где выражение слева — первые разности. Если , то первые разности дадут стационарный белый шум . Этот факт лёг в основу теста Дики-Фуллера на стационарность ряда (наличие единичного корня). Если из нестационарного ряда первыми разностями удаётся получить стационарный, то он называется интегрированным первого порядка. Нулевая гипотеза теста — ряд не стационарен, отвергалась на первых трех графиках, и принялась на последнем. Стоит сказать, что не всегда для получения стационарного ряда хватает первых разностей, так как процесс может быть интегрированным с более высоким порядком (иметь несколько единичных корней), для проверки таких случаев используют расширенный тест Дики-Фуллера, проверяющий сразу несколько лагов.

Бороться с нестационарностью можно множеством способов — разностями различного порядка, выделением тренда и сезонности, сглаживаниями и преобразованиями, например, Бокса-Кокса или логарифмированием.

Избавляемся от нестационарности и строим SARIMA

Попробуем теперь построить ARIMA модель для онлайна игроков, пройдя все круги ада стадии приведения ряда к стационарному виду. Про саму модель уже не раз писали на хабре — Построение модели SARIMA с помощью Python+R, Анализ временных рядов с помощью python, поэтому подробно останавливаться на ней не буду.

Как и следовало ожидать, исходный ряд стационарным не является, критерий Дики-Фуллера не отверг нулевую гипотезу о наличии единичного корня. Попробуем стабилизировать дисперсию преоразованием Бокса-Кокса.

Уже лучше, однако критерий Дики-Фуллера по-прежнему не отвергает гипотезу о нестационарности ряда. А автокорреляционная функция явно намекает на сезонность в получившемся ряде. Возьмём сезонные разности:

Критерий Дики-Фуллера теперь отвергает нулевую гипотезу о нестационарности, но автокорреляционная функция всё ещё выглядит нехорошо из-за большого числа значимых лагов. Так как на графике частной автокорреляционной функции значим лишь один лаг, стоит взять еще первые разности, чтобы привести наконец ряд к стационарному виду.

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

Начальные приближения Q = 1, P = 4, q = 3, p = 4

Лучшие параметры загоняем в модель:

Проверим остатки модели:

Что ж, остатки стационарны, явных автокорреляций нет, построим прогноз по получившейся модели

В финале получаем достаточно адекватный прогноз, в среднем модель ошибалась на 1.3 K пользователей, что очень и очень неплохо, однако суммарные затраты на подготовку данных, приведение к стационарности, определение и перебор параметров могут такой точности и не стоить.

Линейные и не очень модели на временных рядах

Снова небольшое лирическое отступление. Часто на работе приходится строить модели, руководствуясь одним основополагающим принципом – быстро, качественно, недорого. Поэтому часть моделей могут банально не подойти для “продакшн-решений”, так как либо требуют слишком больших затрат по подготовке данных (например, SARIMA), либо сложно настраиваются (хороший пример – SARIMA), либо требуют частого переобучения на новых данных (опять SARIMA), поэтому зачастую гораздо проще бывает выделить несколько признаков из имеющегося временного ряда и построить по ним обычную линейную регрессию или навесить решаюший лес. Дешево и сердито.

Возможно, этот подход не является значительно подкрепленным теорией, нарушает различные предпосылки, например, условия Гаусса-Маркова, особенно пункт про некоррелированность ошибок, однако на практике нередко выручает и достаточно активно используется в соревнованиях по машинному обучению.

Извлечение признаков (Feature extraction)

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

Добавлю только про еще один вариант кодирования категориальных признаков – кодирование средним. Если не хочется раздувать датасет множеством дамми-переменных, которые могут привести к потере информации о расстоянии, а в вещественном виде возникают противоречивые результаты а-ля “0 часов datetime , и извлекаем из него hour и weekday .

y hour weekday is_weekend
2020-01-01 00:00:00 34002 0 6 1
2020-01-01 01:00:00 37947 1 6 1
2020-01-01 02:00:00 41517 2 6 1
2020-01-01 03:00:00 44476 3 6 1
2020-01-01 04:00:00 46234 4 6 1

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

Помимо перечисленных преобразований для увеличения числа признаков используют и множество других метрик, например, максимальное/минимальное значение, наблюдавшееся в скользящем по ряду окне, медианы, число пиков, взвешенные дисперсии и многое другое. Автоматически этим занимается уже упоминавшаяся в курсе библиотека библиотека tsfresh.

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

Линейная регрессия vs XGBoost

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

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

Также можно провести оценку модели на кросс-валидации, тому же принципу, что был использован ранее. Для этого воспользуемся функцией (с небольшими модификациями), предложенной в посте Pythonic Cross Validation on Time Series

На 5 фолдах получили среднюю абсолютную ошибку в 4.6 K пользователей, достаточно близко к оценке качества, полученной на тестовом датасете.

Почему бы теперь не попробовать XGBoost.

Те же 3 K пользователей в средней абсолютной ошибке, и неплохо пойманные аномалии на тестовом датасете. Конечно, чтобы уменьшить ошибку, еще можно повозиться с параметрами, настроить при необходимости регуляризацию, отобрать признаки, понять, на сколько лагов нужно уходить вглубь истории и т.д.


Мы познакомились с разными методами и подходами к анализу и прогнозированию временных рядов. К сожалению, или к счастью, серебряной пули для решения такого рода задач пока не появилось. Методы, разработанные в 60-е годы прошлого века, (а некоторые и в начале 19-го), по-прежнему пользуются популярностью наравне с неразобранными в рамках данной статьи LSTM или RNN. Отчасти это связано с тем, что задача прогнозирования, как и любая другая задача, возникающая в процессе работы с данными — во многом творческая и уж точно исследовательская. Несмотря на обилие формальных метрик качества и способов оценки параметров, для каждого временного ряда часто приходится подбирать и пробовать что-то своё. Не последнюю роль играет и баланс между качеством и трудозатратами. Не раз уже упоминавшаяся здесь SARIMA-модель хотя и демонстрирует выдающиеся результаты при должной настройке, может потребовать не одного часа танцев с бубном манипуляций с рядом, в то время как простенькую линейную регрессию можно соорудить за 10 минут, получив при этом более-менее сравнимые результаты.

Домашнее задание

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

В демо-версии домашнего задания вы будете предсказывать просмотры wiki-страницы “Machine Learning”. Веб-форма для ответов, там же найдете и решение.

Полезные ресурсы

Материал статьи доступен в GitHub-репозитории курса
в виде тетрадок Jupyter.

Best Binary Options Brokers 2020:
  • Binarium

    Top Binary Options Broker 2020!
    Perfect For Beginners and Middle-Leveled Traders!
    Free Education How To Trade!
    Free Demo Account!
    Big Sign-up Bonus!

  • Binomo

    Good Choice For Experienced Traders!

Like this post? Please share to your friends:
Binary Options Trading, Strategies and Robots
Leave a Reply

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: