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。我一般按这个流程来:

  1. 残差检验:标准化残差不能有自相关(Ljung-Box检验p值>0.05)
  2. ARCH效应检验:残差平方也不能有自相关
  3. 分布假设:国债期货收益率通常有厚尾,用Student-t分布比正态分布好
  4. 回测验证:用滚动窗口预测波动率,看实际覆盖率和预测误差
# 残差诊断
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家族选择路线图:

GARCH模型家族选择路线图 收益率序列 是否存在ARCH效应? 是否存在杠杆效应/不对称性? GARCH(1,1) EGARCH 或GJR-GARCH 模型诊断:残差检验 → 回测验证 → 策略适配

3.6 实战中的选择建议

场景 推荐模型 理由
国债期货做市(正常市场) GARCH(1,1) 简单稳定,计算快,适合高频做市
国债期货做市(波动期) GJR-GARCH 能捕捉负面冲击的放大效应
跨品种套利 EGARCH 对数形式适合多资产组合
风险价值(VaR)计算 GJR-GARCH + Student-t 厚尾分布更准确

我的建议:别纠结于选哪个模型最好。把三个模型都跑一遍,看哪个的残差最干净、预测最准。做市交易里,稳健性比理论完美更重要

嗯,GARCH家族的内容就这些。记住一句话:模型是工具,不是真理。真正重要的是你如何用它来管理做市风险。下次咱们聊聊波动率预测的实战技巧。

专注资料整理