波动性预测:ARCH / GARCH 模型与金融时间序列

FreeGuideOnline 最新 2026-06-24

波动性预测:ARCH 与 GARCH 模型完全指南

金融时间序列往往展现出波动聚集现象——市场平静期后往往跟随着剧烈波动,而剧烈波动后又可能迎来新一轮平静。传统线性回归模型假设方差恒定,无法捕捉这种时变波动性。本教程将带你从零掌握 ARCH(自回归条件异方差)GARCH(广义自回归条件异方差) 模型,理解其原理、数学形式、建模步骤以及如何用 Python 实现波动率预测。


1. 为什么需要波动性建模?

1.1 波动聚集与异方差性

  • 波动聚集(Volatility Clustering):金融收益率序列中,大的变动后面往往跟着大的变动(无论方向),小的变动后跟着小的变动。
  • 异方差性(Heteroskedasticity):误差项的方差不是常数,而是随时间变化。普通最小二乘法(OLS)假设同方差,忽略了时变风险。
  • 尖峰厚尾(Leptokurtic):收益分布比正态分布有更重的尾部,极端事件发生概率更高。

1.2 波动率在金融中的核心作用

  • 风险管理:VaR(在险价值)、预期损失计算依赖于对未来波动的准确估计。
  • 衍生品定价:期权定价公式(如 Black-Scholes)需要波动率作为输入。
  • 资产配置:动态调整投资组合权重需要预测协方差矩阵。
  • 策略构建:波动率择时、波动率套利等策略直接基于波动率预测。

2. 模型前的必修课:收益率序列与平稳性

2.1 对数收益率

通常使用对数收益率(连续复利收益率): [ r_t = \ln(P_t) - \ln(P_{t-1}) \times 100% ] 它具有良好的统计性质(可加性、近似正态性),是 ARCH/GARCH 建模的对象。

2.2 均值方程与残差

我们将收益率分解为可预测部分和不可预测部分: [ r_t = \mu_t + \varepsilon_t ] 其中 (\mu_t) 为条件均值(通常取简单均值、常数或 ARMA 过程),(\varepsilon_t) 为残差(扰动项)。我们的波动率模型针对的是 (\varepsilon_t) 的条件方差: [ \varepsilon_t = \sigma_t \cdot z_t ]

  • (\sigma_t^2) 是条件方差(即我们想预测的时变波动率)。
  • (z_t) 是独立同分布(i.i.d.)的随机变量,均值为 0,方差为 1,常假设为正态分布、学生 t 分布或广义误差分布(GED)。

3. ARCH 模型:自回归条件异方差

3.1 模型定义

ARCH(q) 模型由 Robert Engle 于 1982 年提出,将当前条件方差表示为过去 q 期残差平方的线性函数: [ \sigma_t^2 = \omega + \alpha_1 \varepsilon_{t-1}^2 + \alpha_2 \varepsilon_{t-2}^2 + \cdots + \alpha_q \varepsilon_{t-q}^2 ]

  • (\omega > 0),(\alpha_i \ge 0)(保证方差恒正)。
  • (\sum \alpha_i < 1)(保证协方差平稳)。
  • 大冲击((\varepsilon_{t-i}^2) 大)会直接推高未来几期的方差,产生波动聚集。

3.2 ARCH(1) 模型直观解释

对于最简单的 ARCH(1): [ \sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 ] 如果昨天发生了意外大的变动(正或负),(\varepsilon_{t-1}^2) 很大,今天的方差 (\sigma_t^2) 随之增大;如果昨天变动很小,今天的方差就趋近于基线 (\omega)。这种记忆效应只有一期,因此 ARCH(1) 对波动持续的刻画能力有限。

3.3 模型局限

  • 需要较多滞后阶数 q 才能捕捉波动的持久性,参数过多。
  • 对参数的限制严格(非负约束),估计困难。
  • 往往高估波动尖峰的持续时间。

4. GARCH 模型:广义化与记忆加持

4.1 GARCH(p, q) 表达式

Bollerslev(1986)将过去条件方差自身的滞后项引入,得到 GARCH(p, q): [ \sigma_t^2 = \omega + \sum_{i=1}^{q} \alpha_i \varepsilon_{t-i}^2 + \sum_{j=1}^{p} \beta_j \sigma_{t-j}^2 ]

  • (\omega > 0), (\alpha_i \ge 0), (\beta_j \ge 0)。
  • (\sum \alpha_i + \sum \beta_j < 1) 保证弱平稳。
  • (\sigma_{t-j}^2) 是过去预测的波动率,使模型具有更长的记忆

4.2 GARCH(1,1) —— 金融领域的“标配”

GARCH(1,1) 足以刻画绝大多数金融资产的波动率动态: [ \sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2 ]

  • (\alpha) 衡量新信息对波动率的冲击程度(ARCH 效应)。
  • (\beta) 衡量波动率自身的持续性(GARCH 效应)。
  • (\alpha + \beta) 接近 1 时,波动率冲击会持续很长时间,市场记忆长;若等于 1,则成为 IGARCH(单位根过程),波动率非平稳。
  • 无条件方差(长期平均方差)为: [ \bar{\sigma}^2 = \frac{\omega}{1 - (\alpha + \beta)} ] 当 (\alpha + \beta < 1) 时成立。

4.3 模型估计:最大似然法

