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

В этой статье мы попробуем традиционные модели, такие как ARIMA, популярные алгоритмы машинного обучения, такие как Random Forest, и алгоритмы глубокого обучения, такие как LSTM.

Ссылка на руководство (вы можете скачать данные из этого репозитория)

Https://github.com/DhruvilKarani/Time-Series-analysis/blob/master/Stock%20Price%20Prediction%20using%20ML%20and%20DL-Final.ipynb

Данные выглядят примерно так -

Теперь давайте исследуем модели.

ARIMA (авторегрессивная интегрированная скользящая средняя)

Прежде чем мы углубимся в модель, давайте посмотрим, являются ли данные в наилучшей форме для нашей модели.

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

Т.е. ряд, имеющий [a, b, c, d], преобразуется в [b-a, c-b, d-c].

Различный временной ряд выглядит примерно так -

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

OK! Мы кое-что знаем о том, как должны выглядеть наши данные. Но что такое ARIMA?

Давайте разберем это на 3 термина

AR - этот термин указывает количество авторегрессивных членов (p) в модели. Интуитивно он обозначает количество предыдущих временных шагов, от которых зависит текущее значение нашей переменной. Например, в момент времени T наша переменная Xt зависит от Xt-1 и Xt-2 линейно. В этом случае у нас есть 2 члена AR и, следовательно, наш параметр p = 2

I. Как указывалось ранее, чтобы сделать наш временной ряд стационарным, мы должны различать его. В зависимости от данных мы различаем их один или несколько раз (обычно один или два раза). Количество раз, которое мы делаем, обозначается d.

MA - этот термин является мерой среднего значения за несколько периодов времени, которые мы учитываем. Например, чтобы вычислить значение нашей переменной на текущем временном шаге, если мы возьмем среднее значение за предыдущие 2 временных шага, количество условий скользящей средней, обозначенное как q = 2

Указание параметров (p, d, q) полностью уточнит нашу модель. Но как выбрать эти параметры?

Для этой цели мы используем так называемые ACF (график автокорреляции) и PACF (график частичной автокорреляции). Давайте разберемся, что означают автокорреляция и частичная автокорреляция.

Мы знаем, что для 2 переменных X и Y корреляция означает, как эти две переменные ведут себя друг с другом. Сильно положительная корреляция означает, что X увеличивается с Y. Сильно отрицательная корреляция означает, что X уменьшается с Y. Так что же такое автокорреляция?

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

Где X ’- среднее значение, k - задержка (количество временных шагов, которые мы оглядываемся назад. K = 1 означает t-1), N - общее количество точек. C - автоковариация. Для стационарного временного ряда c не зависит от t. Это зависит только от k или задержки.

Частичная автокорреляция - это немного сложная концепция. Просто наберитесь интуиции. Рассмотрим пример - у нас есть следующие данные - уровень жира в организме (F), измерение трицепса (Tr) и окружность бедра (Th). Мы хотим измерить корреляцию между F и Tr, но мы также не хотим, чтобы окружность бедра или Th играли какую-либо роль. Так что же нам делать? Мы пытаемся устранить линейность из F и Tr, введенную Th. Пусть F ’будет уровнем жира, линейно предсказываемым Th. Аналогично, пусть Tr ’будет измерением трицепса, как предсказано Th, линейно.

Остаточные уровни жира представлены как F-F ’, а для измерения трицепса - как Tr-Tr’. Частичная корреляция - это корреляция, измеренная между этими остатками.

В нашем случае

Далее мы ответим на два важных вопроса

Что предлагает термины AR в модели?

  • ACF показывает распад
  • PACF быстро отключается

Что предлагает термины MA в модели?

  • ACF резко отрезает
  • PACF постепенно распадается

В нашем случае АКФ выглядит примерно так

От лага 0 постепенно затухает. Верхняя и нижняя серые пунктирные линии показывают уровень значимости. Между этими уровнями автокорреляция объясняется шумом, а не какой-то реальной зависимостью. Следовательно, q = 0

PACF выглядит как

Он быстро отключается, в отличие от постепенного распада в ACF. Задержка 1 значительно высока, что указывает на наличие 1 члена AR. Следовательно, p = 1.

Итак, теперь мы определили нашу модель. Давайте воспользуемся нашей моделью ARIMA (p = 1, d = 1, q = 0). Следуйте инструкциям, чтобы реализовать модель. Результаты выглядят примерно так -

Синяя часть - это данные, на которых установлена ​​модель. Оранжевый - набор задержек / проверок. Зеленый цвет - это производительность нашей модели. Обратите внимание, что нам нужна только предсказанная переменная для ARIMA. Ничего больше.

Среднеквадратичная ошибка для нашей модели оказывается 439,38.

Алгоритмы машинного и глубокого обучения

Чтобы убедиться, что алгоритмы машинного обучения и глубокого обучения хорошо работают с нашими данными, мы тестируем два алгоритма - Random Forest и LSTM. Данные те же самые, за исключением того, что мы используем все функции, а не только прогнозируемую переменную. Мы занимаемся разработкой основных функций, например, извлекаем месяц, день и год.

Модель глубокого обучения - LSTM

LSTM или сеть с долговременной краткосрочной памятью - это разновидность стандартной ванильной RNN (рекуррентные нейронные сети). RNN часто имеют тенденцию страдать из-за проблемы исчезающих / увеличивающихся градиентов. Это означает, что значения градиента становятся слишком большими или слишком маленькими, вызывая проблемы при обновлении весов RNN. LSTM - это импровизированные версии RNN, которые решают эту проблему с помощью шлюзов. Для подробного объяснения настоятельно рекомендую это видео - https://youtu.be/8HyCNIVRbSU

В нашем случае мы используем фреймворк Keras для обучения LSTM.

Ошибка = 895.06

Как мы видим, LSTM очень плохо работает с нашими данными. Основной причиной могло быть отсутствие данных. Мы обучаем только на 1000 точках данных. Это действительно меньше для глубокой нейронной сети. Это классический пример, когда нейронные сети не всегда превосходят традиционные алгоритмы.

Случайный лес

Случайный лес - это древовидный алгоритм машинного обучения с учителем. Он строит короткие слабые ученики дерева путем случайной выборки функций для разделения данных. Это гарантирует, что функции будут адекватно представлены в модели, в отличие от жадного подхода, применяемого классическими деревьями решений.

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

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

Ошибка = 1157.91

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