Если вы смотрели или читали «Гарри Поттера», вы должны быть знакомы с парселтангом, в основном это змеиный язык, и того, кто может говорить на нем, называют змееустом. Как программист и большой поклонник работы Дж. К. Роулинг, я объявляю себя змееустом, так как я мог «говорить», используя питон и анаконду. РЖУ НЕ МОГУ. Хорошо, хватит моей шутки о содрогании, и давайте перейдем к чему-то более важному - прогнозированию цен. В этой статье я приведу пример прогнозирования цен с использованием ARIMA и объясню, как это работает, на максимально понятном языке.

Почему такой особенный случай прогнозирования цен?

Большая часть учебников или базовых руководств по машинному обучению, особенно в том, что касается нейронной сети (NN), обычно объясняет ML как черный ящик, который принимает определенные входные данные и производит определенные выходные данные, и я согласен с этим, но есть проблема, если мы хотим использовать NN для прогнозирования цены. Это простая вещь, если вы хотите использовать NN для решения чего-то вроде того, как далеко может проехать автомобиль с таким количеством топлива, поскольку количество топлива и то, как далеко может проехать автомобиль, напрямую и интуитивно коррелируют. Проблема в том, что в случае прогнозирования цен нет реальных исходных данных, которые напрямую коррелируют с ценой, и единственная, которая может коррелировать с текущей ценой, - это предыдущая цена. Что ж, вы можете возразить, что политическая ситуация, настроения рынка, спрос и предложение и т. Д. Могут повлиять на цену определенного товара, но давайте будем честны, что на самом деле это не относится к каждому товару, и никто не знает, что может повлиять на цену на следующий день. . Даже я не уверен, что предыдущая цена может повлиять на текущую цену, но, по крайней мере, для нас более наглядно рассчитывать текущую цену на основе предыдущих цен, а не использовать абстрактную переменную, такую ​​как настроение рынка, которую никто не знает, как ее измерить. Даже несмотря на то, что мы уже предполагаем, что текущая цена каким-то образом коррелирует с предыдущей ценой, мы все еще не знаем, как она на самом деле коррелирована и, что более важно, как предсказать будущую цену на основе этой корреляции. Поэтому для этого нам нужен метод под названием ARIMA.

Давайте сначала поговорим с волшебной змеей

Прежде чем я объясню, как на самом деле работает ARIMA, позвольте мне показать вам, что ARIMA действительно работает для прогнозирования цены с помощью Python. В этом примере мы будем использовать цена на растительное масло в Индонезии в период с 2010 по 2015 год. Вот код для обучения модели ARIMA и построения графика прогноза:

После того, как вы загрузите данные и запустите код Python, вы увидите следующий график:

Как видите, график нашего прогноза практически совпадает с реальными ценами. На математическом языке наша модель имеет 29,45 RMSE и 21,25 MAE, как показано в таблице здесь. Я надеюсь, что этот пример убедит вас в том, насколько точна ARIMA для прогнозирования цен.

Что ты делал и почему это работает?

ARIMA на самом деле представляет собой комбинацию трех методов: авторегрессии (AR), интегрированной (I) и скользящей средней (MA), поэтому, чтобы понять ARIMA, нам нужно сначала понять, как эти три метода работают. Но перед этим позвольте мне сначала объяснить о задержке, поскольку это важный термин, который вам нужно сначала понять, чтобы узнать об ARIMA.

Если вы посмотрите на наш код, вы увидите, что в конфигурации мы даем 3 аргумента, и, как вы уже могли догадаться, эти 3 аргумента относятся к 3 методам, из которых состоит ARIMA. А пока давайте временно проигнорируем аргументы в пользу интегрированного процесса, так как будет легче, если я объясню это позже, но для AR и MA аргументы представляют собой отставание нашей модели. Как я объяснял ранее, в этой модели мы предполагаем, что будущая цена согласована с предыдущей. Но на самом деле это не означает, что нам нужно рассчитывать будущую цену, используя все предыдущие цены. Нам просто нужны самые последние цены, поскольку они более актуальны по сравнению со старыми ценами, не говоря уже о том, что использование всех предыдущих цен для прогнозирования будет затратным с точки зрения вычислений. В ARIMA количество предыдущих цен, которые мы хотим использовать в расчетах, называется лагом. Например, если лаг равен 3, это означает, что мы будем использовать только цены за последние 3 дня для прогнозирования цены на следующий день.

Авторегрессия (AR)

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

y = m*x + b

где b и m - коэффициент, который мы меняем на каждой итерации, чтобы соответствовать обучающим данным. Но проблема в прогнозировании цен заключается в том, что x в качестве входных данных отсутствует, и у нас есть только предыдущие цены, которые мы не можем сказать, что это x, поскольку математически более правильно записать их как y (t-1), y (t-2). ,…, Y (tn), потому что это та же переменная y, что и та, которую мы пытаемся предсказать. Следовательно, нам нужно изменить формулу линейной регрессии, чтобы мы могли регрессировать y по сравнению с предыдущим y. Так, например, в авторегрессии с 3 лагом мы используем

y = b0 + b1*y(t-1) + b2*y(t-2) + b3*y(t-3)

