1. Введение

Индекс NIFTY 50 является эталонным широким индексом фондового рынка Индии Национальной фондовой биржи Индии. Полная форма NIFTY — Национальная фондовая биржа Fifty. Он представляет собой средневзвешенное значение акций 50 индийских компаний в 12 секторах и является одним из двух основных фондовых индексов, используемых в Индии, вторым является BSE Sensex. Чтобы узнать подробности, нажмите здесь"

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

2. Скачать данные

Чтобы загрузить данные, мы можем перейти на сайт Yahoo Finance и загрузить исторические данные для индекса NIFTY50. URL-адрес для загрузки данных указан здесь
После того, как данные будут загружены, мы будем использовать Jupyter Notebook для чтения данных и применения алгоритмов. Для этого требуется среда Python (желательно Anaconda) или Google Colab. Здесь мы не будем рассматривать установку Anaconda или использование Google Colab.

3. Обработка данных

Сначала давайте начнем с импорта различных необходимых библиотек.

3.1 Базовые библиотеки обработки данных

В Python обязательными являются следующие две библиотеки.

Нампи

Панды

Библиотека pandas используется для управления данными в кадре данных. Фрейм данных — это не что иное, как таблица со строками и столбцами, хранящаяся в памяти компьютера (ОЗУ). Библиотека Numpy используется для математических операций, таких как логарифмирование, усреднение и т. д.

Матплотлиб

Сиборн

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

Статсмодели

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

Пмдарима
Пророк Facebook

Нам также нужно импортировать pmdarima и Facebook Prophet. Они предоставляют возможности для запуска моделей AUTO ARIMA и временных рядов. Наконец, мы импортируем различные показатели, необходимые для измерения точности моделей временных рядов.

Scikit-learn для метрик

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

3.2 Загрузка данных и обработка отсутствующих значений

После того, как мы импортировали различные библиотеки, нам нужно загрузить данные с помощью библиотеки Pandas.
Имя файла — NSEI.csv (загружен по указанному выше URL-адресу с веб-сайта Yahoo Finance).

данные = pd.read_csv («данные/NSEI.csv»)

Приведенная выше команда загружает данные в кадр данных. При анализе фрейма данных это выглядит так.

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

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

Также мы видим, что нет записей по выходным и неторговым дням. Таким образом, либо мы можем удалить эти записи (что приведет к разрыву) и может вызвать проблемы, либо мы можем использовать значения предыдущего дня. Это хорошо работает в выходные дни, так как в выходные дни торговля не ведется. Для пяти вышеприведенных записей мы можем безопасно использовать значения предыдущей даты. Например, для даты 01 января 2018 года мы возьмем значение от 31 декабря 2017 года.

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

# Установите тип столбца для даты как Datetime

data['Date'] = pd.to_datetime(data['Date'],format='%Y-%m-%d')

data['Adj Close'] = data['Adj Close'].fillna(method='bfill')data.set_index("Дата",inplace=True)

data = data.resample("D").ffill().reset_index() # пересэмплировать дни и значения заполнения

3.3 График данных

Теперь мы на самом деле начинаем отображать данные.

Мы видим, что на графике показан восходящий тренд (кроме 20 марта/апреля 20) из-за влияния Covid.
Мы также пытаемся посмотреть, как этот тренд проявляется по 7-дневным простым скользящим средним и 30-дневные простые скользящие средние.

Из приведенных выше графиков видно, что процесс не является стационарным. Стационарный процесс – это процесс, в котором

  • Постоянное среднее за период времени
  • Постоянная дисперсия
  • Ковариация m-го члена и (m + n)-го члена не должна быть функцией времени.

Очевидно, что существует восходящий тренд, что означает, что среднее значение не является постоянным, и, следовательно, можно сделать вывод, что это нестационарный процесс.

3.4 Декомпозиция временных рядов

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

Тренд

Сезонный

Остаток

3.5 Проверка на стационарность

Одним из ключевых тестов для проверки стационарности является расширенный тест Дики-Фуллера. Это печатает значение p. Если значение p выше 0,05, мы принимаем нулевую гипотезу о том, что процесс не является стационарным, и отклоняем альтернативную гипотезу.

