Модели GARCH (Generalized Autoregressive Conditional Heteroskedasticity) представляют собой мощный инструмент для анализа и прогнозирования волатильности. И хотя данные модели уже не новы (появились в конце 1980х гг), и не лишены недостатков и ограничений, многие финансовые институты и аналитики по-прежнему их широко применяют, а понимание внутреннего механизма этих моделей создает прочный фундамент для разработки более совершенных методов оценки волатильности.
В этой статье я расскажу о теории GARCH-моделей, рассмотрю их математические основы, различные модификации, практическое применение и реализацию на Python.
Почему важно моделировать волатильность
Волатильность в финансах обычно определяется как стандартное отклонение или дисперсия доходности актива за определенный период времени. Она является мерой риска и неопределенности на рынке. Высокая волатильность означает, что цена актива может значительно колебаться в любом направлении, что несет как потенциал для существенной прибыли, так и риск значительных убытков.
Точное моделирование волатильности имеет решающее значение по нескольким причинам:
- Управление рисками — Точные оценки волатильности помогают финансовым институтам рассчитывать показатели риска, такие как Value at Risk (VaR) и Expected Shortfall (ES), что критически важно для соблюдения регуляторных требований и обеспечения устойчивости финансовой системы;
- Ценообразование опционов — Модели волатильности являются фундаментальным компонентом в алгоритмах ценообразования опционов. Чем точнее прогноз волатильности, тем справедливее оценка опциона;
- Оптимизация портфеля — Модели волатильности позволяют более точно оценивать ковариации между различными активами, что критически важно для эффективной оптимизации инвестиционного портфеля;
- Торговые стратегии — Многие торговые стратегии основаны на прогнозировании волатильности, включая стратегии волатильного арбитража и торговлю опционами.
Ключевая проблема моделирования волатильности заключается в том, что она не является непосредственно наблюдаемой величиной — мы можем лишь оценивать ее на основе исторических данных. Более того, волатильность финансовых рынков обладает рядом характерных свойств, которые делают ее моделирование нетривиальной задачей:
- Кластеризация волатильности — Периоды высокой волатильности имеют тенденцию группироваться вместе, как и периоды низкой волатильности. Это означает, что волатильность проявляет автокорреляцию;
- Асимметрия влияния новостей — Негативные шоки (падение цен) обычно оказывают более сильное влияние на волатильность, чем позитивные шоки той же магнитуды;
- Возврат к среднему — Волатильность имеет тенденцию возвращаться к некоторому долгосрочному среднему уровню;
- Толстые хвосты распределения — Доходности финансовых активов часто проявляют leptokurtosis, то есть имеют более тяжелые хвосты, чем нормальное распределение.
В своей практике я наблюдал, что понимание этих особенностей волатильности критически важно для разработки эффективных моделей и стратегий на финансовых рынках.
История развития моделей волатильности
Развитие моделей волатильности прошло долгий путь, пока мы не пришли к современным GARCH моделям. Этот путь отражает эволюцию нашего понимания финансовых рынков и совершенствование математического аппарата для их анализа.
От постоянной волатильности к условной гетероскедастичности
В классических финансовых теориях, таких как модель ценообразования опционов Блэка-Шоулза (1973), волатильность рассматривалась как постоянная величина. Однако реальные рыночные данные убедительно свидетельствуют о том, что волатильность изменяется во времени, проявляя кластеризацию и другие сложные паттерны.
Первым значительным шагом в моделировании изменяющейся во времени волатильности стало введение концепции условной гетероскедастичности. В отличие от классической регрессии, где дисперсия ошибок предполагается постоянной (гомоскедастичность), в моделях с условной гетероскедастичностью дисперсия в момент времени t зависит от информации, доступной в предыдущие периоды.
Появление ARCH-моделей
Революционный прорыв в моделировании волатильности был сделан Робертом Энглом в 1982 году, когда он предложил модель ARCH (Autoregressive Conditional Heteroskedasticity). В модели ARCH условная дисперсия в текущий момент времени представляется как линейная функция квадратов прошлых значений процесса.
Математически модель ARCH(q) можно представить следующим образом:

где:
- σ(t)^2 — условная дисперсия в момент времени t;
- ω — константа (обычно положительная);
- α(i) — параметры модели, которые должны быть положительными для обеспечения положительности дисперсии;
ε(t-i) — инновации процесса (обычно предполагается, что они независимы и одинаково распределены с нулевым средним).
За разработку модели ARCH Роберт Энгл был удостоен Нобелевской премии по экономике в 2003 году, что подчеркивает значимость этого вклада в финансовую эконометрику.
Обобщение: от ARCH к GARCH
Хотя модель ARCH представляла собой огромный шаг вперед, она имела свои ограничения. В частности, для адекватного моделирования волатильности часто требовалось большое количество лагов, что приводило к сложностям в оценке параметров.
В 1986 году Тим Болерслев предложил обобщение модели ARCH, которое получило название GARCH (Generalized Autoregressive Conditional Heteroskedasticity). Ключевая идея заключалась в том, чтобы включить прошлые условные дисперсии в уравнение для текущей условной дисперсии:
![]()
где β(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) можно представить как:

где:
- μ(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) параметры имеют четкую интерпретацию:
- ω представляет базовый уровень волатильности;
- α(1) отражает влияние недавних шоков на текущую волатильность;
- β(1) отражает персистентность волатильности, то есть скорость затухания шоков.
Безусловная дисперсия
Для стационарного процесса GARCH можно вычислить безусловную дисперсию, которая представляет долгосрочный уровень волатильности. Для модели GARCH(1,1) безусловная дисперсия равна:

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

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

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

