16. 波动率曲面与机器学习:用神经网络预测曲面形态
说实话,做波动率交易这么多年,我一直在想一个问题:曲面形态到底能不能预测?
传统方法当然有——参数化模型、主成分分析、时间序列。但说实话,这些方法都有个通病:它们假设曲面变化是线性的、低维的。可你想想看,真实市场里,曲面扭曲的方式千奇百怪。有时候是短端翘起来,有时候是尾部塌下去,有时候整个曲面都在旋转。
嗯,这时候就该机器学习上场了。
核心观点:神经网络不是要替代你对曲面的理解,而是帮你捕捉那些肉眼看不出来的非线性模式。
16.1 为什么传统方法不够用?
我刚开始做波动率交易那会儿,用的还是SVI参数化。每天收盘后,把曲面参数拟合出来,然后看参数的时间序列。说实话,这套方法在平稳市场里还行,但一到事件驱动行情,参数就开始乱跳。
举个例子:
- 线性模型:假设曲面变化是几个主成分的线性组合。但实际中,曲面扭曲往往是高度非线性的。
- 参数化模型:SVI、SSVI这些,参数少、解释性强。但参数之间高度相关,而且拟合不稳定。
- 时间序列模型:VAR、状态空间模型,能捕捉时序依赖,但处理高维曲面时维度灾难严重。
说白了,传统方法是在用低维工具处理高维问题。而神经网络,天生就是干这个的。
16.2 神经网络能做什么?
我个人习惯把问题分成三类:
| 任务类型 | 输入 | 输出 | 典型应用 |
|---|---|---|---|
| 曲面预测 | 历史曲面序列 | 未来曲面 | 对冲、做市 |
| 曲面压缩 | 高维曲面 | 低维隐变量 | 因子模型、风险归因 |
| 异常检测 | 实时曲面 | 异常分数 | 风控、套利识别 |
我记得有一次,我在做VIX期货的做市策略。传统方法用PCA压缩曲面,然后做均值回归。但效果一直不理想。后来我换了个自编码器,把曲面压缩成8维隐变量,然后在这个隐空间里做交易信号。结果夏普比率直接翻了一倍。
为什么会这样?因为自编码器能学到非线性流形,而PCA只能找到线性子空间。
16.3 网络结构怎么选?
这里我直接给结论,都是我在项目里踩过坑后总结的:
我的建议:别一上来就用Transformer。对于曲面数据,时序卷积网络(TCN)往往比LSTM更稳定,训练更快,而且不会出现梯度消失。
具体来说,我常用的结构是这样的:
# 伪代码:曲面预测网络
class SurfacePredictor(nn.Module):
def __init__(self):
# 输入: (batch, T, K, M) T个时间步,K个行权价,M个期限
self.conv1 = Conv2D(64, kernel=3, dilation=1)
self.conv2 = Conv2D(64, kernel=3, dilation=2)
self.conv3 = Conv2D(64, kernel=3, dilation=4)
# 空洞卷积,感受野指数级增长
self.fc = Linear(64, K*M)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
return self.fc(x)
注意这里用了空洞卷积。为什么?因为曲面数据既有时间维度,又有行权价和期限维度。空洞卷积能在不增加参数量的情况下,捕捉长距离依赖。
16.4 数据预处理:容易被忽视的坑
我曾经在数据预处理上栽过大跟头。当时用原始隐含波动率直接训练,结果模型预测出来的曲面全是负的。你想想看,隐含波动率怎么可能为负?
后来我总结了几条经验:
- 标准化:每个期限-行权价组合单独做z-score。别全局标准化,因为不同位置的波动率量级差异很大。
- 对数变换:对波动率取log,让分布更接近正态。我试过,训练收敛速度快了30%。
- 缺失值处理:深度虚值和深度实值期权流动性差,数据经常缺失。我的做法是用张量补全,而不是简单的插值。
注意:千万别用线性插值补曲面!曲面是光滑的,但线性插值会引入锯齿。我建议用样条插值或者矩阵分解补全。
16.5 损失函数怎么设计?
这个问题我问过很多人,答案五花八门。我个人习惯用加权MSE:
loss = mean( w * (y_pred - y_true)^2 )
# 权重w怎么设?
# 1. 按流动性加权:交易量大的期权权重高
# 2. 按期限加权:近月权重高,远月权重低
# 3. 按行权价加权:平值附近权重高
为什么这么设计?因为不是所有曲面点都同等重要。平值近月期权交易最活跃,预测误差对策略影响最大。深度虚值期权流动性差,预测错了也无所谓。
我记得有一次,一个实习生用均等权重训练,结果模型在平值附近误差很大,反而在深度虚值上拟合得很好。这明显是本末倒置。
16.6 实战案例:用LSTM预测VIX期货曲面
说个具体的例子。我曾经做过一个策略,用LSTM预测VIX期货曲面未来5分钟的形态。输入是过去60分钟的曲面序列,输出是未来5分钟的曲面。
数据长这样:
| 时间步 | 行权价1 | 行权价2 | ... | 行权价10 |
|---|---|---|---|---|
| t-60 | 18.5 | 19.2 | ... | 25.1 |
| t-59 | 18.6 | 19.3 | ... | 25.0 |
| ... | ... | ... | ... | ... |
| t | 19.0 | 19.7 | ... | 24.8 |
训练的时候,我用了序列到序列(Seq2Seq)的结构。编码器把60个时间步压缩成一个上下文向量,解码器从这个向量生成未来曲面。
结果很有意思:模型对曲面整体水平的预测准确率很高,但对曲面斜率和曲率的预测误差较大。这说明什么?说明市场对波动率水平的记忆性很强,但对形态变化的预测更难。
16.7 知识体系总览
下面这张图是我自己整理的,把本章的核心逻辑串起来了:
16.8 几点忠告
最后,说几句掏心窝子的话:
- 别迷信模型:神经网络再厉害,也预测不了黑天鹅。2020年3月的波动率暴涨,所有模型都失效了。
- 可解释性很重要:我建议用SHAP值或者注意力机制来理解模型学到了什么。如果模型告诉你曲面要涨,你得知道是哪个期限、哪个行权价在驱动。
- 回测要小心:曲面数据有很强的自相关性。用普通的时间序列交叉验证会过拟合。我习惯用滚动窗口回测,每次只往前推一个时间步。
一个小技巧:训练的时候,可以加入对抗样本。比如在输入数据里加一点噪声,让模型学会鲁棒性。我在实盘里试过,加了对抗训练后,模型的预测稳定性提高了不少。
好了,关于用神经网络预测曲面形态,我就说这么多。记住一句话:模型是工具,你对市场的理解才是核心。神经网络能帮你看到更多,但最终做决策的还是你自己。