Модели GARCH: моделирование волатильности

Модели GARCH (Generalized Autoregressive Conditional Heteroskedasticity) представляют собой мощный инструмент для анализа и прогнозирования волатильности. И хотя данные модели уже не новы (появились в конце 1980х гг), и не лишены недостатков и ограничений, многие финансовые институты и аналитики по-прежнему их широко применяют, а понимание внутреннего механизма этих моделей создает прочный фундамент для разработки более совершенных методов оценки волатильности.

В этой статье я расскажу о теории GARCH-моделей, рассмотрю их математические основы, различные модификации, практическое применение и реализацию на Python.

Почему важно моделировать волатильность

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

Точное моделирование волатильности имеет решающее значение по нескольким причинам:

  1. Управление рисками — Точные оценки волатильности помогают финансовым институтам рассчитывать показатели риска, такие как Value at Risk (VaR) и Expected Shortfall (ES), что критически важно для соблюдения регуляторных требований и обеспечения устойчивости финансовой системы;
  2. Ценообразование опционов — Модели волатильности являются фундаментальным компонентом в алгоритмах ценообразования опционов. Чем точнее прогноз волатильности, тем справедливее оценка опциона;
  3. Оптимизация портфеля — Модели волатильности позволяют более точно оценивать ковариации между различными активами, что критически важно для эффективной оптимизации инвестиционного портфеля;
  4. Торговые стратегии — Многие торговые стратегии основаны на прогнозировании волатильности, включая стратегии волатильного арбитража и торговлю опционами.

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

  • Кластеризация волатильности — Периоды высокой волатильности имеют тенденцию группироваться вместе, как и периоды низкой волатильности. Это означает, что волатильность проявляет автокорреляцию;
  • Асимметрия влияния новостей — Негативные шоки (падение цен) обычно оказывают более сильное влияние на волатильность, чем позитивные шоки той же магнитуды;
  • Возврат к среднему — Волатильность имеет тенденцию возвращаться к некоторому долгосрочному среднему уровню;
  • Толстые хвосты распределения — Доходности финансовых активов часто проявляют leptokurtosis, то есть имеют более тяжелые хвосты, чем нормальное распределение.

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

История развития моделей волатильности

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

От постоянной волатильности к условной гетероскедастичности

В классических финансовых теориях, таких как модель ценообразования опционов Блэка-Шоулза (1973), волатильность рассматривалась как постоянная величина. Однако реальные рыночные данные убедительно свидетельствуют о том, что волатильность изменяется во времени, проявляя кластеризацию и другие сложные паттерны.

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

Появление ARCH-моделей

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

Математически модель ARCH(q) можно представить следующим образом:

Формула модели ARCH

где:

  • σ(t)^2 — условная дисперсия в момент времени t;
  • ω — константа (обычно положительная);
  • α(i) — параметры модели, которые должны быть положительными для обеспечения положительности дисперсии;
    ε(t-i) — инновации процесса (обычно предполагается, что они независимы и одинаково распределены с нулевым средним).
👉🏻  Портфель минимальной волатильности (Minimum Variance Portfolio)

За разработку модели ARCH Роберт Энгл был удостоен Нобелевской премии по экономике в 2003 году, что подчеркивает значимость этого вклада в финансовую эконометрику.

Обобщение: от ARCH к GARCH

Хотя модель ARCH представляла собой огромный шаг вперед, она имела свои ограничения. В частности, для адекватного моделирования волатильности часто требовалось большое количество лагов, что приводило к сложностям в оценке параметров.

В 1986 году Тим Болерслев предложил обобщение модели ARCH, которое получило название GARCH (Generalized Autoregressive Conditional Heteroskedasticity). Ключевая идея заключалась в том, чтобы включить прошлые условные дисперсии в уравнение для текущей условной дисперсии:

Формула модели GARCH

где β(j) — параметры, отражающие влияние прошлых условных дисперсий.

Эта формулировка оказалась более экономной в параметрах и часто модель GARCH(1,1) была достаточна для адекватного описания волатильности, тогда как эквивалентная модель ARCH потребовала бы бесконечного числа параметров.

Дальнейшее развитие: семейство GARCH моделей

После появления базовой модели GARCH были разработаны многочисленные ее расширения для учета различных особенностей финансовых временных рядов. Среди наиболее известных:

  • EGARCH (Exponential GARCH) — для учета асимметричных эффектов волатильности;
  • GJR-GARCH — еще одна модель для асимметричных эффектов, названная в честь ее авторов (Glosten, Jagannathan, and Runkle);
  • IGARCH (Integrated GARCH) — для моделирования процессов с долгой памятью;
  • FIGARCH (Fractionally Integrated GARCH) — для моделирования долгосрочной зависимости;
  • MGARCH (Multivariate GARCH) — для многомерного моделирования волатильности.

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

Базовая модель GARCH: математическая формулировка

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

Структура модели GARCH(p,q)

Рассмотрим процесс доходности финансового актива r(t). Модель GARCH предполагает, что r(t) можно представить как:

Формула модели GARCH (p,q)