Важно отметить следующие особенности оценки параметров GARCH-моделей методом MLE:
- Рекурсивный характер вычислений — Для вычисления логарифмической функции правдоподобия необходимо рекурсивно оценивать условные дисперсии σ(t)^2, начиная с некоторых начальных значений.
- Выбор начальных значений — Результаты оценки могут зависеть от выбора начальных значений для оптимизации. Часто используют безусловную дисперсию выборки как начальное значение для σ(t)^2.
- Численная оптимизация — Максимизация логарифмической функции правдоподобия обычно требует применения численных методов оптимизации, таких как метод Ньютона-Рафсона или BFGS (Broyden–Fletcher–Goldfarb–Shanno).
Учет негауссовского распределения инноваций
Финансовые временные ряды часто характеризуются наличием тяжелых хвостов в распределении доходностей. В таких случаях предположение о нормальном распределении стандартизированных инноваций может быть неадекватным. Для учета этой особенности применяют следующие подходы:
- Распределение Стьюдента. Часто используется t-распределение n степенями свободы, которое позволяет моделировать тяжелые хвосты;
- Обобщенное распределение ошибок (GED). Еще одна альтернатива, которая включает нормальное распределение как частный случай;
- Полупараметрические подходы. В некоторых случаях используются квазиправдоподобные оценки (QMLE), когда функция правдоподобия строится на основе предположения о нормальном распределении, даже если распределение на самом деле не является нормальным.
Диагностика модели
После оценки параметров GARCH-модели критически важно провести диагностику для проверки адекватности модели. Основные диагностические тесты включают:
- Тест на автокорреляцию стандартизированных квадратичных остатков. Если модель корректно специфицирована, стандартизированные квадратичные остатки не должны проявлять автокорреляцию. Для этого применяются тесты Льюнга-Бокса или Бройша-Годфри.
- Тест на нормальность стандартизированных остатков. В зависимости от предположений модели, стандартизированные остатки z(t) должны соответствовать предполагаемому распределению. Тесты Жарка-Бера, Колмогорова-Смирнова и Q-Q графики используются для проверки.
- Информационные критерии. Критерии Акаике (AIC) и Байесовский информационный критерий (BIC) используются для сравнения различных спецификаций модели:
AIC = −2logL+2*k
BIC = −2logL+k*log(n)
где k — количество параметров модели, а n — размер выборки.
Работая с различными финансовыми данными, я убедился, что тщательная диагностика модели является необходимым шагом для обеспечения надежности оценок и прогнозов волатильности.
Реализация GARCH-моделей на Python
Теория моделей GARCH имеет мало практической ценности без умения применять ее для анализа реальных данных. В этом разделе я покажу, как реализовать различные GARCH-модели на Python с использованием популярных библиотек и как интерпретировать полученные результаты.
Основные библиотеки для моделирования GARCH
Для работы с GARCH-моделями в Python доступно несколько библиотек:
- arch — специализированная библиотека для моделирования условной гетероскедастичности;
- statsmodels — более общая библиотека для статистического моделирования, включающая функционал для GARCH-моделей;
- rugarch — Библиотека R, доступная через rpy2 в Python, предоставляющая обширный набор моделей семейства GARCH
На практике наиболее удобной оказалась библиотека arch, разработанная Кевином Шеппардом, поэтому основные примеры будут с ее использованием.
Подготовка данных для GARCH-моделирования
Перед применением GARCH-моделей необходимо провести предварительную обработку финансовых данных. Обычно эта процедура включает:
- Расчет логарифмических доходностей;
- Удаление выбросов (если они есть);
- Проверку стационарности ряда;
- Проверку наличия условной гетероскедастичности (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)

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

Рис. 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

Рис. 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}")

Рис. 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-распределением показывает более качественные результаты на биржевых данных из-за характерных тяжелых хвостов.
Реализация асимметричных моделей 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

Рис. 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}%")

Рис. 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())

Рис. 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.
Ключевые выводы:
- Модели GARCH успешно учитывают ключевые свойства финансовой волатильности: кластеризацию, асимметрию реакции на шоки, персистентность и тяжелые хвосты распределения доходностей. Даже базовая модель GARCH(1,1) часто оказывается достаточной для описания динамики волатильности, демонстрируя высокую точность прогнозирования.
- Модели EGARCH и GJR-GARCH позволяют учесть асимметричный эффект волатильности, когда негативные шоки оказывают более сильное влияние, чем позитивные.
- Использование распределения Стьюдента вместо нормального улучшает качество модели, так как лучше описывает экстремальные колебания рынка.
- GARCH-модели широко применяются в управлении рисками (расчет VaR, Expected Shortfall), ценообразовании опционов и разработке торговых стратегий. Прогнозирование условной волатильности помогает инвесторам и трейдерам принимать более обоснованные решения.
Ограничения и альтернативы:
- GARCH-модели требуют больших объемов данных для устойчивой оценки параметров;
- В условиях экстремальных рыночных событий (например, финансовых кризисов) их прогнозная сила не так высока;
- Для многомерного анализа (ковариации активов) применяются DCC-GARCH и другие расширения;
- Диагностика модели (анализ остатков, тесты на автокорреляцию) критически важна для обеспечения надежности результатов.