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

«Предсказать цены акций очень сложно, особенно в отношении будущего» - одна из самых известных цитат датского физика Нилса Бора. Эта статья будет посвящена модели ARIMA, которую можно использовать для прогнозирования цен на акции (прогнозирование временных рядов). В этом посте я расскажу о популярной модели прогнозирования ARIMA для прогнозирования доходности акций и продемонстрирую пошаговый процесс моделирования ARIMA с использованием программирования на Python.

Приступим к работе с кодом :)

  1. Импорт библиотек:

Давайте импортируем все библиотеки импорта, которые мы будем использовать в проекте.

2. Извлечение данных:

Для этого проекта мы будем использовать цены на акции TSLA. Чтобы получить цены на акции Tesla, мы будем использовать yfinance API. Чтобы получить доступ к этому API, подойдет простая команда pip install в вашем Jupyter Notebook. Чтобы импортировать эту библиотеку в свой проект jupyter, вы можете сделать это следующим образом:

import yfinance as yf

Теперь давайте поместим всю ежедневную историю тикера TSLA в четко определенный фрейм данных.

Давайте попробуем разобраться в этом коде. Наш главный параметр для этой модели - цена закрытия. Объект «hist» - это DataFrame, и мы отправляем его в CSV для локальной копии. Вы можете запускать эту команду каждый день после закрытия рынка и получать актуальную цену закрытия, непосредственно сохраненную в файле CSV.

3. Разделение на обучение и тестирование:

Теперь мы разделим наши данные на обучающие и тестовые наборы. Я выбрал дату «2015–12–31» наугад. Вы можете выбрать другую дату для получения других результатов и немного поиграть с ней. Хотя набор проверки здесь не требуется, мы все же сделаем это, чтобы мы могли использовать этот набор данных в нескольких других моделях, кроме ARIMA, таких как скользящие средние или наивный байесовский анализ.

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

4. Являются ли данные стационарными?

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

Что такое расширенный тест Дики-Фуллера?

Расширенный тест Дики-Фуллера (тест ADF) - это обычный статистический тест, используемый для проверки того, является ли данный временной ряд стационарным или нет. Это один из наиболее часто используемых статистических тестов при анализе стационарных значений ряда.

ADF с использованием Python: пакет statsmodel обеспечивает надежную реализацию теста ADF с помощью функции adfuller() в statsmodels.tsa.stattools.

Он возвращает следующие выходные данные:

a) p-значение
b) значение тестовой статистики
c) количество задержек, учитываемых при тестировании
d) пороговые значения критических значений.

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

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

Здесь мы можем заметить, что полученное значение p для заданных данных намного больше, чем наше пороговое значение 0,05, а статистика теста ADF больше любого из критических значений. Ясно, что нет причин отвергать нулевую гипотезу. Итак, мы можем сделать вывод, что данный временной ряд явно нестационарен.

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

Мы можем использовать series.diff() и получить разность каждой точки закрытия Adj в серии. Для окончательного результата мы можем просто отбросить первую таблицу, используя new_series.dropna(inplace=True)

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

Results of Dickey-Fuller Test:
p-value = 0.0000. The series is likely stationary.
Test Statistic                -9.648313e+00
p-value                        1.457533e-16
#Lags Used                     2.000000e+01
Number of Observations Used    2.607000e+03
Critical Value (1%)           -3.432861e+00
Critical Value (5%)           -2.862649e+00
Critical Value (10%)          -2.567361e+00
dtype: float64

Из приведенных выше данных мы можем сделать следующие выводы:

  1. Полученное значение p меньше уровня значимости 0,05.
  2. Статистика ADF ниже любого из критических значений.

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

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

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

Автокорреляция - это корреляция между точками в момент времени t (Pₜ) и точкой в ​​(Pₜ₋₁). Частичная автокорреляция - это момент времени t (Pₜ) и точка (Pₜ₋ₖ), где k - любое количество лагов. При частичной автокорреляции игнорируются все данные между обеими точками.

Итак, простыми словами, автокорреляция - это отношение между сегодняшней ценой акций и вчерашней ценой акций. Частичная автокорреляция - это соотношение между сегодняшней ценой акций и ценой, которая была неделей ранее. Итак, давайте получим графики автокорреляции и частичной автокорреляции.

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

6. Тестирование различных моделей ARIMA. Для тестирования нашей модели ARIMA я буду использовать order = (4,2,0). Давайте воспользуемся этой моделью, чтобы делать прогнозы на основе нашего тестового набора данных.

Прогнозирование значений с использованием порядка (4,2,0), а также запись MSE (среднеквадратичная ошибка).

7. Визуализация модели ARIMA. Давайте посмотрим, как работает наша модель, построив несколько графиков.

Теперь мы получим график ошибки в модели.

Спасибо, что прочитали статью. Полные записные книжки доступны на моей странице GitHub,

Ссылка на профиль: https://github.com/Bhard27