第27章 机器学习在波动率中的应用:预测波动率曲面、分类交易信号
说实话,机器学习在期权交易里,这几年越来越热。但很多人一上来就堆模型,结果过拟合得一塌糊涂。我个人习惯是,先搞清楚我们要解决什么问题,再选工具。
波动率曲面预测和交易信号分类,是机器学习在期权领域最实用的两个方向。今天我们就来拆解一下。
27.1 波动率曲面预测:从静态到动态
传统的波动率曲面,说白了就是一张快照。某个时刻,不同行权价、不同到期日的隐含波动率拼在一起。但市场是动态的,曲面会变。我们真正需要的是——下一时刻的曲面长什么样?
这就是机器学习能帮上忙的地方。
核心思路:把波动率曲面看作一个高维函数,用历史数据训练模型,预测其未来形态。
27.1.1 特征工程怎么做?
我在项目中遇到过一个问题:特征太多,模型反而学不到东西。后来我总结了一套比较实用的特征体系:
- 基础特征:当前曲面的各个节点值(不同Delta、不同期限的IV)
- 时序特征:过去N个交易日的曲面变化率、偏斜斜率变化
- 市场状态特征:标的资产价格、涨跌幅、成交量、VIX指数
- 衍生特征:期限结构斜率、偏斜程度、曲面曲率
嗯,这里要注意:特征不是越多越好。我见过有人把50个特征全塞进去,结果模型在测试集上表现还不如简单线性回归。你想想看,过拟合的模型,在实盘里就是灾难。
27.1.2 模型选择:从简单到复杂
我个人建议,先从简单的模型开始试。比如:
- 线性回归:作为基准线,看看数据本身有没有线性关系
- 随机森林:能处理非线性关系,而且不容易过拟合
- XGBoost/LightGBM:梯度提升树,目前在结构化数据上表现最好
- LSTM/Transformer:如果你有大量时序数据,可以考虑
我曾经在一个项目中,用随机森林预测曲面,效果比LSTM还好。为什么?因为数据量不够大,LSTM反而学不到稳定的模式。所以别盲目追新模型。
27.1.3 预测结果怎么用?
预测出下一时刻的曲面后,我们可以做两件事:
- 套利机会识别:如果预测曲面和当前曲面存在显著差异,说明市场定价可能不合理
- 风险对冲:提前调整组合的Vega暴露,应对曲面变化
小技巧:预测曲面时,建议用Delta和期限作为坐标轴,而不是直接用行权价。这样曲面更稳定,模型泛化能力更强。
27.2 分类交易信号:机器学习做决策
预测曲面是一回事,怎么根据预测结果做交易,是另一回事。这里就需要分类模型了。
说白了,我们要把市场状态分成几类:
- 做多波动率:预期波动率会上升
- 做空波动率:预期波动率会下降
- 偏斜交易:预期偏斜会变化
- 无交易:当前没有明显机会
27.2.1 标签怎么打?
这是最头疼的一步。我刚开始做的时候,直接拿未来N天的实际波动率变化作为标签。结果发现,模型学到的全是噪声。
后来我换了个思路:
- 用未来N天的实际波动率变化,加上一个阈值(比如5%),超过阈值才算有效信号
- 或者用夏普比率作为标签,只有夏普比率超过1.0的交易才算正样本
这样做的好处是,模型学到的不是随机波动,而是真正有统计意义的模式。
27.2.2 特征工程(再强调一次)
分类模型的特征,和预测曲面的特征有重叠,但侧重点不同:
| 特征类别 | 具体特征 | 说明 |
|---|---|---|
| 波动率特征 | 当前IV、HV、IV-HV差值 | 衡量波动率是否被高估或低估 |
| 偏斜特征 | 25D偏斜、10D偏斜、偏斜变化率 | 反映市场尾部风险偏好 |
| 期限结构特征 | 近月-远月IV差值、期限结构斜率 | 反映市场对未来波动率的预期 |
| 市场情绪特征 | PCR、VIX、SKEW指数 | 整体市场情绪指标 |
27.2.3 模型训练与评估
分类模型我比较推荐XGBoost。为什么?因为它自带特征重要性,能告诉我们哪些特征对决策贡献最大。
举个例子,我在一个项目中训练了一个三分类模型(做多、做空、不交易)。结果发现,最重要的特征是IV-HV差值和25D偏斜。这说明,市场定价偏差和尾部风险偏好,是驱动波动率交易的核心因素。
避坑指南:我曾经犯过一个错误——直接用全量数据训练,没有做时间序列交叉验证。结果模型在历史数据上表现完美,实盘却一塌糊涂。记住,金融数据有很强的时间依赖性,一定要用滚动窗口验证。
27.3 实战流程:从数据到交易
下面是一个完整的实战流程,我把它画成了流程图:
27.4 代码示例:用XGBoost做信号分类
下面是一个简化版的代码示例,展示如何用XGBoost做交易信号分类:
import xgboost as xgb
import pandas as pd
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.metrics import classification_report
# 加载数据(假设已经做好特征工程)
# 特征:iv_hv_diff, skew_25d, term_structure_slope, vix, pcr
# 标签:0=不交易, 1=做多波动率, 2=做空波动率
data = pd.read_csv('volatility_features.csv')
X = data[['iv_hv_diff', 'skew_25d', 'term_structure_slope', 'vix', 'pcr']]
y = data['signal']
# 时间序列交叉验证
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# 训练模型
model = xgb.XGBClassifier(
n_estimators=100,
max_depth=4,
learning_rate=0.1,
objective='multi:softmax',
num_class=3
)
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print(classification_report(y_test, y_pred))
# 特征重要性
importance = model.feature_importances_
for name, imp in zip(X.columns, importance):
print(f"{name}: {imp:.4f}")
个人经验:XGBoost的max_depth参数很关键。我一般从3开始试,如果欠拟合就加到5,再高就容易过拟合了。另外,learning_rate设小一点(0.05-0.1),配合更多的n_estimators,效果通常更好。
27.5 常见陷阱与应对
做机器学习在波动率上的应用,有几个坑我踩过,分享给你:
- 数据泄露:用未来数据构造特征。比如用未来N天的波动率作为当前特征,这会导致模型在回测中表现完美,实盘却失效
- 过度拟合:金融数据信噪比极低,模型很容易学到噪声。建议用更简单的模型,或者增加正则化
- 市场结构变化:2018年和2020年的波动率市场完全不同。模型需要定期重新训练,或者加入市场状态切换机制
我曾经踩过的坑:有一次,我用LSTM预测曲面,回测效果特别好。结果实盘第一天就亏了。后来发现,我的训练数据里包含了2020年3月的极端行情,模型学到了那个时期的模式。但实盘时市场已经恢复正常,模型完全失效。从那以后,我每次训练都会检查数据的时间分布,确保训练集和测试集的市场状态相似。
好了,这一章的内容就到这里。机器学习在波动率交易中的应用,核心就是两件事:预测曲面和分类信号。工具只是手段,理解市场逻辑才是根本。