第28章 波动率曲面回测框架:回测引擎设计、交易模拟、绩效评估指标

做波动率曲面交易,最怕什么?

怕策略在实盘里跑出来跟回测完全是两码事。我见过太多人,回测曲线漂亮得像教科书,一上实盘就崩。说白了,回测框架没搭好,你看到的都是幻觉。

这一章,我就跟你聊聊怎么搭一个靠谱的波动率曲面回测框架。嗯,都是我在实盘里踩过的坑。

28.1 回测引擎的核心设计

回测引擎是整个框架的心脏。我个人习惯把它拆成三个模块:数据层、策略层、执行层

核心原则:回测引擎必须能处理「非对称信息」。波动率曲面交易里,你看到的报价和实际成交价之间,往往差着好几个tick。这个差距,就是你的滑点成本。

先看数据层。你需要的不只是历史价格,还有完整的期权链数据。包括:

  • 不同行权价的隐含波动率
  • 不同期限的波动率期限结构
  • 买卖价差(这个特别重要)
  • 成交量、未平仓量

策略层呢?它负责生成交易信号。比如你发现曲面出现套利机会,或者波动率期限结构异常。策略层会告诉你:「现在该买这个,卖那个」

执行层最容易被忽略。它模拟你下单的过程:

  • 能不能成交?
  • 成交在什么价格?
  • 有没有冲击成本?

我曾经犯过一个错:回测时假设所有订单都能按中间价成交。结果实盘里,每次下单都吃满买卖价差,一个月下来多亏了2%的收益。嗯,从那以后我再也不敢忽略执行细节了。

28.2 交易模拟:别让理想化害了你

交易模拟,说白了就是「假装在交易」。但怎么假装,差别很大。

我建议你至少考虑这几个因素:

因素 说明 我的经验值
滑点 实际成交价与信号价的偏差 期权通常设0.5-1个tick
延迟 从信号产生到成交的时间差 至少模拟1秒延迟
流动性限制 大单无法全部成交 按成交量10%限仓
保证金占用 期权交易需要保证金 按交易所标准计算

来看一段核心的交易模拟代码:

class TradeSimulator:
    def __init__(self, slippage=0.5, delay=1):
        self.slippage = slippage  # 滑点,单位tick
        self.delay = delay        # 延迟,单位秒
        self.pending_orders = []  # 待成交订单
        
    def execute_order(self, order, market_data):
        # 模拟延迟
        time.sleep(self.delay)
        
        # 获取当前最优报价
        best_bid = market_data['bid']
        best_ask = market_data['ask']
        
        # 计算实际成交价
        if order.side == 'buy':
            fill_price = best_ask + self.slippage
        else:
            fill_price = best_bid - self.slippage
            
        # 检查流动性
        max_volume = market_data['volume'] * 0.1
        fill_volume = min(order.volume, max_volume)
        
        return Trade(fill_price, fill_volume)

小技巧:回测时把滑点设得比实际大一点。我一般设1.5倍预期滑点。这样实盘跑起来,至少不会比回测差太多。

28.3 绩效评估指标:别只看夏普比率

很多人回测完,看一眼夏普比率就完事了。你想想看,这够吗?

波动率曲面交易有个特点:大部分时间在赚小钱,偶尔亏一大笔。夏普比率对这种策略的评估,其实不太靠谱。

我常用的指标有这几个:

28.3.1 收益类指标

  • 总收益率:简单直接,但容易被极端值影响
  • 年化收益率:方便不同策略对比
  • 最大回撤:这个我特别看重。波动率曲面策略一旦回撤,往往是因为曲面结构突变

28.3.2 风险类指标

  • 波动率:收益的波动,不是标的的波动
  • VaR(在险价值):95%或99%置信度下的最大损失
  • CVaR(条件在险价值):超过VaR后的平均损失。这个比VaR更实用

28.3.3 波动率曲面特有指标

  • Vega暴露:策略对波动率变化的敏感度
  • Gamma暴露:策略对标的资产价格变化的二阶敏感度
  • Theta衰减:时间价值损耗的速度

注意:不要只看一个指标。我见过有人用高杠杆把夏普比率做到3以上,但最大回撤超过50%。这种策略,你敢用吗?

28.4 框架流程图

下面这张图,是我自己画的一个回测框架流程。你看一眼就明白了:

数据层 策略层 执行层 历史期权链数据 隐含波动率曲面 买卖价差 & 成交量 未平仓量 曲面套利信号 期限结构异常 波动率偏斜策略 Delta中性对冲 滑点模拟 延迟模拟 流动性限制 保证金计算 绩效评估模块 收益类指标 总收益率 / 年化收益 最大回撤 风险类指标 VaR / CVaR 收益波动率 曲面特有指标 Vega / Gamma Theta衰减

28.5 实战中的避坑指南

最后,分享几个我踩过的坑:

  • 幸存者偏差:回测时只用了存续下来的期权数据,退市的那些全被忽略了。结果策略看起来很美,实盘里一遇到退市就崩。
  • 前视偏差:不小心用了未来的数据来做决策。比如用收盘后的波动率曲面来生成盘中信号。这个错我犯过两次,每次都是因为数据时间戳没对齐。
  • 过度优化:把参数调得刚刚好,回测曲线完美。但换个时间段就完蛋。我现在的做法是:留出30%的数据做样本外测试,不过关就不上实盘。

我的建议:回测框架搭好后,先跑一个「随机策略」做基准。如果随机策略都能赚钱,那你的框架肯定有问题。别笑,我真见过这种情况——因为数据清洗没做好,把未来数据混进去了。

嗯,回测框架就聊到这儿。记住一句话:回测是用来发现问题的,不是用来证明策略有效的。框架搭得越扎实,你实盘的时候就越安心。


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