где:

  • μ(t) — условное математическое ожидание (часто моделируется как константа или авторегрессионный процесс);
  • ε(t) — инновации (шоковая составляющая);
  • σ(t) — условное стандартное отклонение;
  • z(t) — стандартизированные инновации, обычно предполагается что имеет распределение Стьюдента;
  • ω, α(i), β(j) — параметры модели.

Индексы p и q в GARCH(p,q) указывают порядок модели:

  • q — количество членов ARCH (лаги квадратов инноваций);
  • p — количество членов GARCH (лаги условных дисперсий).

Ограничения на параметры

Для обеспечения стационарности процесса и положительности условной дисперсии параметры модели GARCH должны удовлетворять следующим условиям:

  • ω > 0
  • α(i) >= 0 для всех i = 1,…,q
  • β(j) >= 0 для всех j = 1,…,p
  • sum( α(i) ) + sum ( β(j) ) < 1 — условие ковариационной стационарности

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

Специальный случай: GARCH(1,1)

На практике наиболее часто используется модель GARCH(1,1), которая имеет следующую форму:

Формула GARCH(1,1)

Эта спецификация часто оказывается достаточной для моделирования волатильности большинства финансовых временных рядов. В модели GARCH(1,1) параметры имеют четкую интерпретацию:

  • ω представляет базовый уровень волатильности;
  • α(1) отражает влияние недавних шоков на текущую волатильность;
  • β(1) отражает персистентность волатильности, то есть скорость затухания шоков.

Безусловная дисперсия

Для стационарного процесса GARCH можно вычислить безусловную дисперсию, которая представляет долгосрочный уровень волатильности. Для модели GARCH(1,1) безусловная дисперсия равна:

Формула безусловной дисперсии для модели GARCH(1,1)

Эта формула имеет важное практическое значение при прогнозировании долгосрочной волатильности.

Персистентность волатильности

Сумма параметров α(1) + β(1) в модели GARCH(1,1) является мерой персистентности волатильности. Чем ближе эта сумма к единице, тем медленнее затухают шоки волатильности. На практике для многих финансовых временных рядов эта сумма часто оказывается близкой к 1, что свидетельствует о высокой персистентности волатильности.

👉🏻  Ускорение численных вычислений в Python: Numba, JIT на примерах из Data Science

Время полураспада шока волатильности можно оценить по формуле:

Формула времени полураспада шока волатильности

Это значение показывает, сколько периодов требуется для того, чтобы влияние шока на условную дисперсию уменьшилось вдвое.

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

Оценка параметров GARCH-модели

Один из ключевых этапов в применении GARCH-моделей — это оценка их параметров на основе исторических данных. Этот процесс имеет свои особенности и сложности, которые необходимо понимать для корректного использования модели.

Метод максимального правдоподобия (MLE)

Наиболее распространенным методом оценки параметров GARCH-моделей является метод максимального правдоподобия (Maximum Likelihood Estimation, MLE). Суть этого метода заключается в нахождении таких значений параметров, которые максимизируют вероятность (правдоподобие) наблюдения имеющихся данных.

Предполагая, что стандартизированные инновации z(t) имеют нормальное распределение, функция правдоподобия для GARCH-модели может быть записана как:

Формула функции правдоподобия для GARCH-модели

где T — вектор параметров модели.

Для упрощения вычислений обычно максимизируют логарифм функции правдоподобия:

Формула максимизация логарифма функции правдоподобия

Важно отметить следующие особенности оценки параметров GARCH-моделей методом MLE:

  1. Рекурсивный характер вычислений — Для вычисления логарифмической функции правдоподобия необходимо рекурсивно оценивать условные дисперсии σ(t)^2, начиная с некоторых начальных значений.
  2. Выбор начальных значений — Результаты оценки могут зависеть от выбора начальных значений для оптимизации. Часто используют безусловную дисперсию выборки как начальное значение для σ(t)^2.
  3. Численная оптимизация — Максимизация логарифмической функции правдоподобия обычно требует применения численных методов оптимизации, таких как метод Ньютона-Рафсона или BFGS (Broyden–Fletcher–Goldfarb–Shanno).

Учет негауссовского распределения инноваций

Финансовые временные ряды часто характеризуются наличием тяжелых хвостов в распределении доходностей. В таких случаях предположение о нормальном распределении стандартизированных инноваций может быть неадекватным. Для учета этой особенности применяют следующие подходы:

  1. Распределение Стьюдента. Часто используется t-распределение n степенями свободы, которое позволяет моделировать тяжелые хвосты;
  2. Обобщенное распределение ошибок (GED). Еще одна альтернатива, которая включает нормальное распределение как частный случай;
  3. Полупараметрические подходы. В некоторых случаях используются квазиправдоподобные оценки (QMLE), когда функция правдоподобия строится на основе предположения о нормальном распределении, даже если распределение на самом деле не является нормальным.

Диагностика модели

После оценки параметров GARCH-модели критически важно провести диагностику для проверки адекватности модели. Основные диагностические тесты включают:

  1. Тест на автокорреляцию стандартизированных квадратичных остатков. Если модель корректно специфицирована, стандартизированные квадратичные остатки не должны проявлять автокорреляцию. Для этого применяются тесты Льюнга-Бокса или Бройша-Годфри.
  2. Тест на нормальность стандартизированных остатков. В зависимости от предположений модели, стандартизированные остатки z(t) должны соответствовать предполагаемому распределению. Тесты Жарка-Бера, Колмогорова-Смирнова и Q-Q графики используются для проверки.
  3. Информационные критерии. Критерии Акаике (AIC) и Байесовский информационный критерий (BIC) используются для сравнения различных спецификаций модели:

