第24章 策略回测框架:构建波动率策略回测系统、绩效评估指标

做期权交易这么多年,我踩过最大的坑是什么?

不是方向看错,也不是波动率判断失误。而是——回测结果看着漂亮,实盘一跑就崩

为什么会这样?说白了,期权策略的回测比股票、期货复杂得多。你想想看,光是合约的流动性、买卖价差、隐含波动率的变化,这些因素在回测里稍不注意,结果就会失真。今天这一章,我就把这些年积累的回测框架搭建经验,以及那些让我吃过亏的细节,一次性讲清楚。

24.1 回测系统的核心架构

我个人习惯把回测系统拆成四个模块:数据层、策略层、执行层、评估层。每个模块各司其职,缺一不可。

核心原则:回测系统越接近真实交易环境,结果越有参考价值。别为了好看而简化细节。

先看一张我常用的架构图,它基本概括了整个回测流程:

波动率策略回测系统架构 数据层 期权链 · 标的 · 无风险利率 隐含波动率 · 历史波动率 策略层 信号生成 · 组合构建 Delta对冲 · 仓位管理 执行层 滑点模型 · 手续费 流动性限制 · 撮合逻辑 评估层 绩效指标 · 风险分析 归因分析 · 压力测试 反馈优化 数据驱动 → 策略生成 → 模拟执行 → 绩效评估 → 迭代优化 图24-1 波动率策略回测系统架构图

24.2 数据层:回测的基石

数据质量直接决定回测的可靠性。我在项目中遇到过最头疼的事,就是用了不干净的期权数据,结果回测出来的夏普比率高达3.0,实盘却亏得底朝天。

你需要准备的数据包括:

  • 期权链数据:行权价、到期日、看涨/看跌、成交量、持仓量、买卖报价
  • 标的资产数据:1分钟或5分钟K线,用于Delta对冲模拟
  • 隐含波动率曲面:不同期限、不同行权价的IV数据
  • 无风险利率:通常用SHIBOR或国债收益率
  • 股息率:如果标的有分红,必须考虑

我的经验:期权数据最好用中间价((买价+卖价)/2)而不是成交价。成交价往往有滞后性,中间价更能反映真实市场情绪。我曾经用成交价回测,结果滑点模型怎么调都对不上实盘。

24.3 策略层:信号与组合

策略层是回测系统的核心。这里我一般分两步走:

第一步:信号生成

根据波动率偏斜的形态,判断当前市场状态。比如:

  • 偏斜陡峭 → 预期尾部风险加大
  • 偏斜平坦 → 市场情绪平稳
  • 偏斜反转 → 可能发生趋势转折

第二步:组合构建

根据信号构建期权组合。举个简单的例子——偏斜套利策略

# 伪代码示例:偏斜套利信号生成
def skew_signal(option_chain):
    # 计算25-delta看涨和看跌的IV差值
    call_iv = get_iv_by_delta(option_chain, delta=0.25, option_type='call')
    put_iv = get_iv_by_delta(option_chain, delta=0.25, option_type='put')
    
    skew = put_iv - call_iv
    
    # 判断偏斜程度
    if skew > 0.03:  # 偏斜过大
        return 'short_skew'  # 卖出虚值看跌,买入虚值看涨
    elif skew < -0.02:  # 偏斜过小或倒挂
        return 'long_skew'   # 买入虚值看跌,卖出虚值看涨
    else:
        return 'neutral'     # 不交易

注意:Delta对冲的频率很关键。我见过有人用日频对冲,回测结果漂亮,但实盘波动一大,Gamma风险直接爆仓。建议至少用小时频甚至分钟频对冲。

24.4 执行层:让回测更真实

执行层是回测和实盘差距最大的地方。说白了,回测里你按中间价成交,实盘里你只能按对手盘的价格成交。

必须模拟的因素:

因素 回测处理方式 我的建议
买卖价差 按中间价成交 加上一半价差作为成本
滑点 固定滑点 根据流动性动态调整
手续费 固定费率 按交易所+券商实际费率
流动性限制 忽略 设置最大成交量和冲击成本

避坑指南:我曾经在回测中忽略了深度虚值期权的流动性问题。结果策略信号频繁交易这些合约,实盘根本成交不了。后来我加了一条规则:成交量低于100手的合约不交易,回测结果才变得靠谱。

24.5 评估层:绩效指标怎么选

评估层不只是看收益率。波动率策略的特性决定了我们需要一套专门的指标。

核心绩效指标:

  1. 年化收益率:这个不用多说,但要注意复利计算方式
  2. 夏普比率:波动率策略的夏普通常比方向性策略高,但别只看数字
  3. 最大回撤:期权策略的回撤往往来得又快又猛,这个指标必须盯紧
  4. 收益回撤比:我个人最看重的指标,至少要在2以上
  5. 胜率与盈亏比:波动率策略胜率高但单笔盈利小,这个组合要平衡

波动率策略专属指标:

指标 含义 计算方式
Vega暴露 策略对波动率变化的敏感度 组合Vega / 名义本金
Gamma暴露 策略对标的波动的敏感度 组合Gamma × 标的价格²
Theta消耗 时间价值衰减速度 每日Theta / 组合价值
偏斜暴露 策略对偏斜变化的敏感度 组合在不同行权价上的Vega分布

我的习惯:每次回测完,我都会做一次压力测试。比如假设波动率突然飙升20%,或者标的大幅跳空,看看策略能不能扛住。你想想看,如果回测里都扛不住,实盘就更别说了。

24.6 回测框架的代码骨架

最后,给一个简单的回测框架代码结构。嗯,这里只展示核心逻辑,完整代码太长了:

class VolatilityStrategyBacktest:
    def __init__(self, data, initial_capital=1_000_000):
        self.data = data
        self.capital = initial_capital
        self.positions = []
        self.trades = []
        
    def run(self):
        for date, market_data in self.data.iterrows():
            # 1. 生成信号
            signal = self.generate_signal(market_data)
            
            # 2. 构建/调整组合
            if signal != 'neutral':
                self.adjust_portfolio(signal, market_data)
            
            # 3. 执行Delta对冲
            self.delta_hedge(market_data)
            
            # 4. 记录持仓和PnL
            self.record_state(date, market_data)
    
    def generate_signal(self, data):
        # 偏斜信号逻辑
        pass
    
    def adjust_portfolio(self, signal, data):
        # 考虑滑点和手续费
        pass
    
    def delta_hedge(self, data):
        # 使用标的期货或ETF对冲
        pass
    
    def evaluate(self):
        # 计算绩效指标
        pass

再次提醒:回测框架搭建好之后,一定要做样本外测试。我见过太多人把样本内数据来回调参,结果样本外一塌糊涂。留出至少20%的数据做验证,这是底线。

好了,这一章的内容就到这里。回测框架是策略研究的基石,花时间把它搭扎实了,后面的工作才能事半功倍。记住:回测的目的是发现问题,而不是证明策略有效


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