2026年十月28日 · 期权

信号判断正确,但我们的期权回测买错了到期日。

信号判断正确,但我们的期权回测买错了到期日。

周二10:07,我们的研究智能体发现了一只指数ETF的短期看涨形态。标的信号很普通:价格重新站上20根K线均线,已实现波动率正在回落,而下一交易时段安排了宏观数据发布。建议的交易是一个看涨价差,距离到期大约还有2周。

回测认为这笔交易不错,纸面策略却没有下单。我们对比订单后发现,信号时间戳一致,标的价格也只差几美分。不同的是合约:回测买入了历史期权链中看起来最好的周五到期合约;纸面交易流程则选择了下一个挂牌到期日,也就是晚1周的合约。

这个差异源于一次日历联接。我们把“距到期天数”当成日期的属性,然后选取到期日最接近目标的合约。在历史数据里,到期日历包含一个周度合约,而这个合约是在我们测试的日期之后才增加的。回测使用了一个未来才出现的合约,看起来却像是无伤大雅的便利处理。

我们起初怀疑是时区错误。期权到期日特别容易引发这类问题:交易时段在纽约结束,交易所时间戳可能以UTC存储,而流水线如果不慎转换日期,午夜日期就可能发生偏移。我们检查后确认时间戳没有问题。那份合约只是在那个周二尚未进入历史合约范围。

这是第一条经验:历史期权链需要按时点还原挂牌范围。合约到期日告诉你它何时结束,却不会告诉你它何时挂牌、何时开始可交易,也不会告诉你当时系统是否能够选到它。

我们围绕决策时间戳时可获得的信息重建了选择步骤。对每个候选合约,我们要求其挂牌时间戳不晚于决策时点,报价有效且未超过新鲜度阈值,并且当时处于策略可以提交订单的交易时段。我们还在排序前记录了候选集合。最后这一点很关键,因为旧回测只保留了胜出的合约;我们无法判断它究竟比较了5份符合条件的合约,还是悄悄从一个尚未出现的日历中做出了选择。

10:07信号决策时间
1周到期日不匹配
0该合约在历史时点符合条件的挂牌数

接下来,我们检查了用于价差定价的报价。回测分别取用了每条腿的最新报价。看涨期权的卖价来自10:06:58;短看涨期权的买价则来自10:04:11。按照宽松的数据政策,两者在技术上都算近期报价,但期间市场已经发生了变化。用不同步的两条腿报价计算价差中间价,可能描述出一个从未真实存在过的市场。

我们修改了报价规则,要求两条腿的时间戳相差不超过2秒,并剔除交叉报价或挂单量为零的市场。这减少了可用的历史观测数量,也让剩余报价更可信。如果没有同步报价,我们就将该候选合约标记为不可用,而不是用过时价格填补空缺。

接下来是排序规则。智能体选择了报价价差成本最低的到期日。听起来很合理,直到你发现价差只有1份合约的挂单量,而且报价已经过时。我们明确了目标:在通过最小报价规模、新鲜度和挂牌检查的合约中,最大化单位既定风险的预期收益。在这个例子中,最近的合格到期日,两条腿报价之间的宽度为$0.42;较晚的到期日则为$0.31。看起来更便宜的选择,其短腿上却只显示了1份合约。

候选合约当时是否已到期日可选?报价年龄短腿显示数量决策
周五周度合约否不适用不适用排除
下一个周五是1.4秒18份合约符合条件
第三个周五是9.8秒1份合约报价过时且深度不足,予以排除

我们按照这些规则重放了这次事件。现在回测选择了与纸面交易相同的到期日,并记录了其他合约被拒绝的原因。由此得到的价差入场价格比原来的历史成交价差了$0.11。这并不意味着策略毫无价值;这意味着旧的业绩数字包含了一笔实盘流程无法复现的交易选择。

还有个小麻烦:交易所的代码格式会让到期日错误看起来像数据质量问题。我们发现一家数据供应商的周度代码与月度代码只差1个字符。我仍会在审计日志中把原始代码和规范化后的合约键并列保存。虽然不算优雅,却能避免我们过早相信一次看似整洁的联接。

如果你正在构建期权回测,请保存每次决策时的完整候选集合,以及每份合约的挂牌状态、报价时间戳、数量和拒绝原因。然后将合约选择做成基于该快照的确定性函数。到期日选择本身就是策略的一部分。如果回测能看到纸面交易无法选择的合约,那么信号对比开始时,答案已经变了。

期权回测到期日选择时点数据执行建模
← 全部文章