AIC = −2log⁡L+2*k

BIC = −2log⁡L+k*log⁡(n)

где k — количество параметров модели, а n — размер выборки.

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

Реализация GARCH-моделей на Python

Теория моделей GARCH имеет мало практической ценности без умения применять ее для анализа реальных данных. В этом разделе я покажу, как реализовать различные GARCH-модели на Python с использованием популярных библиотек и как интерпретировать полученные результаты.

Основные библиотеки для моделирования GARCH

Для работы с GARCH-моделями в Python доступно несколько библиотек:

  • arch — специализированная библиотека для моделирования условной гетероскедастичности;
  • statsmodels — более общая библиотека для статистического моделирования, включающая функционал для GARCH-моделей;
  • rugarch — Библиотека R, доступная через rpy2 в Python, предоставляющая обширный набор моделей семейства GARCH
👉🏻  Фрактальный анализ финансовых рынков: показатель Херста, R/S анализ, фрактальная размерность временных рядов

На практике наиболее удобной оказалась библиотека arch, разработанная Кевином Шеппардом, поэтому основные примеры будут с ее использованием.

Подготовка данных для GARCH-моделирования

Перед применением GARCH-моделей необходимо провести предварительную обработку финансовых данных. Обычно эта процедура включает:

  1. Расчет логарифмических доходностей;
  2. Удаление выбросов (если они есть);
  3. Проверку стационарности ряда;
  4. Проверку наличия условной гетероскедастичности (ARCH-эффекта)

Пример загрузки исторических данных и подготовки их для GARCH-моделирования:

!pip install arch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from arch import arch_model
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
import warnings
warnings.filterwarnings('ignore')

# Загрузка данных
ticker = 'SPY'  # ETF на индекс S&P 500
start_date = '2018-01-01'
end_date = '2023-01-01'
data = yf.download(ticker, start=start_date, end=end_date)

# Расчет логарифмических доходностей
data['returns'] = 100 * np.log(data['Close'] / data['Close'].shift(1))
data = data.dropna()

# Визуализация доходностей
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['returns'])
plt.title(f'Логарифмические доходности {ticker}')
plt.xlabel('Дата')
plt.ylabel('Доходность (%)')
plt.grid(True)
plt.tight_layout()
plt.show()

# Проверка автокорреляции в квадратах доходностей (признак ARCH-эффекта)
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
plot_acf(data['returns']**2, lags=20, ax=ax[0])
ax[0].set_title('ACF квадратов доходностей')
plot_pacf(data['returns']**2, lags=20, ax=ax[1])
ax[1].set_title('PACF квадратов доходностей')
plt.tight_layout()
plt.show()

# Тест Льюнга-Бокса на автокорреляцию в квадратах доходностей
from statsmodels.stats.diagnostic import acorr_ljungbox
lb_test = acorr_ljungbox(data['returns']**2, lags=[10], return_df=True)
print(f"Тест Льюнга-Бокса на автокорреляцию в квадратах доходностей:")
print(lb_test)

График логарифмических доходностей ETF на индекс SP500

Рис. 1: График логарифмических доходностей ETF на индекс SP500

График автокорреляции (ACF) и частичной автокорреляции (PACF) квадратов доходностей

Рис. 2: График автокорреляции (ACF) и частичной автокорреляции (PACF) квадратов доходностей

Тест Льюнга-Бокса на автокорреляцию в квадратах доходностей:
        lb_stat  lb_pvalue
10  1648.026175        0.0

Наличие значимой автокорреляции в квадратах доходностей указывает на присутствие ARCH-эффекта и целесообразность применения GARCH-моделей.

Базовая модель GARCH(1,1)

Рассмотрим реализацию базовой модели GARCH(1,1):

# Обучение модели GARCH(1,1)
returns = data['returns'].values

# Создание модели GARCH(1,1) с нормальным распределением
model = arch_model(returns, vol='Garch', p=1, q=1, dist='normal')
model_fit = model.fit(disp='off')  # disp='off' отключает вывод подробной информации

# Вывод результатов
print(model_fit.summary())

# Визуализация условной волатильности
fig, ax = plt.subplots(2, 1, figsize=(12, 8))
ax[0].plot(data.index, returns)
ax[0].set_title('Доходности')
ax[0].set_ylabel('Доходность (%)')
ax[0].grid(True)

ax[1].plot(data.index, model_fit.conditional_volatility)
ax[1].set_title('Условная волатильность (GARCH(1,1))')
ax[1].set_ylabel('Волатильность (%)')
ax[1].set_xlabel('Дата')
ax[1].grid(True)

plt.tight_layout()
plt.show()

