Визуализация данных
Статистическое прогнозирование для данных временных рядов, часть 5: Модель ARMA + GARCH для прогнозирования временных рядов
В этой серии статей рыночный индекс S&P 500 анализируется с использованием популярной статистической модели: SARIMA (интегрированная сезонная авторегрессионная скользящая средняя) и GARCH (обобщенная авторегрессионная условная гетероскедастичность).
В первой части серия была удалена из yfinance
API на python. Он был очищен и использован для получения доходности S&P 500 (процентного изменения последовательных цен) и волатильности (величины доходности). Во второй части был использован ряд методов исследования временных рядов для получения информации из данных о таких характеристиках, как тренд, сезонность, стационарность и т. Д. На основе этих идей в 3-й и 4-й частях были исследованы классы моделей SARIMA и GARCH. . Ссылки на все эти части находятся внизу этой статьи.
В этой части две модели, представленные ранее (SARIMA и GARCH), объединены для построения прогнозов и эффективных доверительных интервалов для доходности S&P 500. Код, используемый в этой статье, взят из записной книжки Returns Models / ARMA-GARCH для SPX Returns.ipynb в этом репозитории.
Оглавление
- Импорт данных
- Поезд-тестовый сплит
- Оценка параметров для ARMA
- Установка модели ARMA при возврате
- Остатки модели ARMA
- Оценка параметров GARCH
- Модель GARCH на остатках ARMA
- Прогнозы модели ARMA + GARCH
- Выводы
- Ссылки на другие части этой серии
- использованная литература
Импорт данных
Здесь мы импортируем набор данных, который был забракован и предварительно обработан в первой части этой серии. Обратитесь к части 1, чтобы подготовить данные (ссылка в конце), или загрузите файл data.csv из этого репозитория.
Поскольку это тот же код, который использовался в предыдущих частях этой серии, отдельные строки здесь не объясняются подробно для краткости.
Поезд-тестовый сплит
Теперь мы разделим данные на обучающие и тестовые наборы. Здесь все наблюдения 2019–01–01
и из 2019–01–01
образуют набор тестов, а все наблюдения до него - набор поездов.
Оценка параметров для модели ARMA
Модель ARMA - это подмножество модели ARIMA, описанной ранее в этой серии. Он имеет 2 параметра, представленных как: ARMA (p, q). Как и ARIMA,
- Количество значительных лагов на графике PACF указывает порядок p (который контролирует влияние прошлых значений на текущее значение).
- Количество значительных задержек на графике ACF указывает порядок q (, который контролирует влияние прошлых остатков на текущее значение).
Функции plot_acf()
и plot_pacf()
из библиотеки statsmodels.graphics.tsaplots
используются для построения графиков ACF и PACF для доходностей S&P 500. При изучении графиков становится ясно, что первые два лага значительны на обоих графиках. После этого уровень значимости резко отключается, а затем снова возрастает. Таким образом, чтобы модель оставалась простой, разумно установить начальные параметры как:
- p = 1, or p = 2
- q = 1, or q = 2
Установка модели ARMA при возврате
Давайте построим модель ARMA (1, 1) на основе S&P 500 Returns.
Примечание. Прежде чем подбирать модель из класса моделей SARIMA, необходимо проверить, является ли входная серия, используемая для подгонки модели, стационарной. Для стационарных временных рядов сводная статистика со временем существенно не меняется. Это означает, что основной процесс создания данных совпадает с течением времени. Интуитивно понятно, что можно смоделировать серию только в том случае, если базовый процесс, генерирующий серию, останется прежним в будущем. Стационарность этой серии spx_ret
проверена в предыдущих частях (часть 2 и часть 3) этой серии с использованием теста adfuller()
из statsmodels.tsa.stattools
.
Функция SARIMAX()
в библиотеке statsmodels.tsa.statespace.sarimax
используется для соответствия любому подмножеству моделей семейства SARIMAX. Серия spx_ret
и порядок order = (1, 0, 1)
передаются в функцию для получения определения модели ARMA (1, 1). Метод fit()
модели используется для обучения определения модели. Метод summary()
для результатов подобранной модели распечатывает сводную таблицу модели, как показано на изображении.
Сводная таблица показывает, что все коэффициенты модели значимы.
Прогнозы модели ARMA и доверительные интервалы
В этом разделе мы используем модель ARMA (1, 1) для прогнозирования доходности тестового набора. Кроме того, та же модель используется для создания доверительных интервалов.
Метод get_forecast()
используется для создания объекта прогнозов, который впоследствии можно использовать для получения доверительных интервалов с помощью функции conf_int()
. Функция predict()
используется для получения прогнозов для набора тестов. Метрика RMSE (среднеквадратичная ошибка) используется для расчета точности прогнозов относительно фактических результатов в наборе тестов. Затем прогнозы и доверительные интервалы наносятся на график против фактических результатов набора тестов, чтобы визуально подтвердить точность модели.
При осмотре графика (показанного на изображении) прогнозы в некоторых случаях оказываются точными, а в некоторых случаях они ошибаются с огромными отклонениями. Доверительные интервалы не указывают на то, как прогнозы будут выполняться в разные периоды времени набора тестов. В некоторых случаях доверительные интервалы кажутся слишком консервативными, а доходность выходит за границы. В других случаях доверительные интервалы недостаточно консервативны.
Чтобы решить эту проблему, в следующем разделе мы проанализируем остатки модели и попытаемся предсказать, когда прогнозы ARMA будут отклоняться с небольшим отрывом, а когда - с большим отрывом.
Остатки модели ARMA
В этом разделе мы наносим на график остатки модели и исследуем некоторые ее свойства.
Остатки, сгенерированные моделью ARMA (1, 1), можно получить с помощью атрибута resid
подобранной модели. При рассмотрении графика становится ясно, что остатки демонстрируют феномен кластеризации волатильности. Это означает, что если ряд показывает высокую волатильность (высокую дисперсию) на определенном временном шаге, то он также будет показывать высокую волатильность на ближайших временных шагах, и наоборот. В периоды около 2004, 2008 гг. (Периоды высокой волатильности) и промежуточные периоды (периоды низкой волатильности) это явление явно наблюдается.
Ряды, которые демонстрируют такую кластеризацию волатильности, могут быть успешно смоделированы с использованием модели GARCH (как показано в части 4, ссылка на которую приведена в конце). В следующем разделе мы начнем оценивать параметры, необходимые для соответствия модели GARCH остаткам модели ARMA (1, 1).
Оценка параметров GARCH
Модель GARCH имеет 2 параметра, представленных как: GARCH (p, q). Эти параметры оцениваются путем подсчета количества значительных лагов на графике PACF. Код для создания такого графика не показан, поскольку он очень похож на приведенный выше код графика PACF. В передаваемых данных требуется только доработка. В этом случае пройденная серия будет model_results.resid
.
График показывает, что значительных лагов в остатках нет. Таким образом, мы будем подбирать различные модели GARCH: GARCH (1, 1), GARCH (1, 2), GARCH (2, 1), GARCH (2, 2) и т.д., пока не получим модель со значительными коэффициентами и наилучшей точностью.
Модель GARCH на остатках ARMA
Как упоминалось в предыдущем разделе, график PACF не дает никаких сведений о начальных параметрах. В таком случае необходимо подобрать различные модели, чтобы найти ту, которая имеет значимые коэффициенты и лучшую точность. Это гарантирует, что у нас будет простейшая модель с максимально возможной точностью.
После подбора нескольких таких моделей GARCH (2, 2) в моем случае удовлетворял этим критериям. Не стесняйтесь опробовать различные модели на месте и выбрать предпочитаемую модель. Давайте посмотрим, что код соответствует модели GARCH (2, 2):
Перед подгонкой модели подготавливается новый фрейм данных. Этот фрейм данных состоит из всех временных шагов в исходном наборе данных (до разделения на поезд-тест). Временные шаги обучения заняты остатками из модели ARMA (1, 1). Фактически они используются для обучения модели GARCH. Периоды тестирования заняты фактическими доходностями, наблюдавшимися на один временной шаг ранее. Это равносильно утверждению, что модель прогнозирует волатильность доходности завтра, используя доходность, наблюдаемую сегодня.
Функция arch_model()
в библиотеке arch
используется для определения модели GARCH. Функция fit()
используется для обучения определенной модели. Аргумент last_obs
используется для определения, с какого временного шага модель должна начинать прогнозирование. Функция summary()
распечатывает сводную таблицу, как показано на рисунке. Сводная таблица показывает, что все коэффициенты модели значимы.
Прогнозы модели ARMA + GARCH
В этом разделе мы используем модель GARCH (2, 2), подобранную на остатках ARMA (1, 1), чтобы предсказать волатильность остатков в тестовом наборе.
На подобранной модели используется метод forecast()
: resid_model_results
. Это выводит объект ARCHModelForecast
, который содержит прогнозы для модели среднего и модели волатильности. Затем вызывается атрибут residual_variance
, чтобы получить прогнозы волатильности. Прогнозы из модели волатильности вычитаются (и добавляются) к предсказаниям из модели ARMA, хранящимся в arma_predictions_df
, чтобы получить нижний (и верхний) доверительные интервалы модели.
Затем прогнозы (из ARMA (1, 1)) и доверительные интервалы (из GARCH (2, 2)) наносятся на график в сравнении с фактическими доходностями S&P 500. При изучении графика становится ясно, что когда доходность стабильна и прогнозы близки к фактической доходности, доверительные интервалы отражают это, будучи близкими. То же самое верно для случаев, когда доходность нестабильна, а прогнозы далеки от доходности. В этом случае доверительные интервалы тоже меняются и расходятся далеко друг от друга.
Выводы
Таким образом, используя комбинацию моделей ARMA и GARCH, мы можем строить гораздо более значимые прогнозы. Глядя на прогнозы и доверительные интервалы, мы можем понять приблизительную цифру будущей доходности, а также стабильность на рынке. В следующей и заключительной статье этой серии мы рассмотрим, как использовать семейство моделей SARIMA для нестационарных данных: цены S&P 500.
Ссылки на другие части этой серии
- Статистическое моделирование данных временных рядов. Часть 1: Предварительная обработка
- Статистическое моделирование данных временных рядов. Часть 2: Исследовательский анализ данных
- Статистическое моделирование данных временных рядов. Часть 3: Прогнозирование стационарных временных рядов с использованием SARIMA
- Статистическое моделирование данных временных рядов. Часть 4: Прогнозирование волатильности с использованием GARCH
- Статистическое моделирование данных временных рядов. Часть 5: Модель ARMA + GARCH для прогнозирования временных рядов.
- Статистическое моделирование данных временных рядов. Часть 6: Прогнозирование нестационарных временных рядов с использованием ARMA
использованная литература
[1] Курс 365DataScience по анализу временных рядов
[2] блоги Machinelearningmaster по анализу временных рядов
[3] Статья в Википедии о GARCH
[4] Видео ritvikmath на YouTube о модели GARCH.
[6] Прогнозирование: принципы и практика Роба Дж. Хайндмана и Джорджа Атанасопулоса.