复盘框架搭建:定义复盘目标、数据采集范围、绩效指标选取
做期权策略,最怕什么?
怕的是赚了不知道为啥赚,亏了不知道为啥亏。
我见过太多交易员,回测曲线漂亮得像教科书,实盘一跑就变形。问题出在哪?说白了,就是复盘框架没搭好。你连复盘的目标都没想清楚,数据该取哪些、指标该看哪个,全凭感觉来,那跟闭着眼开车有啥区别?
今天咱们就把这个框架搭起来。我把自己这些年踩过的坑、总结的经验,一股脑倒给你。
一、复盘目标:你到底想验证什么?
很多人一上来就盯着收益率看。嗯,这其实是个误区。
我个人习惯,在开始任何复盘之前,先问自己三个问题:
- 这个策略赚的是什么钱?(方向?波动率?时间价值?)
- 在什么市场环境下它应该表现好?
- 如果它失效了,最可能的原因是什么?
想清楚这三点,复盘目标就清晰了。你不是在找「最好的策略」,而是在验证「这个策略是否按预期运行」。
核心原则:复盘不是为了证明策略对,而是为了发现它什么时候会错。
举个例子。我做过一个卖出宽跨式策略,回测年化收益30%,最大回撤才8%。当时心里美滋滋。结果复盘时我专门去看了2018年2月和2020年3月的数据——嗯,那两次波动率飙升,策略直接回撤了15%以上。这才发现,原来我的策略赚的是「低波动环境下的时间价值」,一旦波动率突变,它就扛不住。
你看,如果复盘目标只是看总收益,我可能永远发现不了这个致命弱点。
二、数据采集范围:别漏了关键信息
数据是复盘的原材料。原材料不对,再好的厨子也白搭。
我建议你把数据采集分成三个层次:
| 层次 | 包含内容 | 说明 |
|---|---|---|
| 基础层 | 标的价格、期权价格、隐含波动率、无风险利率 | 这是必须有的,缺一不可 |
| 交易层 | 开仓时间、平仓时间、成交价、持仓量、保证金占用 | 记录每一笔交易的细节 |
| 环境层 | 市场状态(趋势/震荡)、波动率曲面、期限结构 | 用来判断策略表现的环境因素 |
这里有个坑,我踩过好几次——数据频率。很多人用日线数据做回测,觉得够了。但期权策略不一样,尤其是临近到期的合约,一天之内价格可能翻几倍或者归零。日线数据根本捕捉不到这种变化。
注意:对于期权策略,建议至少使用1小时级别的数据。如果是日内交易策略,最好用分钟级数据。
另外,别忘了采集未成交订单的数据。为什么?因为滑点和流动性风险往往就藏在这里。我曾经有个策略,回测时收益不错,实盘时发现很多订单根本成交不了——流动性太差了。后来我把未成交订单也纳入复盘数据,才发现这个问题。
三、绩效指标选取:三个核心指标就够了
市面上绩效指标一大堆,什么卡玛比率、索提诺比率、信息比率……说实话,对于期权策略复盘,我个人觉得三个核心指标就够了。
1. 收益率
这个不用多说,但要注意口径。我习惯用年化收益率,而不是总收益率。因为不同策略的持仓周期不一样,年化之后才能公平比较。
计算方式很简单:
# 年化收益率计算
def annualized_return(total_return, days):
return (1 + total_return) ** (365 / days) - 1
# 示例:90天赚了12%
total_ret = 0.12
days = 90
ann_ret = annualized_return(total_ret, days)
print(f"年化收益率: {ann_ret:.2%}") # 输出约 58.74%
2. 夏普比率
夏普比率衡量的是「每承担一单位风险,能获得多少超额收益」。对于期权策略来说,这个指标尤其重要——因为期权自带杠杆,收益波动大,光看收益率容易被误导。
小技巧:期权策略的夏普比率,我一般要求至少0.8以上。低于0.5的策略,说明风险调整后收益不划算,不如直接买ETF。
计算时注意用日收益率来算,再年化:
import numpy as np
def sharpe_ratio(daily_returns, risk_free_rate=0.03):
excess_returns = daily_returns - risk_free_rate / 252
return np.sqrt(252) * np.mean(excess_returns) / np.std(excess_returns)
# 假设日收益率序列
daily_rets = np.random.normal(0.001, 0.02, 252)
sr = sharpe_ratio(daily_rets)
print(f"夏普比率: {sr:.2f}")
3. 最大回撤
这个指标,说白了就是「你最惨的时候亏了多少」。对于期权策略,我特别关注回撤的持续时间和回撤的恢复时间。
为什么?因为期权策略经常会出现「钝刀割肉」式的回撤——每天亏一点点,连续亏一个月。这种回撤虽然幅度不大,但很磨人,容易让人心态崩掉。
我的经验:最大回撤控制在15%以内,回撤恢复时间不超过3个月,这样的策略才值得实盘。
计算最大回撤的代码:
def max_drawdown(equity_curve):
peak = np.maximum.accumulate(equity_curve)
drawdown = (equity_curve - peak) / peak
return np.min(drawdown)
# 示例:净值曲线
equity = np.array([1.0, 1.05, 1.02, 0.98, 1.03, 1.08])
mdd = max_drawdown(equity)
print(f"最大回撤: {mdd:.2%}") # 输出约 -6.67%
四、知识体系框架图
说了这么多,咱们用一张图把整个复盘框架串起来:
这张图把整个复盘流程串起来了。从上到下,先定目标,再采数据,最后算指标。每一步都环环相扣。
五、避坑指南
最后,分享几个我踩过的坑:
- 数据对齐问题:期权数据和标的数据的时间戳可能不一致。我曾经因为没对齐,导致回测结果差了5个百分点。解决办法是统一用标的的收盘时间作为基准。
- 分红除权处理:期权价格会受分红影响。如果你不做调整,回测结果会失真。我一般用调整后的价格序列。
- 手续费和滑点:别小看这个。对于高频策略,手续费可能吃掉一半收益。我习惯在回测时把手续费设得比实际高20%,给自己留点安全边际。
最后一个小建议:复盘不是一次性工作。我每周都会跑一遍复盘流程,看看策略有没有偏离预期。养成习惯后,你会发现很多问题在萌芽阶段就被发现了。
好了,复盘框架就搭到这里。框架有了,下一步就是往里填内容——怎么具体做复盘分析,咱们后面慢慢聊。