给定分布假设(如正态分布),构造似然函数并最大化: [ \ell(\theta) = -\frac{T}{2} \ln(2\pi) - \frac12 \sum_{t=1}^{T} \left( \ln \sigma_t^2 + \frac{\varepsilon_t^2}{\sigma_t^2} \right) ] 通过数值优化(如 BHHH 算法)得到参数 (\omega, \alpha, \beta)。实践中常用更厚尾的分布(t 分布)提高拟合效果。


5. 模型诊断与检验

5.1 检查 ARCH 效应:LM 检验

首先对均值方程的残差平方进行 Ljung-Box 检验,看是否存在自相关;更正式的检验是 Engle 的 ARCH-LM 检验

  • 原假设:残差序列直到滞后 m 阶没有 ARCH 效应。
  • 辅助回归:(\varepsilon_t^2 = \gamma_0 + \gamma_1 \varepsilon_{t-1}^2 + \cdots + \gamma_m \varepsilon_{t-m}^2 + \text{error})
  • 若 (R^2) 显著(通过 F 或 LM 统计量),拒绝原假设,表明存在 ARCH 效应,适合建模。

5.2 模型残差诊断

拟合 GARCH 后,应检查标准化残差 (z_t = \varepsilon_t / \hat{\sigma}_t):

  • 应无显著自相关(Ljung-Box 检验)。
  • 平方标准化残差也应无显著自相关(说明波动率已被充分建模)。
  • 可进行拟合优度检验(如 Kolmogorov-Smirnov 检验)评估分布假设。

6. GARCH 模型的常用扩展

模型 全称 特点
GARCH-M GARCH-in-Mean 条件均值 (\mu_t) 中包含 (\sigma_t) 或 (\sigma_t^2),捕捉风险溢价
EGARCH 指数 GARCH 建模对数条件方差,允许非对称冲击(杠杆效应),无需非负约束
GJR-GARCH Glosten-Jagannathan-Runkle GARCH 在方差方程中加入指示函数项,刻画坏消息(负收益)比好消息带来更大波动
TGARCH 门限 GARCH 与 GJR 类似,通过门限捕捉非对称性
IGARCH 积分 GARCH (\alpha+\beta=1),冲击永久持续,应用于波动率长期预测
FIGARCH 分数积分 GARCH 引入长记忆,介于平稳 GARCH 和 IGARCH 之间

这些扩展主要用于解决两大问题:非对称性(坏消息比好消息更增加波动)和长记忆性


7. Python 实战:用 arch 库建模 S&P 500 波动率

7.1 环境准备

pip install arch pandas_datareader matplotlib

7.2 获取数据与预处理

import pandas as pd
import numpy as np
from arch import arch_model
import pandas_datareader.data as web
import datetime

# 下载 S&P 500 调整后收盘价
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2023, 12, 31)
sp500 = web.DataReader('^GSPC', 'yahoo', start, end)
returns = 100 * np.log(sp500['Adj Close']).diff().dropna()
returns.plot(title='S&P 500 Daily Returns')

7.3 构建 GARCH(1,1) 模型

# 指定均值模型为常数,波动率模型为 GARCH(1,1),误差项服从 t 分布
model = arch_model(returns, mean='Constant', vol='GARCH', p=1, q=1, dist='t')
res = model.fit(update_freq=5)
print(res.summary())

输出解读

  • omega, alpha[1], beta[1] 对应 (\omega, \alpha, \beta)。
  • lambda 为 t 分布的自由度,越小尾部越厚。
  • 确保所有参数显著(p 值 < 0.05),且 (\alpha + \beta < 1)。

7.4 模型诊断

# 标准化残差及残差平方的 Ljung-Box 检验
res.plot_diagnostics(figsize=(12,8))

应无明显自相关模式。

7.5 波动率预测与可视化

# 样本内拟合波动率
condition_vol = res.conditional_volatility
condition_vol.plot(label='Fitted Volatility', alpha=0.7)

# 样本外预测(10 天)
forecast = res.forecast(horizon=10)
pred_var = forecast.variance.dropna().T  # 注意数据形状
pred_vol = np.sqrt(pred_var)
pred_vol.plot()

8. 常见问题与最佳实践

  • 数据频率:日频及以上的数据最适合 GARCH,分钟级数据需考虑微观结构噪声,可用已实现波动率(Realized Volatility)替代 GARCH。
  • 均值方程:通常设为常数或 AR(0),因为收益率几乎不可预测,简单设置更稳健。
  • 分布选择:金融数据几乎总需厚尾分布(建议用 Skew-t 或 GED),否则会低估尾部风险。
  • 样本外评估:使用滚动时间窗口预测,通过损失函数(如 QLIKE、MSE)比较模型优劣。
  • 模型收敛:若拟合不收敛,可尝试更换优化器、调整初始值、简化模型,或使用更稳健的 arch_model(..., vol='EGARCH')

9. 总结与进阶路径

ARCH/GARCH 家族模型是波动率建模的基石。你现在应该能够:

  1. 理解波动聚集和条件异方差的概念。
  2. 写出 ARCH(q) 和 GARCH(p,q) 的数学形式及参数解释。
  3. 用 Python 实现 GARCH(1,1) 建模、诊断与预测。
  4. 认识常见扩展模型的应用场景。

下一步学习

  • 多元 GARCH(BEKK、DCC)用于资产间波动溢出。
  • 高频已实现波动率与 HAR 模型。
  • 机器学习方法(LSTM、GARCH-NN)与波动率预测的结合。
  • 随机波动率 (SV) 模型与贝叶斯估计。

掌握波动性预测,你便具备了量化风控、期权交易和资产配置的核心技能。