22. 机器学习在曲面构建中的应用:神经网络、高斯过程回归
波动率曲面的构建,说白了就是一场「插值与外推」的游戏。传统方法像样条插值、SVI参数化,在数据密集区表现不错。但一旦遇到市场数据稀疏、或者出现异常波动时,这些方法就开始「露怯」了。
我做了这么多年期权交易,最头疼的就是早盘开盘那半小时。报价稀疏,买卖价差大,传统插值出来的曲面经常出现「负时间价值」这种荒唐事。后来我开始尝试机器学习方法,嗯,效果确实不一样。
为什么需要机器学习?
传统方法有个共同问题:它们假设曲面是光滑的、单调的。但真实市场不是这样。你想想看,财报公布前、宏观数据发布时,曲面会出现明显的「微笑扭曲」。传统方法很难捕捉这种非线性特征。
机器学习模型,尤其是神经网络和高斯过程回归,天生就是处理非线性的好手。它们能从历史数据中学习曲面的「形态规律」,而不是简单地做数学插值。
核心区别:
- 传统方法:基于数学假设(光滑性、凸性)
- 机器学习:基于数据驱动(从历史中学习模式)
神经网络构建曲面
我个人习惯用浅层神经网络来做曲面拟合。为什么不用深层?因为期权数据量其实不大,一个交易日也就几百个报价,深层网络容易过拟合。
网络结构大概是这样:
输入层: [K/S, T, moneyness, time_to_maturity]
隐藏层: 2层,每层32个神经元,ReLU激活
输出层: 1个神经元,预测隐含波动率
这里有个关键点:输入特征要好好设计。我试过直接把行权价和到期日扔进去,效果很差。后来改成用「货币性」(K/S) 和「剩余期限」作为输入,收敛速度快了很多。
我的经验:输入数据一定要做标准化。我曾经偷懒没做,结果训练了200个epoch损失函数还在震荡。标准化后,50个epoch就收敛了。
代码实现其实不复杂:
import torch
import torch.nn as nn
class VolSurfaceNet(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(4, 32),
nn.ReLU(),
nn.Linear(32, 32),
nn.ReLU(),
nn.Linear(32, 1),
nn.Softplus() # 保证输出为正
)
def forward(self, x):
return self.net(x)
注意最后用了Softplus激活函数。为什么?因为隐含波动率不能为负。这个细节我一开始没注意,结果模型偶尔会预测出负波动率,被风控部门追着问了好几天。
高斯过程回归(GPR)
神经网络有个问题:它只给出预测值,不给出置信区间。但在期权交易中,知道「这个波动率有多可靠」往往比预测值本身更重要。
高斯过程回归正好解决了这个问题。它不仅预测波动率,还给出预测的不确定性。说白了,就是告诉你「这个点我有多自信」。
GPR的核心是核函数的选择。我试过几种:
| 核函数 | 特点 | 适用场景 |
|---|---|---|
| RBF核 | 光滑、无限可微 | 正常市场环境 |
| Matern核(ν=3/2) | 不那么光滑,允许局部变化 | 波动率突变时 |
| 周期核 | 捕捉周期性模式 | 财报季、宏观数据日 |
我曾经在VIX指数飙升那天,用RBF核的GPR模型预测曲面,结果完全跟不上市场变化。换成Matern核后,模型能更快地适应新的波动率水平。
避坑指南:GPR的计算复杂度是O(n³),n是样本量。当你的训练数据超过1000个点时,训练时间会变得难以接受。我一般会先用K-means做采样,把数据压缩到500个点以内,再跑GPR。
两种方法的对比
在实际项目中,我通常这样选择:
- 神经网络:适合做批量预测,速度快,但需要大量调参。如果你每天要生成上千条波动率曲线,用神经网络准没错。
- 高斯过程回归:适合做精细分析,给出置信区间,但计算慢。如果你在做期权做市,需要知道每个报价的可靠性,GPR是更好的选择。
嗯,这里要注意:两种方法都不是银弹。我见过有人用神经网络拟合曲面,结果在深度虚值期权上预测出离谱的波动率。为什么?因为训练数据里深度虚值期权的样本太少,模型根本没学到那里的规律。
知识体系结构图
下面这张图展示了机器学习构建波动率曲面的完整流程:
实战中的选择建议
如果你刚开始尝试机器学习构建曲面,我建议从神经网络入手。为什么?因为PyTorch、TensorFlow这些框架太成熟了,网上代码一抓一大把。GPR虽然理论优美,但scikit-learn的实现对大规模数据支持不太好。
不过,如果你做的是高频做市,我强烈建议用GPR。我记得有一次,我用神经网络预测的曲面做报价,结果在某个深度虚值期权上连续被成交了十几笔。后来复盘发现,神经网络在那个区域过度外推了,而GPR的置信区间会告诉你「这个预测不可靠」。
一个小技巧:可以把两种方法结合起来。用神经网络做快速预筛选,再用GPR对可疑区域做精细验证。我在实盘系统中就是这么干的,效果出奇的好。
最后说一句:无论用哪种方法,数据质量永远是第一位的。我见过太多人花大量时间调模型参数,却忽略了数据清洗。记住,垃圾进,垃圾出。先把报价数据中的异常值、套利机会清理干净,再谈机器学习。