第24章 策略回测框架:构建波动率策略回测系统、绩效评估指标
做期权交易这么多年,我踩过最大的坑是什么?
不是方向看错,也不是波动率判断失误。而是——回测结果看着漂亮,实盘一跑就崩。
为什么会这样?说白了,期权策略的回测比股票、期货复杂得多。你想想看,光是合约的流动性、买卖价差、隐含波动率的变化,这些因素在回测里稍不注意,结果就会失真。今天这一章,我就把这些年积累的回测框架搭建经验,以及那些让我吃过亏的细节,一次性讲清楚。
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 评估层:绩效指标怎么选
评估层不只是看收益率。波动率策略的特性决定了我们需要一套专门的指标。
核心绩效指标:
- 年化收益率:这个不用多说,但要注意复利计算方式
- 夏普比率:波动率策略的夏普通常比方向性策略高,但别只看数字
- 最大回撤:期权策略的回撤往往来得又快又猛,这个指标必须盯紧
- 收益回撤比:我个人最看重的指标,至少要在2以上
- 胜率与盈亏比:波动率策略胜率高但单笔盈利小,这个组合要平衡
波动率策略专属指标:
| 指标 | 含义 | 计算方式 |
|---|---|---|
| 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