4、波动率预测模型:GARCH模型族、HAR-RV模型、隐含波动率预测、机器学习波动率预测
波动率预测,说白了就是给市场波动把脉。你想想看,做商品期权交易,最怕什么?不是方向看错,而是波动率突然放大把你打穿。我做了这么多年量化,见过太多人把精力花在预测价格方向上,结果被波动率这把暗箭射下马来。
这一章,咱们聊聊四种主流的波动率预测方法。它们各有各的脾气,也各有各的适用场景。我个人习惯是,根据交易周期和品种特性,在它们之间切换使用。
核心观点:没有完美的预测模型,只有最合适的组合策略。波动率预测的本质,是在历史规律与市场预期之间寻找平衡点。
4.1 GARCH模型族:波动率的自回归艺术
GARCH模型,全称是广义自回归条件异方差模型。名字挺唬人,但说白了就是:今天的波动率,跟昨天的波动率有关,也跟昨天的意外冲击有关。
我记得刚入行那会儿,用最基础的GARCH(1,1)模型做螺纹钢的波动率预测。效果嘛,说不上惊艳,但胜在稳定。后来发现,商品市场有个特点——利空消息带来的波动往往比利好消息更大。这时候,标准GARCH就不够用了。
我的经验:做商品波动率预测,EGARCH或GJR-GARCH往往比标准GARCH更实用。因为它们能捕捉到"杠杆效应"——价格下跌时波动率上升得更快。这在原油、铜这些品种上特别明显。
来看看一个简单的GARCH(1,1)实现:
import arch
from arch import arch_model
# 假设 returns 是日收益率序列
model = arch_model(returns, vol='Garch', p=1, q=1)
result = model.fit(update_freq=5)
# 预测未来5天的波动率
forecast = result.forecast(horizon=5)
predicted_vol = np.sqrt(forecast.variance.values[-1, :])
print(f"预测波动率: {predicted_vol}")
这里有个坑,我曾经踩过——参数估计的稳定性问题。GARCH模型的参数对数据窗口长度很敏感。我建议至少用500个以上的交易日数据来拟合,而且每滚动100天就要重新校准一次参数。
注意:GARCH模型对异常值非常敏感。如果数据里有一个极端跳空,模型参数可能会被严重扭曲。我习惯在建模前先做一步"极端值缩尾处理",把超过3倍标准差的数据拉回来。
4.2 HAR-RV模型:简单粗暴但有效
HAR-RV模型,全称是异质自回归已实现波动率模型。这名字听着复杂,但逻辑其实特别朴素:不同时间维度的交易者,对波动率的影响不同。
日频交易者看一天,周频交易者看一周,月频交易者看一个月。HAR-RV就把这三个维度的已实现波动率放在一起做回归。说白了,就是用过去1天、5天、22天的波动率,来预测明天的波动率。
我个人特别喜欢这个模型,原因有三:
- 计算简单——不需要复杂的迭代估计,OLS一把梭
- 解释性强——每个系数都有明确的交易含义
- 预测效果好——尤其在商品期货上,往往比GARCH更准
来看看代码实现:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
# 假设 rv_daily, rv_weekly, rv_monthly 是已计算好的已实现波动率
# 构建特征矩阵
X = pd.DataFrame({
'RV_d': rv_daily.shift(1), # 滞后1天的日波动率
'RV_w': rv_weekly.shift(1), # 滞后1天的周波动率
'RV_m': rv_monthly.shift(1) # 滞后1天的月波动率
}).dropna()
y = rv_daily.loc[X.index] # 目标变量:今天的日波动率
model = LinearRegression()
model.fit(X, y)
print(f"系数: 日={model.coef_[0]:.3f}, 周={model.coef_[1]:.3f}, 月={model.coef_[2]:.3f}")
实战技巧:我在做HAR-RV时,发现一个规律——对于流动性好的品种(如螺纹钢、铁矿石),日频系数的权重往往最大;而对于流动性差的品种(如某些化工品),周频和月频的系数反而更显著。这背后的逻辑是:流动性差的品种,价格发现过程更慢,波动率的记忆性更强。
4.3 隐含波动率预测:市场说了算
前面两种方法,用的都是历史数据。但市场交易的是什么?是预期。隐含波动率,就是从期权价格里反推出来的市场对未来波动率的集体预期。
你想想看,如果市场普遍认为下周会有大行情,那么期权价格就会变贵,隐含波动率就会上升。这玩意儿,说白了就是市场的"恐慌指数"。
但这里有个问题——隐含波动率往往存在系统性偏差。我观察过很多商品期权,发现隐含波动率通常比实际实现波动率高10%-20%。为什么?因为期权卖方要收"风险溢价"。
我的做法:直接用隐含波动率做预测时,我会先做一个"偏差校正"。具体来说,就是计算过去N天隐含波动率与实际波动率的比值,然后用这个比值去调整当前的隐含波动率。这样得到的预测值,往往更贴近实际。
举个例子:
# 偏差校正示例
implied_vol = 0.25 # 当前隐含波动率
realized_vol_history = [0.20, 0.22, 0.19, 0.21] # 过去实际波动率
implied_vol_history = [0.24, 0.26, 0.23, 0.25] # 过去隐含波动率
bias_ratio = np.mean(realized_vol_history) / np.mean(implied_vol_history)
adjusted_implied_vol = implied_vol * bias_ratio
print(f"原始隐含波动率: {implied_vol:.2%}")
print(f"校正后隐含波动率: {adjusted_implied_vol:.2%}")
注意:隐含波动率预测在极端行情下会失效。比如2020年原油暴跌时,隐含波动率飙升到100%以上,但实际波动率只有60%。这时候如果盲目相信隐含波动率,你会被严重误导。我的经验是:当隐含波动率超过历史90%分位数时,就要打折扣了。
4.4 机器学习波动率预测:黑箱里的新武器
最后聊聊机器学习。说实话,我一开始对ML做波动率预测是持怀疑态度的。总觉得这玩意儿是个黑箱,解释不了。但后来发现,在某些场景下,ML确实能抓到传统模型抓不到的模式。
常用的方法包括:
- LSTM——擅长捕捉时间序列中的长期依赖关系
- XGBoost——对特征交互非常敏感,适合加入多种辅助特征
- 随机森林——稳健性好,不容易过拟合
我个人最常用的是XGBoost。为什么?因为它既能处理非线性关系,又能给出特征重要性,让我知道哪些因子在起作用。
来看看一个简单的XGBoost波动率预测框架:
import xgboost as xgb
from sklearn.model_selection import train_test_split
# 构建特征:包括历史波动率、成交量、持仓量、基差等
features = ['RV_d', 'RV_w', 'RV_m', 'volume_change', 'open_interest_change', 'basis']
X = data[features]
y = data['future_RV'] # 未来一天的已实现波动率
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = xgb.XGBRegressor(
n_estimators=200,
max_depth=4,
learning_rate=0.05,
early_stopping_rounds=20
)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
# 特征重要性
importance = pd.DataFrame({
'feature': features,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
print(importance)
关键发现:我在做ML波动率预测时,发现加入"隔夜跳空"和"日内波动率斜率"这两个特征后,预测精度提升了将近15%。这说明市场在开盘前后的信息释放,对当天波动率有很强的预测能力。
不过,机器学习也有它的短板。最大的问题是过拟合。我曾经在一个品种上把模型调得特别漂亮,回测R²高达0.6,结果一上实盘就崩了。后来发现,模型学到了某些市场微观结构的噪声,而不是真正的波动率规律。
避坑指南:做ML波动率预测,一定要做"滚动时间窗口验证"。不要用随机打乱的数据做交叉验证,那会给你虚假的乐观。正确的做法是:用前70%的数据训练,后30%的数据测试,然后不断滚动窗口。
4.5 模型融合:把鸡蛋放在不同的篮子里
讲了四种方法,你可能会问:到底哪个最好?我的答案是:没有最好,只有最合适。
我个人习惯的做法是模型融合。把GARCH、HAR-RV、隐含波动率、ML模型的预测结果,按照某种权重组合起来。这样做的好处是:
- 单个模型在特定市场环境下可能失效,但多个模型同时失效的概率很低
- 不同模型捕捉到的信息维度不同,融合后信息更全面
最简单的融合方式就是等权平均。但如果你想要更精细一点,可以用动态权重——根据每个模型近期的预测误差来调整权重。误差大的模型,权重自动降低。
我的融合策略:对于日频交易,我通常给HAR-RV和隐含波动率各30%的权重,GARCH和ML各20%。对于周频交易,我会提高HAR-RV的权重到40%,因为它的中长期预测更稳定。记住,权重不是一成不变的,要根据市场状态动态调整。
嗯,波动率预测这块内容就聊到这儿。四种方法各有千秋,关键是要理解它们的适用边界。GARCH适合捕捉波动率聚集,HAR-RV胜在简单稳健,隐含波动率反映市场预期,机器学习则能挖掘更深层的非线性关系。把它们组合起来用,才是真正的实战之道。
公众号:蓝海资料掘金营,微信deep3321