4、波动率预测模型基础:GARCH模型家族介绍、模型参数估计、预测效果评估
波动率这东西,说白了就是市场的「脾气」。有时候市场很温和,波动率低得让人打瞌睡;有时候突然暴怒,一天能给你干出几个标准差。我做了这么多年量化,最深的体会就是——预测波动率比预测方向靠谱得多。方向猜错了可能亏钱,但波动率猜错了,你的仓位管理和风控全得崩。
这一章,咱们就聊聊怎么用GARCH模型家族来预测波动率。嗯,别被名字吓到,其实没那么玄乎。
4.1 为什么是GARCH?
先问个问题:你观察过金融时间序列吗?有没有发现一个现象——大的波动后面往往跟着大的波动,小的波动后面跟着小的波动?这就是所谓的「波动率聚集效应」。
我刚开始做回测时,天真地以为波动率是常数。结果呢?策略在低波动期表现完美,一到高波动期直接爆仓。后来我才明白,波动率是会变的,而且有记忆。
GARCH模型就是用来捕捉这种记忆的。它假设今天的波动率不仅受昨天随机冲击的影响,还受昨天波动率本身的影响。说白了,就是「昨天的波动率会影响今天的波动率」。
4.2 GARCH模型家族介绍
GARCH模型家族其实挺庞大的,但常用的就那么几个。我按自己的经验给你捋一捋:
4.2.1 基础款:GARCH(1,1)
这是最经典的,也是我入门的第一个模型。公式长这样:
σ²_t = ω + α * ε²_{t-1} + β * σ²_{t-1}
解释一下:
- σ²_t:今天的条件方差(波动率的平方)
- ω:长期平均波动率水平
- ε²_{t-1}:昨天的市场冲击(残差平方)
- σ²_{t-1}:昨天的波动率
- α:对市场冲击的敏感度
- β:波动率的衰减速度
我记得第一次用GARCH(1,1)拟合沪深300指数时,α+β接近0.98。这意味着什么?波动率的冲击会持续很久,不会马上消失。嗯,这跟我的交易直觉完全吻合——市场恐慌情绪往往要持续好几天。
4.2.2 不对称款:EGARCH与GJR-GARCH
你有没有发现,市场下跌时的波动率往往比上涨时更大?这就是所谓的「杠杆效应」。基础GARCH模型处理不了这个,因为它只考虑冲击的大小,不考虑方向。
这时候就需要不对称模型了:
- EGARCH:用对数形式建模,能捕捉正负冲击的不对称性。我习惯用它来建模股指期货,因为下跌时的波动率飙升特别明显。
- GJR-GARCH:通过引入哑变量来区分正负冲击。说白了就是给下跌冲击加个权重,让它对波动率的影响更大。
我曾经用EGARCH模型回测过2015年股灾期间的数据。结果发现,负冲击的系数是正冲击的3倍多。这说明市场对坏消息的反应远大于好消息。如果你做期权交易,这个信息非常值钱——虚值看跌期权的隐含波动率往往被低估。
4.2.3 长记忆款:FIGARCH
有些波动率序列的衰减速度特别慢,慢到像是有「长记忆」。比如VIX指数,它的自相关函数衰减得非常缓慢。这时候用FIGARCH(分整GARCH)更合适。
不过说实话,我在实际项目中很少用FIGARCH。原因很简单——参数估计太复杂,而且对样本量要求很高。如果你只有几百个交易日的数据,建议还是老老实实用GARCH(1,1)或EGARCH。
4.3 模型参数估计
参数估计这块,我踩过不少坑。最常用的方法是最大似然估计(MLE)。简单说,就是找一组参数,让当前数据出现的概率最大。
具体步骤:
- 设定均值方程:通常用AR(1)或常数均值。我个人习惯用常数均值,因为波动率模型的重点在方差,均值搞太复杂容易过拟合。
- 设定方差方程:选择GARCH的具体形式(GARCH、EGARCH等)。
- 假设残差分布:常用正态分布或t分布。我建议用t分布,因为金融数据往往有厚尾特征。
- 最大化似然函数:用数值优化算法(如BFGS)求解。
代码实现其实不复杂,以Python的arch库为例:
from arch import arch_model
# 假设returns是收益率序列
model = arch_model(returns, vol='Garch', p=1, q=1, dist='t')
result = model.fit(update_freq=5)
print(result.summary())
arch库默认的初始值。
4.4 预测效果评估
模型建好了,参数也估了,怎么知道它好不好?我一般从三个维度来评估:
4.4.1 统计检验
- Ljung-Box检验:检查残差是否还有自相关。如果有,说明模型没捕捉到所有信息。
- ARCH-LM检验:检查残差是否还有ARCH效应。如果还有,说明模型不够充分。
我习惯把这两个检验放在模型拟合后立刻做。如果通不过,我会考虑增加阶数或换模型。
4.4.2 预测误差指标
用历史数据做滚动预测,然后比较预测波动率和实际波动率。常用指标:
| 指标 | 公式 | 说明 |
|---|---|---|
| RMSE | √(mean((σ_pred - σ_real)²)) | 对大误差惩罚较重 |
| MAE | mean(|σ_pred - σ_real|) | 更稳健,不受极端值影响 |
| QLIKE | mean(ln(σ²_pred) + σ²_real/σ²_pred) | 对波动率预测的损失函数更合理 |
我个人最常用QLIKE。为什么?因为RMSE和MAE需要知道「真实波动率」,但真实波动率是不可观测的。我们用已实现波动率(RV)来近似,但RV本身就有测量误差。QLIKE对测量误差不那么敏感。
4.4.3 经济价值评估
这是我最看重的。模型好不好,最终要看能不能赚钱。我会把波动率预测用到实际策略中:
- 期权定价:用预测波动率替代历史波动率,看定价误差是否缩小。
- 风险预算:根据预测波动率动态调整仓位。波动率高时减仓,低时加仓。
- 波动率套利:比较预测波动率和隐含波动率,寻找套利机会。
我记得有一次,我用EGARCH预测的波动率来做沪深300期权的Delta对冲。结果发现,用预测波动率比用历史波动率,对冲误差降低了约15%。虽然不多,但在高频对冲中,这15%就是实打实的利润。
4.5 本章知识体系
说了这么多,我画个图帮你梳理一下:
这张图把GARCH模型家族的知识体系串起来了。从核心目标出发,到模型选择、参数估计、效果评估,最后落到实际应用。你想想看,每一步都有坑,但也都有对应的解决办法。
最后说一句:模型再漂亮,也要经得起回测的检验。我见过太多人沉迷于复杂的模型,结果回测一跑,还不如简单的GARCH(1,1)。记住,在量化交易里,简单有效才是王道。
公众号:蓝海资料掘金营,微信deep3321