4、波动率曲面动态分析:曲面主成分分析(PCA)、曲面时间序列特征、波动率曲面因子模型
波动率曲面不是静态的。这一点,我在刚入行做期权做市时体会特别深——早上开盘时曲面还挺规整,到了下午某个突发事件一来,整个曲面就像被揉过的纸团。所以,动态分析才是真正考验功力的地方。
今天我们来聊聊三个核心工具:曲面主成分分析(PCA)、曲面时间序列特征、以及波动率曲面因子模型。说白了,就是怎么把曲面的变化拆解成几个可解释、可交易的成分。
4.1 曲面主成分分析(PCA)
先问一个问题:曲面每天的变化,到底是由几个独立因素驱动的?
我个人的习惯是,先对历史曲面数据做PCA。你会发现,前三个主成分通常能解释90%以上的方差。这三个成分分别对应什么?
- 第一主成分(水平因子):整体波动率水平的升降。市场恐慌时,整个曲面往上走;风平浪静时,整体往下走。
- 第二主成分(倾斜因子):短期 vs 长期波动率的相对变化。我记得有一次美联储议息会议前,短期端波动率飙升,但长期端几乎没动——这就是典型的倾斜因子在起作用。
- 第三主成分(曲度因子):波动率微笑的弯曲程度。虚值期权和实值期权的波动率相对变化。
核心结论:曲面动态变化,本质上就是这三个因子的时间序列在跳舞。
下面是我常用的PCA实现代码片段:
import numpy as np
from sklearn.decomposition import PCA
# 假设 vol_surface 是形状为 (T, N) 的矩阵
# T: 时间序列长度, N: 所有期限+行权价的组合数
vol_surface = ... # 你的数据
# 去均值
vol_centered = vol_surface - vol_surface.mean(axis=0)
# PCA
pca = PCA(n_components=3)
pca.fit(vol_centered)
# 查看解释方差比
print("解释方差比:", pca.explained_variance_ratio_)
# 主成分载荷(因子暴露)
loadings = pca.components_ # shape (3, N)
# 主成分得分(因子时间序列)
scores = pca.transform(vol_centered) # shape (T, 3)
小提示:做PCA之前,记得对数据做标准化处理。不同期限的波动率波动幅度不一样,不标准化的话,短期端会主导主成分。
4.2 曲面时间序列特征
拿到主成分得分之后,下一步就是分析这些时间序列的特征。你想想看,如果水平因子有自相关性,那明天的曲面走势就可以预测一部分。
我一般会看以下几个特征:
- 自相关结构:水平因子通常有较强的正自相关,倾斜因子则弱一些。曲度因子?嗯,它经常是白噪声。
- 波动率聚集:因子的波动率本身也有聚集效应。市场恐慌时,所有因子的波动都变大。
- 均值回复速度:水平因子回复慢,倾斜因子回复快。这个特性在做动态对冲时特别重要。
我曾经犯过一个错误:直接用AR模型预测水平因子,结果回测表现很好,实盘却一塌糊涂。后来才发现,水平因子在极端行情下有跳跃行为,AR模型根本抓不住。所以,一定要做跳跃检测。
避坑指南:我曾经忽略了对因子时间序列的平稳性检验,结果模型在样本外完全失效。先做ADF检验,再决定用差分还是水平值。
4.3 波动率曲面因子模型
有了PCA的结果和时间序列特征,我们就可以构建因子模型了。因子模型的核心思想是:用少数几个因子来解释和预测整个曲面的变化。
一个典型的因子模型长这样:
# 假设我们已经有了因子载荷和因子得分
# 预测下一期的因子得分
from statsmodels.tsa.ar_model import AutoReg
# 对水平因子做AR(1)预测
model_level = AutoReg(scores[:, 0], lags=1)
model_level_fit = model_level.fit()
pred_level = model_level_fit.predict(start=len(scores), end=len(scores))
# 对倾斜因子做VAR?或者简单点,也用AR
model_tilt = AutoReg(scores[:, 1], lags=2)
model_tilt_fit = model_tilt.fit()
pred_tilt = model_tilt_fit.predict(start=len(scores), end=len(scores))
# 曲度因子?我一般直接用历史均值
pred_curv = scores[:, 2].mean()
# 重构预测的曲面
pred_scores = np.array([pred_level, pred_tilt, pred_curv])
pred_vol_surface = (pred_scores @ loadings) + vol_surface.mean(axis=0)
这个模型虽然简单,但在实际交易中非常实用。我曾在某个商品期权项目上用这个框架做日内对冲,效果比直接用全曲面数据好得多——因为因子模型天然做了降噪。
4.4 知识体系结构图
下面这张图总结了本章的核心逻辑:
4.5 实际应用中的注意事项
最后,分享几个我在实战中踩过的坑:
- 因子旋转问题:PCA的因子方向不是固定的。今天PC1是水平因子,明天可能就变了。我建议定期重新估计因子载荷,比如每周一次。
- 极端行情下的失效:2008年、2020年3月,因子模型在极端行情下会短暂失效。因为此时曲面变化不再是线性的。我的做法是:在波动率超过某个阈值时,切换到更鲁棒的模型。
- 交易成本:因子模型给出的信号可能很频繁。别忘了把交易成本算进去,否则回测漂亮,实盘亏钱。
一句话总结:PCA帮你降维,时间序列帮你理解动态,因子模型帮你做预测和对冲。三者缺一不可。