Визуализация данных
Статистическое моделирование данных временных рядов. Часть 3: Прогнозирование стационарных временных рядов с использованием SARIMA.
В этой серии статей рыночный индекс S&P 500 анализируется с использованием популярной статистической модели: SARIMA (интегрированная сезонная авторегрессионная скользящая средняя) и GARCH (обобщенная авторегрессионная условная гетероскедастичность).
В первой части серия была удалена из yfinance
API на python. Он был очищен и использован для расчета доходности S&P 500 (процентное изменение последовательных цен) и волатильности (величина доходности). Во второй части был использован ряд методов исследования временных рядов для получения информации из данных о таких характеристиках, как тенденция, сезонность, стационарность и т. Д. На основе этих данных в этой статье модели из класса моделей SARIMA построены для прогнозирования Рыночная доходность.
Код, используемый в этой статье, взят из записной книжки Returns Models / SARIMA для SPX Returns.ipynb в этом репозитории.
Оглавление
- Импорт данных
- Поезд-тестовый сплит
- Несколько слов о стационарности
- Стационарность доходности S&P 500
- Несезонные модели (ARIMA)
- Выбор параметров для моделей ARIMA
- Подгонка ARIMA (1, 0, 1)
- Сезонные модели (SARIMA)
- Выбор параметров для моделей ARIMA
- Подходит для SARIMA (1, 0, 1) (1, 0, 1, 5)
- Прогнозирование с использованием ARIMA и SARIMA
- Доверительные интервалы
- Заключение
- Ссылки на другие части этой серии
- использованная литература
Импорт данных
Здесь мы импортируем набор данных, который был забракован и предварительно обработан в первой части этой серии. Обратитесь к части 1, чтобы подготовить данные, или загрузите файл data.csv из этого репозитория.
Поскольку это тот же код, который использовался в предыдущих частях этой серии, отдельные строки здесь не объясняются подробно для краткости.
Поезд-тестовый сплит
Теперь мы разделим данные на обучающие и тестовые наборы. Здесь все наблюдения 2019–01–01
и из 2019–01–01
образуют набор тестов, а все наблюдения до него - набор поездов.
Несколько слов о стационарности
Стационарность в контексте анализа временных рядов означает, что статистические свойства ряда (среднее значение, дисперсия и т. Д.) Остаются довольно постоянными во времени. При подборе статистических моделей крайне желательна стационарность ряда. Это связано с тем, что если ряд нестационарен, то его распределение со временем будет меняться. Таким образом, распределение данных, используемых для обучения моделей, будет отличаться от распределения данных, для которых необходимо составить прогноз. Следовательно, качество прогнозов, скорее всего, будет низким.
Для проверки стационарности мы используем тест ADF (Augmented-Dickey Fuller). Имеются следующие две гипотезы:
- Нулевая гипотеза (H0): ряд имеет единичный корень или не является стационарным.
- Альтернативная гипотеза (H1): ряд не имеет единичного корня или является стационарным.
Тест ADF выводит статистику теста вместе с p-значением статистики. Если p-значение статистики меньше уровней достоверности: 1% (0,01), 5% (0,05) или 10% (0,10)), тогда мы можем отклонить нулевую гипотезу и назвать ряд стационарным.
Стационарность доходности S&P 500
Давайте воспользуемся пакетом adfuller()
из statsmodels.tsa.stattools
в Python, чтобы проверить стационарность ряда, используемого в этой статье: S&P 500 Returns (spx_ret
).
Поскольку p-значение (2-е значение в кортеже, возвращаемом функцией adfuller()
) намного меньше любого из уровней достоверности, мы можем сделать вывод, что ряд является стационарным. Таким образом, мы можем использовать эту серию для построения моделей и использовать эти модели для прогнозирования для нашего тестового набора.
Несезонные модели: ARIMA
Несезонная модель SARIMA: ARIMA - это аббревиатура от Авторегрессивная интегрированная модель скользящего среднего. Эта модель представляет собой набор из 3-х компонентов:
- AR (авторегрессивный компонент): этот компонент модели ARIMA используется для фиксации зависимости текущего наблюдения от прошлых наблюдений. Параметр моделей ARIMA, управляющих этим компонентом, обозначается как p.
- I (интегрированный): этот компонент модели ARIMA используется для обозначения того, сколько раз серию необходимо отличать от собственной версии с запаздыванием. В идеале эта операция дифференцирования должна выполняться до тех пор, пока серия не станет стационарной. Параметр моделей ARIMA, управляющих этим компонентом, обозначается как d.
- MA (скользящее среднее): этот компонент модели ARIMA используется для определения влияния прошлых остатков на значение текущего наблюдения. Параметр моделей ARIMA, управляющих этим компонентом, обозначается как q.
Модели ARIMA обычно указываются следующим образом: ARIMA (p, d, q). Параметры p, d и q представляют компоненты модели AR, I и MA, как описано выше.
Выбор параметров для моделей ARIMA
Следующие правила являются общими рекомендациями, которым обычно следуют при выборе начальных параметров для моделей ARIMA.
- p (компонент AR): количество значительных лагов на графике PACF ряда является хорошей исходной точкой для компонента AR.
- d (I-компонент): если ряд не является стационарным и его необходимо различать определенное количество раз, чтобы удалить тенденцию и стационарность, то количество раз, когда эта операция выполняется, становится порядком интегрированного Составная часть.
- q (Компонент MA): количество значительных лагов на графике ACF ряда является хорошей исходной точкой для компонента AR.
Давайте начнем процесс построения модели с построения графиков ACF и PACF для доходности S&P 500. С помощью этих графиков мы оценим оптимальные параметры для модели ARIMA.
Функции plot_acf()
и plot_pacf()
используются из пакета statsmodels.graphics.tsaplots
в Python для построения графиков ACF и PACF. Аргумент zero = False
в этих функциях используется, чтобы убедиться, что нулевое отставание не отображается. Эта задержка является самой входной серией, и поэтому она всегда будет идеально коррелирована. Следовательно, его включение не даст никаких новых идей. Аргумент lags = 40
используется для построения графиков ACF и PACF для 40 лагов в прошлом.
Примечание. В серии входных данных для функций plot_acf()
и plot_pacf()
не должно быть никаких значений NULL.
Выходные данные показывают, что для графиков ACF и PACF первые 2 запаздывания кажутся значительными. Уровни значимости значительно снижаются после первых двух лагов и снова повышаются после пятого лага. Таким образом, разумной отправной точкой для параметров ARIMA является:
- p = 1 или p = 2 (из графика PACF)
- d = 0 (ряд уже был стационарным, что подтверждается тестом ADF)
- q = 1 или q = 2 (из графика АКФ)
Таким образом, у нас есть выбор между следующими моделями: ARIMA (1, 0, 1), ARIMA (1, 0, 2), ARIMA (2, 0, 1) и ARIMA (2, 0, 2). Для простоты в этой серии построен ARIMA (1, 0, 1). Поскольку здесь нет интегрированного компонента, мы также можем назвать эту модель ARMA (1, 1).
Подгонка ARIMA (1, 0, 1)
Теперь мы подберем модель ARIMA (1, 0, 1) для доходности S&P 500. После подбора модели мы построим графики ACF и PACF остатков этой модели. Если модель хороша, то остатки будут похожи на случайный шум (или белый шум). Это означает, что хорошая модель даст непредсказуемые остатки, не имеющие основополагающих закономерностей. Что касается графиков ACF и PACF, не должно быть значительных лагов для остатков хорошей модели ARIMA.
Функция SARIMAX()
из пакета statsmodels.tsa.statespace.sarimax
в Python используется для построения модели ARIMA (1, 0, 1). Обучающая серия передается в качестве первого аргумента функции SARIMAX()
. Следующий аргумент - order
. Это кортеж, представляющий (p, d, q)
порядок модели. В этом случае кортеж был (1, 0, 1)
. Модель определяется и сохраняется в переменной model
. Для этой переменной вызывается метод fit()
, и подобранная модель сохраняется в переменной model_results
. Метод summary()
вызывается для переменной model_results
и используется для отображения сводной таблицы. Затем для переменной model_results
вызывается метод resid
, чтобы получить остатки. Затем создаются графики ACF и PACF для серии model_results.resid
.
Сводная таблица. Сводная таблица состоит из 3 отдельных разделов (показанных на изображении выше). Первые 2 раздела отмечены на изображении. Второй столбец раздела I содержит некоторые полезные показатели, которые используются для сравнения различных моделей ARIMA. Как правило, модель с более высокой вероятностью логарифма или более низким IC (AIC, BIC или HQIC) лучше и наоборот. . Раздел II сводной таблицы дает информацию о различных коэффициентах компонентов AR и MA, а также о константах, используемых в модели. Столбец coef содержит фактическое значение коэффициентов, а столбец P ›| Z | столбец содержит уровни достоверности. Этот столбец указывает, значимы ли коэффициенты. Если уровень достоверности установлен на 5%, то значимые коэффициенты будут иметь значение ‹0,05 в этом столбце. Следовательно, в этом случае все коэффициенты явно значимы.
Остатки: если модель работает хорошо, то остатки или ошибки, допущенные моделью, не должны иметь в себе какой-либо основной закономерности. Если это так, то модель не сможет уловить всю информацию в данных. Таким образом, успешная модель должна приводить к остаткам, которые не имеют шаблонов, или остатки, сгенерированные в таком случае, должны напоминать белый шум. Это можно проверить, убедившись, что нет значительных лагов на графиках ACF и PACF остатков. Графики ACF и PACF остатков этой модели, как видно на изображении выше, почти не имеют значительных лагов. Следовательно, эта модель достаточно хорошо фиксирует всю информацию.
Сезонная модель: SARIMA
Модель ARIMA, рассмотренная выше, не может эффективно уловить сезонные закономерности в ряду. Для этого мы используем класс моделей SARIMA. SARIMA расшифровывается как модель сезонного авторегрессивного интегрированного скользящего среднего. Модели SARIMA указаны следующим образом: SARIMA (p, d, q) (P, D, Q, m)
Несезонные параметры:
- p (компонент AR): то же, что компонент AR в ARIMA.
- d (компонент I): то же, что и компонент I в ARIMA. Обозначает, сколько раз подряд выполняется последовательная операция дифференцирования, чтобы сделать ряд стационарным.
- q (компонент MA): то же самое, что компонент MA в ARIMA.
Сезонные параметры:
- m (Сезонный период): обозначает количество периодов в ряду, после которых повторяется сезонный образец. Обычно этот параметр также обозначается буквой s.
- P (Сезонный компонент AR): этот параметр отражает влияние прошлых задержек на текущие наблюдения. В отличие от p, прошлые задержки отделяются от текущей задержки, кратной m задержкам. Например, если m = 12 и P = 2, то текущее наблюдение оценивается с использованием наблюдений с 12-го и 24-го лагов.
- D (Сезонный компонент I): это количество раз, когда необходимо рассчитать сезонные различия, чтобы сделать ряд стационарным. В отличие от d, где дифференцирование производилось для последовательных наблюдений (1-я запаздывающая серия), здесь дифференцирование выполняется между серией и m -й серией с запаздыванием.
- Q (компонент сезонной скользящей средней): этот параметр отражает влияние прошлых остатков на текущие наблюдения. В отличие от q, прошлые задержки отделяются от текущей задержки, кратной m задержкам. Например, если m = 12 и Q = 2, то текущее наблюдение оценивается с использованием остатков от 12-го и 24-го лагов.
Оценка параметров моделей SARIMA
Параметры SARIMA (p, d, q) (P, D, Q, m) оцениваются с использованием следующих общих рекомендаций:
- p: постройте график PACF для ряда и подсчитайте количество значительных задержек.
- d: количество последовательных операций сравнения, необходимых для преобразования ряда в стационарный.
- q: постройте график ACF для ряда и подсчитайте количество значительных задержек.
- m: количество лагов, после которых наблюдается сезонная закономерность.
- P: снова постройте график PACF и обратите внимание на количество значительных лагов, разделенных кратными m.
- D: количество сезонных разностей, необходимое для преобразования ряда в стационарный.
- Q: снова постройте график ACF и обратите внимание на количество значительных лагов, разделенных кратными m.
Мы уже построили графики ACF и PACF для серии S&P 500 Returns. Для удобства доступа ниже представлено то же изображение графиков:
Оценка параметра:
- p = 1 или p = 2: первые 2 задержки PACF значительны.
- d = 0: последовательное вычисление разницы в серии S&P 500 Returns не производилось.
- q = 1 или q = 2: первые 2 задержки ACF значительны.
- m = 5: наблюдения проводятся в рабочие дни (5 дней в неделю), и в разложении ряда, выполненном в части 2 этого ряда, присутствовала сезонная закономерность.
- P = 1: 5-е отставание значимо на графике PACF.
- D = 0: сезонной разницы здесь не проводилось.
- Q = 1 или Q = 2: 5-е и 10-е запаздывания значимы на графике ACF.
Используя перестановку всех вышеперечисленных параметров, мы можем получить 8 разных моделей:
- САРИМА (1, 0, 1) (1, 0, 1, 5)
- САРИМА (1, 0, 1) (1, 0, 2, 5)
- САРИМА (1, 0, 2) (1, 0, 1, 5)
- САРИМА (1, 0, 2) (1, 0, 2, 5)
- САРИМА (2, 0, 1) (1, 0, 1, 5)
- САРИМА (2, 0, 1) (1, 0, 2, 5)
- САРИМА (2, 0, 2) (1, 0, 1, 5)
- САРИМА (2, 0, 2) (1, 0, 2, 5)
Как и ARIMA, давайте воспользуемся простейшим из них - SARIMA (1, 0, 1) (1, 0, 1, 5).
Подходит для SARIMA (1, 0, 1) (1, 0, 1, 5)
Очень похоже на подгонку модели ARIMA (1, 0, 1), теперь мы подгоним модель SARIMA (1, 0, 1) (1, 0, 1, 5) к S&P 500 Returns. Затем с помощью графиков ACF и PACF для остатков будет оценена производительность моделей. Если модель способна уловить информацию в данных, остатки должны напоминать белый шум. Другими словами, графики ACF и PACF остатков не должны приводить к значительным задержкам.
Код, используемый для соответствия модели SARIMA, почти такой же, как код, используемый для модели ARIMA. Единственное отличие - это добавление параметра seasonal_order
в функцию SARIMAX()
. Как и ARIMA, здесь также модель SARIMA приспособлена к серии S&P 500 Returns, распечатывается сводная таблица и строятся графики ACF и PACF для остатков.
Сводная таблица показывает, что все коэффициенты значимы, а остатки напоминают белый шум на основе графиков ACF и PACF. Таким образом, модель хорошо фиксирует всю информацию в серии.
Прогнозирование с использованием ARIMA и SARIMA
Давайте теперь спрогнозируем доходность S&P 500, используя модели, которые мы обучили в предыдущих разделах.
Метод predict()
вызывается на подобранных моделях для создания серии прогнозов между временным интервалом, указанным параметрами start
и end
функции. Когда у нас есть прогнозы, функция mean_squared_error()
из sklearn.metrics
используется для генерации оценки MSE (среднеквадратичная ошибка) для прогнозов. sqrt()
, функция простого извлечения квадратного корня из numpy
, затем используется для генерации оценки RMSE (среднеквадратичная ошибка) для прогнозов. Затем прогнозы сопоставляются с фактическими наблюдениями в тестовом наборе, чтобы увидеть производительность модели.
На изображении выше показано, что модель ARIMA немного превосходит модель SARIMA для S&P 500 Returns на основе оценки RMSE. Однако логарифм правдоподобия, AIC и т. Д. Показывают, что модель SARIMA превосходит модель ARIMA. RMSE вычисляется по прогнозам в тестовом наборе. С другой стороны, AIC рассчитывается по набору поездов. Таким образом, если приоритетом является хорошее моделирование набора поездов, то следует отдавать предпочтение модели с более низким AIC, а если модель должна хорошо работать на тестовом наборе, то RMSE будет иметь большее значение. В этом случае нам нужны более точные прогнозы, и, следовательно, мы выберем модель, которая лучше всего работает на тестовой выборке. Таким образом, окончательная модель, выбранная для S&P 500 Returns, - это ARIMA (1, 0, 1).
Доверительные интервалы
Доверительные интервалы дают представление о пределах погрешности, которые могут быть связаны с прогнозами. Они предлагают уникальную информацию о том, когда и насколько стабильны прогнозы. Поэтому они важны при принятии бизнес-решений на основе прогнозов. Теперь давайте сгенерируем доверительные интервалы для модели ARIMA (1, 0, 1) сверху.
Сначала мы используем функцию get_forecast()
на подобранной модели: model_results
и сохраняем результат в переменной forecasts
. Функция принимает целое число периодов, для которых необходимо сгенерировать прогнозы. В этом случае мы указываем количество периодов в тестовом наборе в качестве аргумента. Затем для объекта forecasts
вызывается функция conf_int()
. Эта функция принимает аргумент alpha
, который контролирует уровень достоверности. alpha = 0.05
означает, что у нас есть 95%
уверенность в соблюдении прогнозов между интервалами, показанными на изображении зеленым цветом. Затем мы генерируем прогнозы из модели, используя метод predict()
, как и раньше. Первые несколько строк forecasts_df
отображаются для лучшей визуализации данных. Наконец, прогнозы и доверительные интервалы наносятся на график относительно фактических значений доходности S&P 500.
Выводы
В этой статье мы рассмотрели класс моделей SARIMA. Мы использовали эти модели для соответствия серии S&P 500 Returns. Затем мы использовали эти модели, чтобы получить доверительные интервалы для наших прогнозов. Однако полученные доверительные интервалы были постоянными и не давали сколько-нибудь значимого понимания прогнозов нашей модели.
На изображении выше видно, что есть регионы, где модель имела достаточно точные прогнозы, и были регионы, где прогнозы были с большим отрывом. Доверительные интервалы должны отражать эти изменения в точности прогнозов. Для этого мы будем использовать модель GARCH поверх модели ARIMA из этой статьи. Таким образом, в следующей статье сначала будет представлена модель GARCH, а в следующей статье рассматривается модель ARIMA + GARCH для соответствия доходности S&P 500.
Ссылки на другие части этой серии
- Статистическое моделирование данных временных рядов. Часть 1: Предварительная обработка
- Статистическое моделирование данных временных рядов. Часть 2: Исследовательский анализ данных
- Статистическое моделирование данных временных рядов. Часть 3: Прогнозирование стационарных временных рядов с использованием SARIMA.
- Статистическое моделирование данных временных рядов. Часть 4: Прогнозирование волатильности с использованием GARCH
- Статистическое моделирование данных временных рядов. Часть 5: Модель ARMA + GARCH для прогнозирования временных рядов.
- Статистическое моделирование данных временных рядов. Часть 6: Прогнозирование нестационарных временных рядов с использованием ARMA
использованная литература
[1] Курс 365DataScience по анализу временных рядов
[2] блоги Machinelearningmaster по анализу временных рядов
[3] Статьи Википедии о моделях класса SARIMA.
[5] Прогнозирование: принципы и практика Роба Дж. Хайндмана и Джорджа Атанасопулоса.
[6] Нежное введение в обработку нестационарных временных рядов в Python от Analytics Vidhya.