3. GARCH模型家族实战:从原理到代码
波动率建模,说白了就是给市场情绪拍X光片。我做了这么多年国债期货做市,最深的体会就是:波动率不是常数,它有记忆,会聚集,还会不对称。今天咱们就聊聊GARCH家族那点事。
核心观点:GARCH(1,1)是基准,EGARCH处理杠杆效应,GJR-GARCH捕捉好坏消息的不对称冲击。选哪个?看你的数据说话。
3.1 GARCH(1,1):波动率建模的"Hello World"
GARCH(1,1)的数学形式很简单:
σ²_t = ω + α·ε²_{t-1} + β·σ²_{t-1}
其中α+β衡量波动率的持续性。如果α+β接近1,说明冲击衰减很慢——这在国债期货里很常见。我记得有一次做10年期国债期货的波动率分析,α+β=0.98,一个突发事件的影响能持续好几天。
Python实现其实就几行代码:
import numpy as np
import pandas as pd
from arch import arch_model
# 加载数据
returns = pd.read_csv('国债期货日收益率.csv', index_col=0, parse_dates=True)
# 拟合GARCH(1,1)
model = arch_model(returns, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
print(result.summary())
我的习惯:拟合后一定检查α+β是否小于1。如果大于等于1,说明模型不稳定,需要换参数或者用IGARCH。
3.2 EGARCH:捕捉杠杆效应
为什么需要EGARCH?因为市场对坏消息更敏感。你想想看,国债期货大跌时,波动率飙升的速度远快于大涨时。这就是杠杆效应。
EGARCH的log形式保证了波动率永远为正:
ln(σ²_t) = ω + α·(|z_{t-1}| - E|z_{t-1}|) + γ·z_{t-1} + β·ln(σ²_{t-1})
这里的γ就是杠杆系数。如果γ为负,说明坏消息(负的z)会放大波动率。我在2020年3月疫情冲击时做过测试,EGARCH的γ显著为负,而GARCH(1,1)完全捕捉不到这个特征。
# EGARCH实现
egarch_model = arch_model(returns, vol='EGARCH', p=1, q=1)
egarch_result = egarch_model.fit(disp='off')
print(egarch_result.params['gamma[1]']) # 看杠杆系数
避坑指南:我曾经遇到过EGARCH拟合不收敛的情况。后来发现是初始值设置有问题。建议用GARCH(1,1)的结果作为EGARCH的初始值,能大幅提高收敛速度。
3.3 GJR-GARCH:不对称性的另一种解法
GJR-GARCH的思路更直接——给坏消息加个"惩罚项":
σ²_t = ω + α·ε²_{t-1} + γ·I_{t-1}·ε²_{t-1} + β·σ²_{t-1}
其中I_{t-1}是示性函数,当ε_{t-1} < 0时取1。γ就是不对称系数。如果γ显著为正,说明坏消息确实比好消息影响更大。
我个人更喜欢GJR-GARCH,因为它直观。你想想看,做市商最怕的就是突然的负面冲击,GJR-GARCH能帮我们量化这种风险。
# GJR-GARCH实现
gjrgarch_model = arch_model(returns, vol='GARCH', p=1, o=1, q=1)
gjrgarch_result = gjrgarch_model.fit(disp='off')
print(gjrgarch_result.params['gamma[1]'])
3.4 模型选择与诊断:别光看AIC
选模型不能只看AIC/BIC。我一般按这个流程来:
- 残差检验:标准化残差不能有自相关(Ljung-Box检验p值>0.05)
- ARCH效应检验:残差平方也不能有自相关
- 分布假设:国债期货收益率通常有厚尾,用Student-t分布比正态分布好
- 回测验证:用滚动窗口预测波动率,看实际覆盖率和预测误差
# 残差诊断
std_resid = result.resid / result.conditional_volatility
# Ljung-Box检验
from statsmodels.stats.diagnostic import acorr_ljungbox
lb_test = acorr_ljungbox(std_resid, lags=[10], return_df=True)
print(lb_test)
# ARCH效应检验
arch_test = acorr_ljungbox(std_resid**2, lags=[10], return_df=True)
print(arch_test)
实战经验:有一次我同时拟合了三个模型,GARCH(1,1)的AIC最低,但EGARCH的残差更白噪声。最后我选了EGARCH,因为做市策略对残差自相关特别敏感。记住:模型诊断比模型选择更重要。
3.5 知识体系总览
下面这张图是我自己总结的GARCH家族选择路线图:
3.6 实战中的选择建议
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 国债期货做市(正常市场) | GARCH(1,1) | 简单稳定,计算快,适合高频做市 |
| 国债期货做市(波动期) | GJR-GARCH | 能捕捉负面冲击的放大效应 |
| 跨品种套利 | EGARCH | 对数形式适合多资产组合 |
| 风险价值(VaR)计算 | GJR-GARCH + Student-t | 厚尾分布更准确 |
我的建议:别纠结于选哪个模型最好。把三个模型都跑一遍,看哪个的残差最干净、预测最准。做市交易里,稳健性比理论完美更重要。
嗯,GARCH家族的内容就这些。记住一句话:模型是工具,不是真理。真正重要的是你如何用它来管理做市风险。下次咱们聊聊波动率预测的实战技巧。