# Расчет долгосрочной (безусловной) волатильности
omega = model_fit.params['omega']
alpha = model_fit.params['alpha[1]']
beta = model_fit.params['beta[1]']
unconditional_variance = omega / (1 - alpha - beta)
unconditional_volatility = np.sqrt(unconditional_variance)
print(f"Долгосрочная волатильность: {unconditional_volatility:.4f}%")
print(f"Персистентность волатильности (alpha + beta): {alpha + beta:.4f}")

# Расчет времени полураспада шока волатильности
half_life = np.log(0.5) / np.log(alpha + beta)
print(f"Время полураспада шока волатильности: {half_life:.1f} дней")
                     Constant Mean - GARCH Model Results                      
==============================================================================
Dep. Variable:                      y   R-squared:                       0.000
Mean Model:             Constant Mean   Adj. R-squared:                  0.000
Vol Model:                      GARCH   Log-Likelihood:               -1834.71
Distribution:                  Normal   AIC:                           3677.42
Method:            Maximum Likelihood   BIC:                           3697.97
                                        No. Observations:                 1258
Date:                Mon, May 05 2025   Df Residuals:                     1257
Time:                        21:43:39   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.1023  2.452e-02      4.172  3.018e-05 [5.424e-02,  0.150]
                              Volatility Model                              
============================================================================
                 coef    std err          t      P>|t|      95.0% Conf. Int.
----------------------------------------------------------------------------
omega          0.0509  1.683e-02      3.024  2.493e-03 [1.791e-02,8.387e-02]
alpha[1]       0.2343  4.460e-02      5.254  1.490e-07     [  0.147,  0.322]
beta[1]        0.7534  3.518e-02     21.415 9.640e-102     [  0.684,  0.822]
============================================================================

Covariance estimator: robust

График доходности и условной волатильности смоделированной по GARCH(1,1)

Рис. 3: График доходности SP500 и условной волатильности смоделированной по GARCH(1,1)

Долгосрочная волатильность: 2.0335%
Персистентность волатильности (alpha + beta): 0.9877
Время полураспада шока волатильности: 56.0 дней

Диагностика качества модели GARCH

После обучения модели важно проверить, насколько хорошо она справляется с моделированием волатильности. Для этого анализируем стандартизированные остатки:

# Получение стандартизированных остатков
resid = model_fit.resid
std_resid = resid / model_fit.conditional_volatility

# Диагностические графики
fig, ax = plt.subplots(2, 2, figsize=(14, 10))

# 1. Стандартизированные остатки
ax[0, 0].plot(data.index, std_resid)
ax[0, 0].set_title('Стандартизированные остатки')
ax[0, 0].grid(True)

# 2. QQ-график стандартизированных остатков
import scipy.stats as stats
stats.probplot(std_resid, dist='norm', plot=ax[0, 1])
ax[0, 1].set_title('QQ-график стандартизированных остатков')
ax[0, 1].grid(True)

# 3. ACF квадратов стандартизированных остатков
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(std_resid**2, lags=20, ax=ax[1, 0])
ax[1, 0].set_title('ACF квадратов стандартизированных остатков')

# 4. Гистограмма стандартизированных остатков
ax[1, 1].hist(std_resid, bins=50, alpha=0.7, density=True)
x = np.linspace(-5, 5, 1000)
ax[1, 1].plot(x, stats.norm.pdf(x, 0, 1), 'r', lw=2)
ax[1, 1].set_title('Гистограмма стандартизированных остатков')
ax[1, 1].grid(True)

plt.tight_layout()
plt.show()

# Тест Льюнга-Бокса на автокорреляцию в квадратах остатков
from statsmodels.stats.diagnostic import acorr_ljungbox
lb_test_std = acorr_ljungbox(std_resid**2, lags=[10], return_df=True)
print(f"Тест Льюнга-Бокса на автокорреляцию в квадратах стандартизированных остатков:")
print(lb_test_std)

# Тест Харке-Бера на нормальность остатков
from scipy.stats import jarque_bera
jb_test = jarque_bera(std_resid)
print(f"Тест Харке-Бера на нормальность стандартизированных остатков:")
print(f"Статистика: {jb_test[0]:.4f}, p-значение: {jb_test[1]:.4f}")

Графики стандартизированных остатков GARCH-модели

Рис. 4: Графики стандартизированных остатков GARCH-модели

Тест Льюнга-Бокса на автокорреляцию в квадратах стандартизированных остатков:
     lb_stat  lb_pvalue
10  8.085283   0.620507
Тест Харке-Бера на нормальность стандартизированных остатков:
Статистика: 332.3913, p-значение: 0.0000

Модель GARCH с t-распределением

Для учета тяжелых хвостов в распределении доходностей можно использовать модель GARCH с t-распределением:

# Создание модели GARCH(1,1) с t-распределением
model_t = arch_model(returns, vol='Garch', p=1, q=1, dist='studentst')
model_t_fit = model_t.fit(disp='off')

# Вывод результатов
print(model_t_fit.summary())

# Сравнение информационных критериев
print("\nСравнение информационных критериев:")
print(f"Модель с нормальным распределением - AIC: {model_fit.aic:.2f}, BIC: {model_fit.bic:.2f}")
print(f"Модель с t-распределением - AIC: {model_t_fit.aic:.2f}, BIC: {model_t_fit.bic:.2f}")