для прогнозирования будущей цены с b0 является постоянным, b1 представляет, насколько y (t-1) влияет на y, b2 представляет, насколько y (t-2) влияет на y и так далее, и так далее. Проще говоря, авторегрессия заключается в том, чтобы определить, насколько предыдущие цены коррелировали с текущей ценой, которая в нашей формуле представлена ​​буквой b, и спрогнозировать будущую цену, используя эту корреляцию.

Скользящая средняя (MA)

Если в AR мы прогнозируем, основываясь на предположении, что предыдущие цены коррелируют с будущей ценой, в скользящей средней (MA) мы предполагаем, что будущая цена - это просто среднее значение предыдущих цен с некоторой корректировкой. Интуиция, лежащая в основе МА, заключается в том, что цена не будет сильно отличаться от среднего значения предыдущей цены, и если есть разница, мы можем рассчитать ее, используя разницу между средней и предыдущей ценой. В формуле запишем МА с отставанием в 3 как

y = m + c0 + c1*e1 + c2*e2 + c3*e3

e1 = y(t-1)-m

e2 = y(t-2)-m

e3 = y(t-3)-m

где m - среднее значение трех предыдущих цен, e1, e2, e3 - разница между y (t-n) и средним значением, а c0, c1, c2, c3 - коэффициенты, показывающие, насколько ошибка y (t-n) влияет на y.

Основное преимущество MA перед AR состоит в том, что MA понимают, что аномалия в определенный день может повлиять на будущие цены. Так, например, в наших данных о кулинарном масле внезапно падает спрос на кулинарное масло из-за банкротства большого ресторана с множеством филиалов. Очевидно, что в этом сценарии цена на растительное масло не только упадет завтра, но и может упасть в следующие недели, даже месяц. Если мы будем использовать только AR, мы не сможем наблюдать эту закономерность, поскольку AR не рассчитывает вероятность того, что определенное событие повлияет на долгосрочную будущую цену. Если вы хотите использовать AR и MA по отдельности, нам нужно сначала изучить наш продукт и колебания цен. Но, объединив как AR, так и MA, мы могли бы создать обобщенную модель для прогнозирования будущей цены, не обязательно обращая внимание на то, подходит ли наша цена для AR или MA.

Если мы объединим AR и MA, формула для прогнозирования будущей цены станет:

y = b1*y(t-1) + b2*y(t-2) + b3*y(t-3)+ c1*e1 + c2*e2 + c3*e3

Интегрированный

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

Визуально процесс дифференцирования на графике выглядит так:

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

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

И после того, как вы запустите код, вы увидите следующий график:

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

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

Как определить конфигурацию ARIMA?

Как вы узнали ранее, для реализации ARIMA нам необходимо определить задержку для AR, MA и насколько мы хотим различать наши данные. Для этого вы можете сделать это уродливым способом методом проб и ошибок и наблюдать, какая конфигурация дает лучший результат, но более элегантный способ определить конфигурацию ARIMA - использовать функцию автокорреляции (ACF) для MA и функцию частичной автокорреляции (PACF) для AR. .

ACF - это, по сути, метод измерения степени корреляции текущей цены y с предыдущей ценой y (t-n), в то время как PACF также делает то же самое, но игнорирует цену между y и y (t-n). Например, в ACF при вычислении корреляции для y и y (t-3) мы также вычисляем косвенную корреляцию между y, y (t-1) и y (t-2), но в PACF мы игнорируем y (t-1). и y (t-2) и вычислить только прямую корреляцию между y и y (t-3). Чтобы построить ACF и PACF на Python, мы будем использовать следующий код:

В приведенном выше коде я ограничиваю отображаемые задержки, потому что в нормальном режиме функции plot_acf и plot_pacf будут строить acf и pacf для всех возможных задержек. Так, например, у нас есть 1000 данных, функция построит 999 ACF и PACF, которые потребляют много ресурсов. Поэтому я ограничиваю задержки до 100, поскольку чем больше задержка, тем меньше корреляция.

Этот график ниже иллюстрирует ACF для наших данных:

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

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

Основываясь на приведенном выше графике PACF, мы могли бы использовать 0 или 1 в качестве параметра AR, но поскольку 0 имеет более высокую корреляцию, я предпочитаю использовать 0. Использование 0 в качестве параметров AR и 1 в качестве параметра MA означает, что наша модель прогнозирования - это MA и не использует AR. .

Это конец этой статьи. Я надеюсь, что вы смогли чему-то научиться из этой простой реализации ARIMA для прогнозирования цен. Честно говоря, существует множество способов прогнозирования цены в зависимости от доступности ваших данных. Даже в некоторых случаях вы можете использовать NN, если есть интуитивно понятный параметр, влияющий на цену, например, в случае цена электроэнергии. Я сам, прежде чем узнать об ARIMA, использую те же данные в этой статье, я использую NN для прогнозирования цены, изменяя предыдущие 3 цены в качестве входных данных, но результат неутешительный.

Если у вас есть дополнительные вопросы, вы можете связаться со мной по адресу [email protected] или, желательно, вы можете прийти в мой офис в PT Skyshi Digital Indonesia. Увидимся в следующей статье.