4、GARCH模型原理:在ARCH基础上引入滞后条件方差项
好,咱们接着聊。上一章我们把ARCH模型讲透了,你可能会问:那为什么还要搞个GARCH出来?
说白了,ARCH模型有个硬伤——它要用很多阶数才能把波动率的记忆性刻画清楚。比如你处理日度收益率数据,有时候需要ARCH(12)甚至ARCH(20)才能拟合好。参数一多,估计就不稳定了,而且容易过拟合。
我记得2018年做股指期货波动率预测时,试过ARCH(15),结果AIC和BIC都大得吓人。后来换成GARCH(1,1),只用3个参数,效果反而更好。这就是GARCH的魅力所在。
4.1 从ARCH到GARCH:一个自然的扩展
ARCH(q)模型把条件方差写成过去残差平方的线性组合:
σ²_t = ω + α₁ε²_{t-1} + α₂ε²_{t-2} + ... + α_qε²_{t-q}
但这里有个问题:如果波动率有长期记忆,q就得取很大。Bollerslev在1986年想了个聪明的办法——把过去的条件方差也加进来。就像你预测今天的天气,不光看昨天的实际温度,还要看昨天的预报值。
GARCH(p,q)模型的标准形式:
σ²_t = ω + Σα_i·ε²_{t-i} + Σβ_j·σ²_{t-j}
其中:
- ω > 0(常数项)
- α_i ≥ 0(ARCH系数,i=1,...,q)
- β_j ≥ 0(GARCH系数,j=1,...,p)
嗯,这里要注意:所有系数必须非负,这是为了保证条件方差始终为正。我在项目中见过有人跑出负的β系数,结果预测的波动率变成负数,那可就闹笑话了。
4.2 最常用的GARCH(1,1)模型
实际应用中,GARCH(1,1)是绝对的主力。为什么?因为它简单、有效、稳定。
σ²_t = ω + α·ε²_{t-1} + β·σ²_{t-1}
你看,就三个参数:ω、α、β。α衡量新信息对波动率的影响,β衡量波动率的持续性。
核心解读:
- α(ARCH项):反映市场对新信息的反应速度。α越大,说明新信息对波动率的冲击越强。
- β(GARCH项):反映波动率的记忆性。β越大,波动率衰减越慢。
- α+β:这个和非常关键,它衡量波动率的持续性。
我曾经帮一家私募做风控模型,他们用GARCH(1,1)预测沪深300的日波动率。结果发现α+β接近0.99,说明波动率冲击要持续很久才能消散。这其实符合A股的特征——一个大利空出来,市场要震荡好几天。
4.3 记忆性:GARCH为什么比ARCH强?
你想想看,ARCH模型里,t时刻的波动率只依赖于过去q期的残差平方。一旦超过q期,前面的信息就全丢了。这就像你只记得最近3天的新闻,3天前的全忘了。
GARCH不一样。通过递归代入,你会发现:
σ²_t = ω/(1-β) + α·Σβ^{k-1}·ε²_{t-k}
说白了,GARCH(1,1)等价于一个无限阶的ARCH模型,但参数只有3个。所有过去的残差信息都会影响当前波动率,只是影响程度按指数衰减。这就是GARCH的"长记忆性"——用很少的参数,捕捉很长的记忆。
我的经验:
做高频数据时,GARCH的记忆性特别明显。比如5分钟级别的股指期货数据,β往往在0.9以上。这意味着半小时前的波动冲击,到现在还有超过50%的影响力(0.9^6 ≈ 0.53)。
4.4 平稳性条件:模型能跑的前提
GARCH模型不是随便设参数就能用的。它必须满足平稳性条件,否则预测会发散——波动率越预测越大,最后变成无穷大。
对于GARCH(p,q),平稳性条件是:
Σα_i + Σβ_j < 1
对于GARCH(1,1)来说,就是:
α + β < 1
避坑指南:
我曾经在回测时发现,某段行情下GARCH(1,1)的α+β算出来是1.02。当时没在意,结果预测的波动率一路飙升,三天后变成了天文数字。后来查资料才知道,这叫"IGARCH"现象——α+β=1时,波动率冲击是永久性的,模型不再均值回归。
遇到这种情况,要么换数据区间,要么考虑用IGARCH模型专门处理。
4.5 参数估计:最大似然法的实战要点
GARCH模型通常用最大似然估计(MLE)。假设残差服从正态分布,对数似然函数为:
L = -0.5·Σ[ln(2π) + ln(σ²_t) + ε²_t/σ²_t]
实际估计时,我建议你注意几点:
- 初始值设置:ω可以用样本方差乘以(1-α-β)来初始化,α和β可以设0.1和0.8。
- 约束处理:在优化时加上边界约束,确保所有参数非负且α+β<1。
- 分布假设:如果数据有厚尾特征(金融数据常见),用t分布或GED分布替代正态分布。
嗯,说到分布假设,我记得有一次用正态分布拟合某只股票的日收益率,结果残差的峰度是5.8,远高于正态的3。换成t分布后,似然值提升了将近200点,预测效果也明显改善。
4.6 GARCH(p,q)知识体系总览
下面这张图帮你理清GARCH模型的核心逻辑:
4.7 一个简单的Python实现
最后,给你看一段GARCH(1,1)的估计代码。我用的是arch库,它封装得很好:
import numpy as np
import pandas as pd
from arch import arch_model
# 模拟数据
np.random.seed(42)
n = 1000
omega = 0.1
alpha = 0.15
beta = 0.8
# 生成GARCH(1,1)序列
sigma2 = np.zeros(n)
eps = np.zeros(n)
sigma2[0] = omega / (1 - alpha - beta)
eps[0] = np.sqrt(sigma2[0]) * np.random.normal()
for t in range(1, n):
sigma2[t] = omega + alpha * eps[t-1]**2 + beta * sigma2[t-1]
eps[t] = np.sqrt(sigma2[t]) * np.random.normal()
# 拟合GARCH(1,1)模型
model = arch_model(eps, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
print(result.summary())
跑完这段代码,你会看到估计出的ω、α、β跟真实值很接近。这就是GARCH的魅力——用简单的模型,抓住复杂的波动率动态。
好了,GARCH的原理就讲到这里。记住三个关键词:记忆性、持续性、平稳性。下次你看到波动率预测结果,先检查α+β是不是小于1,这是模型靠谱的第一道防线。