26. 曲面质量评估:回测框架,曲面预测能力检验,模型风险度量

曲面建好了,参数也调了,然后呢?

说实话,很多团队卡在这一步。模型跑起来漂亮,一上实盘就翻车。我见过太多这样的案例了。曲面质量评估,说白了就是给你的波动率曲面做一次「压力测试」。

回测框架:别让历史数据骗了你

回测不是跑一遍历史就完事。我个人习惯把回测分成三层:

  1. 样本内拟合:检查曲面能否复现历史报价
  2. 样本外预测:用过去的数据预测未来一天的曲面
  3. 动态滚动回测:每天滚动窗口,模拟真实交易环境

我曾经犯过一个低级错误——用全量数据做参数拟合,结果回测曲线漂亮得像教科书。但一换到样本外,误差直接翻倍。嗯,这就是典型的过拟合。

核心指标

  • RMSE(均方根误差):衡量整体偏差
  • MAE(平均绝对误差):对异常值更鲁棒
  • MAPE(平均绝对百分比误差):看相对误差更直观

曲面预测能力检验

检验预测能力,我常用两个方法。

方法一:时间序列交叉验证

别用随机打乱!时间序列有顺序依赖。我建议用「滚动窗口法」:

# 伪代码示例
for day in range(start_date, end_date):
    train_data = data[:day]  # 历史数据
    test_data = data[day]    # 当天数据
    
    # 拟合曲面参数
    params = fit_surface(train_data)
    
    # 预测当天曲面
    predicted_surface = predict_surface(params, test_data.maturity, test_data.strike)
    
    # 计算预测误差
    error = compute_error(predicted_surface, test_data.iv)
    
    # 记录误差序列
    errors.append(error)

方法二:极端情景测试

你想想看,平时误差小不代表什么。关键要看市场剧烈波动时,你的曲面还能不能扛得住。

我记得有一次做测试,选了2020年3月那波暴跌。很多模型在平稳期表现完美,一到波动率飙升就彻底崩了。曲面预测值跟实际报价差了30%以上。

我的经验:至少准备3个极端情景:

  • 波动率尖峰(如黑天鹅事件)
  • 期限结构倒挂(短期波动率高于长期)
  • 偏斜急剧变化(虚值期权波动率异常)

模型风险度量

模型风险,说白了就是「你以为模型是对的,其实它错了」。我把它分成三类:

风险类型 来源 度量方法
参数风险 参数估计不稳定 参数置信区间、bootstrap
结构风险 模型假设不成立 模型比较测试(如SVI vs SABR)
外推风险 曲面外推区域不可靠 外推误差边界分析

参数风险:我最常用的方法是bootstrap。把历史数据重采样1000次,每次重新拟合参数。看参数分布是否集中。如果参数标准差太大,说明模型不稳定。

结构风险:这个比较隐蔽。比如你用SVI模型,但市场实际是随机波动率驱动的。怎么办?我建议做「模型残差分析」——如果残差有系统性模式,说明模型结构有问题。

避坑指南:我曾经遇到一个案例,模型在95%的情况下表现优异,但剩下5%的误差大到离谱。后来发现是模型对深度虚值期权的处理有问题。所以别只看平均误差,要关注误差分布的尾部。

知识体系图:曲面质量评估流程

曲面质量评估流程 历史曲面数据 回测框架 预测能力检验 模型风险度量 样本内拟合 样本外预测 时间序列交叉验证 极端情景测试 参数风险 结构风险 曲面质量评估报告 交易决策 | 风险对冲 | 模型迭代

实战中的几个坑

坑一:回测周期太短

我见过有人只用3个月数据做回测。结果模型在测试集上表现完美,但一上线就崩。为什么?因为3个月里市场只有一个状态。至少要用1年以上的数据,而且要包含不同市场环境。

坑二:忽略交易成本

曲面预测误差1%看起来不大,但加上买卖价差、滑点,实际交易成本可能吃掉所有收益。我建议在回测中模拟真实交易环境,包括流动性限制。

坑三:过度优化

你想想看,如果你有100个参数,总能找到一组让历史数据拟合完美的值。但这样的模型到了实盘,基本就是灾难。我个人的原则是:参数越少越好,能用3个参数就别用5个。

总结一下:曲面质量评估不是一次性工作。我建议建立自动化监控系统,每天检查曲面预测误差。如果连续3天误差超过阈值,就要重新校准模型。别等到亏钱了才想起来检查。

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