print("Тест Дикки Фуллера:"+ str(sm.tsa.stattools.adfuller(data['Adj Close'])[1]))

Результат

Dickey Fuller Test :0.7892836265784806

Это значительно выше 0,05, что говорит о нестационарности процесса (что ранее было подтверждено визуальным осмотром).

Один из самых простых способов сделать временной ряд стационарным — взять разницу с предыдущим значением.

df_ts = data['Adj Close'] — data['Adj Close'].shift(1)print("Тест Дики-Фуллера:"+

ул(sm.tsa.stattools.adfuller(df_ts[1:])[1]))

Результат

Dickey Fuller Test :1.049447416803228e-10

Поскольку значение p меньше 0,05, теперь мы можем считать, что временной ряд является стационарным.
Теперь, когда мы строим временной ряд (после разности) и графики ACF и PACF, мы видим вот что…

4. Проверка точности

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

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

5. Построение моделей временных рядов

Теперь, когда у нас есть готовые строительные блоки, мы начнем с определения того, каким должен быть наш набор данных для обучения и набор данных для тестирования. Обычное случайное разбиение здесь не работает, так как время является очень важным фактором и важен порядок данных. Мы просто будем рассматривать данные до 30 апреля 2021 года как данные обучения, а данные за май — как данные тестирования. Далее создадим прогноз на ближайшие 7 дней.
df_train = data[['Date','Adj Close']][data['Date'] ‹= pd.to_datetime('2021–04– 30')]df_test = data[['Date','Adj Close']][data['Date'] › pd.to_datetime('2021–04–30')]

5.1 Построение авторегрессионной интегрированной модели скользящей средней

Авторегрессионные интегрированные модели скользящих средних (ARIMA) являются одной из самых передовых эконометрических моделей, которые используются во всем мире для анализа временных рядов. Модели ARIMA включают процессы авторегрессии (AR) и скользящего среднего (MA) вместе с дифференциалом в качестве средства достижения стационарности. Я не буду подробно останавливаться на этих моделях, так как это требует отдельного поста. Однако, как практик, мы оставляем реализацию модели библиотеке Python PMDARIMA, которая предоставляет очень простой в использовании метод «auto_arima». Модель ARIMA имеет три основных параметра

  • p — измерение параметра процесса AR (AR(p))
  • г — измерение количества дифференциалов, необходимых для достижения стационарности
  • q — измерение параметра для процесса MA (MA(q))

При запуске модели ARIMA с сезонностью как True мы получаем точность почти 99,5%, что видно из следующего графика. Оранжевым цветом обозначено фактическое значение, а синим — прогнозируемое. Это точность в выборке (которая в основном позволяет модели предсказывать фактические значения в обучающей выборке).

Прогнозы вне выборки выглядят следующим образом с точностью 99,2%. Это тоже не очень плохо.

5.2 Использование Facebook Prophet для построения модели временных рядов

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

Я не буду вдаваться в подробности о Facebook Prophet, так как это отдельный пост. Наша точность выборки, указанная Facebook Prophet, составляет почти 98,1%.

На тестовом наборе точность, достигнутая для модели Facebook Prophet, составляет 95,5%.

Поэтому, когда мы сравниваем Facebook Prophet с моделями ARIMA, это не так точно. Модель ARIMA способна на большее.

5.3 Использование модели Холта Винтерса для прогнозирования

Холт Винтерс — это модель экспоненциального сглаживания, которая использует исторические данные для обучения модели. Опять же, не вдаваясь в подробности, модель Холта Уинтерса дает очень высокую точность 99,3% на обучающем наборе данных. Это также видно из приведенного ниже графика.

Точность вне выборки или набора тестовых данных составляет около 98,3%, что видно из приведенного ниже графика.

До сих пор модель ARIMA продемонстрировала большую точность в предсказании движений NIFTY50.

6. Заключение

Модели ARIMA дали очень хорошую точность для данных NIFTY50, и хотя в этом наборе данных Holt Winters и Facebook Prophet отставали, бывают ситуации, когда эти модели могут работать лучше. Всегда лучше оценить и попробовать несколько моделей.