# Число степеней свободы t-распределения
nu = model_t_fit.params['nu']
print(f"Число степеней свободы t-распределения: {nu:.2f}")
                        Constant Mean - GARCH Model Results                         
====================================================================================
Dep. Variable:                            y   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                            GARCH   Log-Likelihood:               -1796.81
Distribution:      Standardized Student's t   AIC:                           3603.63
Method:                  Maximum Likelihood   BIC:                           3629.32
                                              No. Observations:                 1258
Date:                      Mon, May 05 2025   Df Residuals:                     1257
Time:                              21:50:03   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.1190  2.060e-02      5.779  7.505e-09 [7.866e-02,  0.159]
                              Volatility Model                              
============================================================================
                 coef    std err          t      P>|t|      95.0% Conf. Int.
----------------------------------------------------------------------------
omega          0.0324  1.016e-02      3.188  1.433e-03 [1.247e-02,5.229e-02]
alpha[1]       0.2074  3.446e-02      6.018  1.763e-09     [  0.140,  0.275]
beta[1]        0.7926  2.874e-02     27.580 1.907e-167     [  0.736,  0.849]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu             5.9534      0.931      6.394  1.617e-10 [  4.128,  7.778]
========================================================================

Covariance estimator: robust

Сравнение информационных критериев:
Модель с нормальным распределением - AIC: 3677.42, BIC: 3697.97
Модель с t-распределением - AIC: 3603.63, BIC: 3629.32
Число степеней свободы t-распределения: 5.95

Обычно модель с t-распределением показывает более качественные результаты на биржевых данных из-за характерных тяжелых хвостов.

👉🏻  Портфель максимальной диверсификации (Maximum Diversification Portfolio)

Реализация асимметричных моделей GARCH

Рассмотрим реализацию асимметричных моделей GARCH: EGARCH и GJR-GARCH на языке программирования Python:

# 1. Модель EGARCH(1,1)
model_egarch = arch_model(returns, vol='EGARCH', p=1, q=1, dist='studentst')
model_egarch_fit = model_egarch.fit(disp='off')

# 2. Модель GJR-GARCH(1,1)
model_gjr = arch_model(returns, vol='GARCH', p=1, o=1, q=1, dist='studentst')
model_gjr_fit = model_gjr.fit(disp='off')

# Вывод результатов
print("Результаты модели EGARCH(1,1):")
print(model_egarch_fit.summary())

print("\nРезультаты модели GJR-GARCH(1,1):")
print(model_gjr_fit.summary())

# Сравнение информационных критериев
print("\nСравнение информационных критериев:")
print(f"GARCH(1,1) с t-распределением - AIC: {model_t_fit.aic:.2f}, BIC: {model_t_fit.bic:.2f}")
print(f"EGARCH(1,1) с t-распределением - AIC: {model_egarch_fit.aic:.2f}, BIC: {model_egarch_fit.bic:.2f}")
print(f"GJR-GARCH(1,1) с t-распределением - AIC: {model_gjr_fit.aic:.2f}, BIC: {model_gjr_fit.bic:.2f}")

# Проверка асимметричного эффекта
# Для EGARCH параметр асимметрии обычно называется 'gamma1'
# Для GJR-GARCH параметр асимметрии обычно называется 'gamma[1]'
try:
    gamma_egarch = model_egarch_fit.params.get('gamma1', model_egarch_fit.params.get('gamma[1]', None))
    gamma_gjr = model_gjr_fit.params.get('gamma[1]', model_gjr_fit.params.get('gamma1', None))
    
    print(f"\nПараметр асимметрии в EGARCH: {gamma_egarch:.4f}" if gamma_egarch is not None else "\nПараметр асимметрии в EGARCH не найден")
    print(f"Параметр асимметрии в GJR-GARCH: {gamma_gjr:.4f}" if gamma_gjr is not None else "Параметр асимметрии в GJR-GARCH не найден")
except Exception as e:
    print(f"\nОшибка при получении параметров асимметрии: {str(e)}")
    print("Доступные параметры в EGARCH:", model_egarch_fit.params.keys())
    print("Доступные параметры в GJR-GARCH:", model_gjr_fit.params.keys())

