第27章 机器学习在波动率中的应用:预测波动率曲面、分类交易信号

说实话,机器学习在期权交易里,这几年越来越热。但很多人一上来就堆模型,结果过拟合得一塌糊涂。我个人习惯是,先搞清楚我们要解决什么问题,再选工具。

波动率曲面预测和交易信号分类,是机器学习在期权领域最实用的两个方向。今天我们就来拆解一下。

27.1 波动率曲面预测:从静态到动态

传统的波动率曲面,说白了就是一张快照。某个时刻,不同行权价、不同到期日的隐含波动率拼在一起。但市场是动态的,曲面会变。我们真正需要的是——下一时刻的曲面长什么样?

这就是机器学习能帮上忙的地方。

核心思路:把波动率曲面看作一个高维函数,用历史数据训练模型,预测其未来形态。

27.1.1 特征工程怎么做?

我在项目中遇到过一个问题:特征太多,模型反而学不到东西。后来我总结了一套比较实用的特征体系:

  • 基础特征:当前曲面的各个节点值(不同Delta、不同期限的IV)
  • 时序特征:过去N个交易日的曲面变化率、偏斜斜率变化
  • 市场状态特征:标的资产价格、涨跌幅、成交量、VIX指数
  • 衍生特征:期限结构斜率、偏斜程度、曲面曲率

嗯,这里要注意:特征不是越多越好。我见过有人把50个特征全塞进去,结果模型在测试集上表现还不如简单线性回归。你想想看,过拟合的模型,在实盘里就是灾难。

27.1.2 模型选择:从简单到复杂

我个人建议,先从简单的模型开始试。比如:

  • 线性回归:作为基准线,看看数据本身有没有线性关系
  • 随机森林:能处理非线性关系,而且不容易过拟合
  • XGBoost/LightGBM:梯度提升树,目前在结构化数据上表现最好
  • LSTM/Transformer:如果你有大量时序数据,可以考虑

我曾经在一个项目中,用随机森林预测曲面,效果比LSTM还好。为什么?因为数据量不够大,LSTM反而学不到稳定的模式。所以别盲目追新模型。

27.1.3 预测结果怎么用?

预测出下一时刻的曲面后,我们可以做两件事:

  1. 套利机会识别:如果预测曲面和当前曲面存在显著差异,说明市场定价可能不合理
  2. 风险对冲:提前调整组合的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 实战流程:从数据到交易

下面是一个完整的实战流程,我把它画成了流程图:

机器学习波动率交易实战流程 步骤1:数据采集 步骤2:特征工程 步骤3:模型训练 曲面预测模型 信号分类模型 预测曲面 交易信号 步骤5:交易执行

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月的极端行情,模型学到了那个时期的模式。但实盘时市场已经恢复正常,模型完全失效。从那以后,我每次训练都会检查数据的时间分布,确保训练集和测试集的市场状态相似。

好了,这一章的内容就到这里。机器学习在波动率交易中的应用,核心就是两件事:预测曲面和分类信号。工具只是手段,理解市场逻辑才是根本。

公众号:蓝海资料掘金营,微信deep3321