# Визуализация условной волатильности по разным моделям
plt.figure(figsize=(12, 6))
plt.plot(data.index, model_t_fit.conditional_volatility, label='GARCH(1,1)', alpha=0.7)
plt.plot(data.index, model_egarch_fit.conditional_volatility, label='EGARCH(1,1)', alpha=0.7)
plt.plot(data.index, model_gjr_fit.conditional_volatility, label='GJR-GARCH(1,1)', alpha=0.7)
plt.title('Сравнение условной волатильности по разным моделям')
plt.xlabel('Дата')
plt.ylabel('Условная волатильность (%)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
Результаты модели EGARCH(1,1):
                        Constant Mean - EGARCH Model Results                        
====================================================================================
Dep. Variable:                            y   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                           EGARCH   Log-Likelihood:               -1802.11
Distribution:      Standardized Student's t   AIC:                           3614.21
Method:                  Maximum Likelihood   BIC:                           3639.90
                                              No. Observations:                 1258
Date:                      Mon, May 05 2025   Df Residuals:                     1257
Time:                              21:53:11   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.1235  2.062e-02      5.987  2.140e-09 [8.304e-02,  0.164]
                               Volatility Model                              
=============================================================================
                 coef    std err          t      P>|t|       95.0% Conf. Int.
-----------------------------------------------------------------------------
omega          0.0245  1.286e-02      1.907  5.658e-02 [-6.873e-04,4.973e-02]
alpha[1]       0.4007  5.262e-02      7.615  2.642e-14      [  0.298,  0.504]
beta[1]        0.9627  1.130e-02     85.183      0.000      [  0.941,  0.985]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu             5.7644      0.910      6.333  2.397e-10 [  3.981,  7.548]
========================================================================

Covariance estimator: robust
Результаты модели GJR-GARCH(1,1):
                      Constant Mean - GJR-GARCH Model Results                       
====================================================================================
Dep. Variable:                            y   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                        GJR-GARCH   Log-Likelihood:               -1779.98
Distribution:      Standardized Student's t   AIC:                           3571.96
Method:                  Maximum Likelihood   BIC:                           3602.78
                                              No. Observations:                 1258
Date:                      Mon, May 05 2025   Df Residuals:                     1257
Time:                              21:53:11   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.0863  2.091e-02      4.126  3.697e-05 [4.529e-02,  0.127]
                               Volatility Model                              
=============================================================================
                 coef    std err          t      P>|t|       95.0% Conf. Int.
-----------------------------------------------------------------------------
omega          0.0312  8.871e-03      3.517  4.359e-04  [1.382e-02,4.859e-02]
alpha[1]       0.0335  2.584e-02      1.295      0.195 [-1.718e-02,8.413e-02]
gamma[1]       0.2772  5.994e-02      4.624  3.769e-06      [  0.160,  0.395]
beta[1]        0.8163  2.879e-02     28.355 7.262e-177      [  0.760,  0.873]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu             5.9832      0.995      6.012  1.829e-09 [  4.033,  7.934]
========================================================================

Covariance estimator: robust

Сравнение информационных критериев:
GARCH(1,1) с t-распределением — AIC: 3603.63, BIC: 3629.32
EGARCH(1,1) с t-распределением — AIC: 3614.21, BIC: 3639.90
GJR-GARCH(1,1) с t-распределением — AIC: 3571.96, BIC: 3602.78

👉🏻  Скорость и ускорение в последовательностях временных рядов. Методы расчета

Параметр асимметрии в EGARCH не найден
Параметр асимметрии в GJR-GARCH: 0.2772

График сравнения условной волатильности SP500 моделями GARCH(1,1), EGARCH(1,1), GJR-GARCH(1,1)

Рис. 5: График сравнения условной волатильности SP500 моделями GARCH(1,1), EGARCH(1,1), GJR-GARCH(1,1)

Отрицательное значение параметра gamma в EGARCH или положительное в GJR-GARCH указывает на наличие эффекта рычага.

Прогнозирование волатильности

Одно из частых применений моделей GARCH — прогнозирование будущей волатильности. Давайте посмотрим как можно спрогнозировать волатильность индекса SP500 с помощью этого метода и Python:

# Выбор лучшей модели на основе информационных критериев
best_model = model_gjr_fit  # Предположим, что GJR-GARCH оказалась лучшей

# Прогнозирование на 30 дней вперед
forecast_horizon = 30
forecasts = best_model.forecast(horizon=forecast_horizon)

# Извлечение прогнозов волатильности
forecast_variance = forecasts.variance.iloc[-1].values
forecast_volatility = np.sqrt(forecast_variance)

# Визуализация прогноза
plt.figure(figsize=(12, 6))
plt.plot(data.index[-100:], best_model.conditional_volatility[-100:], label='Историческая волатильность')
last_date = data.index[-1]
forecast_dates = pd.date_range(start=last_date, periods=forecast_horizon + 1)[1:]
plt.plot(forecast_dates, forecast_volatility, 'r--', label='Прогноз волатильности')
plt.title('Прогноз условной волатильности')
plt.xlabel('Дата')
plt.ylabel('Условная волатильность (%)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

# Вывод прогнозных значений
print("\nПрогноз волатильности на ближайшие дни:")
for i, (date, vol) in enumerate(zip(forecast_dates[:5], forecast_volatility[:5])):
    print(f"{date.date()}: {vol:.4f}%")

# Долгосрочный прогноз волатильности
long_term_volatility = forecast_volatility[-1]
print(f"\nДолгосрочный прогноз волатильности (через {forecast_horizon} дней): {long_term_volatility:.4f}%")

Прогноз условной волатильности SP500 смоделированной GARCH

Рис. 6: Прогноз условной волатильности SP500 смоделированной GARCH

Прогноз волатильности на ближайшие дни:
2022-12-31: 1.2212%
2023-01-01: 1.2269%
2023-01-02: 1.2325%
2023-01-03: 1.2380%
2023-01-04: 1.2434%

Долгосрочный прогноз волатильности (через 30 дней): 1.3545%

Расчет VaR и ES с использованием GARCH

Одно из практических применений GARCH-моделей — оценка мер риска, таких как Value at Risk (VaR) и Expected Shortfall (ES):

# Расчет VaR и ES
confidence_level = 0.95  # 95% доверительный уровень
horizon = 1  # однодневный прогноз

forecast = best_model.forecast(horizon=horizon)
forecast_mean = forecast.mean.iloc[-1, 0]
forecast_variance = forecast.variance.iloc[-1, 0]
forecast_volatility = np.sqrt(forecast_variance)

# Параметры t-распределения
nu = best_model.params['nu']

# Расчет VaR
from scipy.stats import t
t_critical = t.ppf(1 - confidence_level, nu)
var = forecast_mean + forecast_volatility * t_critical

# Расчет ES (Expected Shortfall или CVaR)
t_density = t.pdf(t_critical, nu)
es = forecast_mean - forecast_volatility * ((nu + t_critical**2) * t_density) / ((nu - 1) * (1 - confidence_level))

print(f"Прогноз на следующий день:")
print(f"Ожидаемая доходность: {forecast_mean:.4f}%")
print(f"Прогнозируемая волатильность: {forecast_volatility:.4f}%")
print(f"Value at Risk (VaR) при {confidence_level*100}% уровне доверия: {-var:.4f}%")
print(f"Expected Shortfall (ES) при {confidence_level*100}% уровне доверия: {-es:.4f}%")

Прогноз на следующий день:
Ожидаемая доходность: 0.0863%
Прогнозируемая волатильность: 1.2212%
Value at Risk (VaR) при 95.0% уровне доверия: 2.2880%
Expected Shortfall (ES) при 95.0% уровне доверия: 3.2271%

Многомерные GARCH-модели

Для моделирования волатильностей и корреляций нескольких активов одновременно используются многомерные модели семейства GARCH. Например, DCC-GARCH:

import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
from arch import arch_model

# Загрузка данных
tickers = ['SPY', 'QQQ', 'TLT']
start_date = '2010-01-01'
end_date = '2023-01-01'

data_multi = yf.download(tickers, start=start_date, end=end_date)['Close']
returns_multi = 100 * np.log(data_multi / data_multi.shift(1)).dropna()

# 1. Этап: Оцениваем одномерные GARCH модели для каждого актива
garch_results = []
std_residuals = pd.DataFrame()

for ticker in tickers:
    # Оцениваем GARCH(1,1) с t-распределением
    model = arch_model(returns_multi[ticker], vol='Garch', p=1, q=1, dist='t')
    res = model.fit(disp='off')
    garch_results.append(res)
    
    # Сохраняем стандартизированные остатки
    std_residuals[ticker] = res.resid / res.conditional_volatility

# 2. Этап: Реализация DCC корреляций

# Рассчитаем долгосрочную корреляционную матрицу Qbar
Qbar = std_residuals.cov().values

# Параметры DCC (обычно оцениваются через MLE, здесь зададим вручную)
alpha = 0.05  # параметр реакции на шоки
beta = 0.9    # параметр persistence

# Инициализация
n_assets = len(tickers)
n_obs = len(std_residuals)
Qt = np.zeros((n_obs, n_assets, n_assets))
Rt = np.zeros((n_obs, n_assets, n_assets))

# Начальное значение Qt
Qt[0] = Qbar

# Рекурсивный расчет Qt и Rt
for t in range(1, n_obs):
    # Получаем стандартизированные остатки для предыдущего периода
    eps = std_residuals.iloc[t-1].values
    eps_outer = np.outer(eps, eps)
    
    # Обновляем Qt
    Qt[t] = (1 - alpha - beta) * Qbar + alpha * eps_outer + beta * Qt[t-1]
    
    # Нормализуем Qt для получения корреляционной матрицы Rt
    diag_qt = np.sqrt(np.diag(Qt[t]))
    Rt[t] = Qt[t] / np.outer(diag_qt, diag_qt)

# Визуализация результатов
plt.figure(figsize=(12, 6))
plt.plot(returns_multi.index, Rt[:, 0, 1], label=f'{tickers[0]}-{tickers[1]}')
plt.plot(returns_multi.index, Rt[:, 0, 2], label=f'{tickers[0]}-{tickers[2]}')
plt.plot(returns_multi.index, Rt[:, 1, 2], label=f'{tickers[1]}-{tickers[2]}')
plt.title('DCC Условные корреляции между активами')
plt.xlabel('Дата')
plt.ylabel('Корреляция')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

# Вывод результатов для GARCH моделей
for i, ticker in enumerate(tickers):
    print(f"\nРезультаты GARCH(1,1) для {ticker}:")
    print(garch_results[i].summary())

График DCC-условных корреляций между SP500, NASDAQ, Long-Term Treasuries

Рис. 7: График DCC-условных корреляций между SP500, NASDAQ, Long-Term Treasuries

Результаты GARCH(1,1) для SPY:
                        Constant Mean - GARCH Model Results                         
====================================================================================
Dep. Variable:                          SPY   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                            GARCH   Log-Likelihood:               -4115.15
Distribution:      Standardized Student's t   AIC:                           8240.30
Method:                  Maximum Likelihood   BIC:                           8270.77
                                              No. Observations:                 3271
Date:                      Mon, May 05 2025   Df Residuals:                     3270
Time:                              22:05:49   Df Model:                            1
                                Mean Model                                
==========================================================================
                 coef    std err          t      P>|t|    95.0% Conf. Int.
--------------------------------------------------------------------------
mu             0.0995  1.113e-02      8.942  3.819e-19 [7.772e-02,  0.121]
                              Volatility Model                              
============================================================================
                 coef    std err          t      P>|t|      95.0% Conf. Int.
----------------------------------------------------------------------------
omega          0.0238  5.204e-03      4.572  4.831e-06 [1.359e-02,3.399e-02]
alpha[1]       0.1844  2.185e-02      8.443  3.094e-17     [  0.142,  0.227]
beta[1]        0.8131  1.857e-02     43.796      0.000     [  0.777,  0.849]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu             5.2691      0.481     10.963  5.729e-28 [  4.327,  6.211]
========================================================================

Covariance estimator: robust
езультаты GARCH(1,1) для QQQ:
                        Constant Mean - GARCH Model Results                         
====================================================================================
Dep. Variable:                          QQQ   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                            GARCH   Log-Likelihood:               -4847.24
Distribution:      Standardized Student's t   AIC:                           9704.48
Method:                  Maximum Likelihood   BIC:                           9734.94
                                              No. Observations:                 3271
Date:                      Mon, May 05 2025   Df Residuals:                     3270
Time:                              22:05:49   Df Model:                            1
                               Mean Model                               
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
mu             0.1358  1.456e-02      9.332  1.040e-20 [  0.107,  0.164]
                              Volatility Model                              
============================================================================
                 coef    std err          t      P>|t|      95.0% Conf. Int.
----------------------------------------------------------------------------
omega          0.0315  7.548e-03      4.175  2.983e-05 [1.672e-02,4.631e-02]
alpha[1]       0.1557  1.835e-02      8.486  2.132e-17     [  0.120,  0.192]
beta[1]        0.8403  1.630e-02     51.542      0.000     [  0.808,  0.872]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu             5.2593      0.477     11.018  3.137e-28 [  4.324,  6.195]
========================================================================

Covariance estimator: robust
Результаты GARCH(1,1) для TLT:
                        Constant Mean - GARCH Model Results                         
====================================================================================
Dep. Variable:                          TLT   R-squared:                       0.000
Mean Model:                   Constant Mean   Adj. R-squared:                  0.000
Vol Model:                            GARCH   Log-Likelihood:               -4164.21
Distribution:      Standardized Student's t   AIC:                           8338.42
Method:                  Maximum Likelihood   BIC:                           8368.88
                                              No. Observations:                 3271
Date:                      Mon, May 05 2025   Df Residuals:                     3270
Time:                              22:05:49   Df Model:                            1
                                  Mean Model                                 
=============================================================================
                 coef    std err          t      P>|t|       95.0% Conf. Int.
-----------------------------------------------------------------------------
mu             0.0202  1.370e-02      1.472      0.141 [-6.693e-03,4.703e-02]
                              Volatility Model                              
============================================================================
                 coef    std err          t      P>|t|      95.0% Conf. Int.
----------------------------------------------------------------------------
omega          0.0127  4.587e-03      2.773  5.555e-03 [3.729e-03,2.171e-02]
alpha[1]       0.0634  1.129e-02      5.614  1.977e-08 [4.124e-02,8.548e-02]
beta[1]        0.9221  1.478e-02     62.393      0.000     [  0.893,  0.951]
                              Distribution                              
========================================================================
                 coef    std err          t      P>|t|  95.0% Conf. Int.
------------------------------------------------------------------------
nu            15.6916      4.135      3.795  1.476e-04 [  7.588, 23.795]
========================================================================

Covariance estimator: robust

Заключение

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

👉🏻  EGARCH, TGARCH, FIGARCH для моделирования асимметричной волатильности

Ключевые выводы:

  1. Модели GARCH успешно учитывают ключевые свойства финансовой волатильности: кластеризацию, асимметрию реакции на шоки, персистентность и тяжелые хвосты распределения доходностей. Даже базовая модель GARCH(1,1) часто оказывается достаточной для описания динамики волатильности, демонстрируя высокую точность прогнозирования.
  2. Модели EGARCH и GJR-GARCH позволяют учесть асимметричный эффект волатильности, когда негативные шоки оказывают более сильное влияние, чем позитивные.
  3. Использование распределения Стьюдента вместо нормального улучшает качество модели, так как лучше описывает экстремальные колебания рынка.
  4. GARCH-модели широко применяются в управлении рисками (расчет VaR, Expected Shortfall), ценообразовании опционов и разработке торговых стратегий. Прогнозирование условной волатильности помогает инвесторам и трейдерам принимать более обоснованные решения.

Ограничения и альтернативы:

  1. GARCH-модели требуют больших объемов данных для устойчивой оценки параметров;
  2. В условиях экстремальных рыночных событий (например, финансовых кризисов) их прогнозная сила не так высока;
  3. Для многомерного анализа (ковариации активов) применяются DCC-GARCH и другие расширения;
  4. Диагностика модели (анализ остатков, тесты на автокорреляцию) критически важна для обеспечения надежности результатов.