7.3 回测验证与性能指标


文档摘要

7.3 回测验证与性能指标 季度策略评审会上,研究员展示了漂亮回测曲线:年化收益、夏普比率都过硬,模拟成交率与实盘前三周也对得上。提问环节只有一个问题:成交假设是怎么做的?研究员沉默了——回测用"信号价成交、无排队、无市场冲击"。会议室里所有人都明白这意味着什么:那条曲线度量的是模型的潜力,不是策略的盈利能力。本节讲的就是这道鸿沟怎么架桥:一套诚实的回测流水线怎么搭,三大偏差怎么防,以及夏普之外还应该看哪些指标。它是策略从研究走向生产的第一道正式关卡。 学习目标 搭建事件驱动的回测流水线,理解逐笔回放与撮合模拟的分工; 识别并修复三大偏差:前视偏差、幸存者偏差、成交假设过于乐观; 把交易成本模型做实:手续费、滑点、市场冲击三层结构;

7.3 回测验证与性能指标

季度策略评审会上,研究员展示了漂亮回测曲线:年化收益、夏普比率都过硬,模拟成交率与实盘前三周也对得上。提问环节只有一个问题:成交假设是怎么做的?研究员沉默了——回测用"信号价成交、无排队、无市场冲击"。会议室里所有人都明白这意味着什么:那条曲线度量的是模型的潜力,不是策略的盈利能力。本节讲的就是这道鸿沟怎么架桥:一套诚实的回测流水线怎么搭,三大偏差怎么防,以及夏普之外还应该看哪些指标。它是策略从研究走向生产的第一道正式关卡。

学习目标

  1. 搭建事件驱动的回测流水线,理解逐笔回放与撮合模拟的分工;
  2. 识别并修复三大偏差:前视偏差、幸存者偏差、成交假设过于乐观;
  3. 把交易成本模型做实:手续费、滑点、市场冲击三层结构;
  4. 用多维指标评价策略:夏普、回撤、容量、延迟敏感度各自回答什么问题;
  5. 设计从回测到实盘的灰度通道,让验证结论可迁移。

一、流水线:事件驱动的正确形状

回测流水线的骨架是事件驱动:历史数据按原始时间序重放,策略代码像在实盘一样只根据"已发生"的信息做决策,撮合模拟器决定订单是否成交、成交多少、滑点多少。它与向量化回测(用数组一次性算完信号)的根本差异在于能否模拟挂单、撤单与排队——高频策略的核心行为恰恰是这些,向量化回测对它们无能为力。所以本章立场鲜明:高频策略的最终验证必须走事件驱动逐笔回放,向量化只用于研究阶段的粗筛。

流水线的质量取决于两个部件。数据喂入器必须与实盘管线共用同一套订单簿重建代码(6.2 讲过口径分裂的教训,回放是消灭它的主战场:同一份代码接回放流与实盘流,行为不一致立刻现形)。撮合模拟器要按市场微结构建模:限价单进入队列排队(排在已有挂单之后)、按成交量推算排队消耗、市价单按穿档成本成交(复用 2.1 的穿档表)、撤单有延迟(按本系统实测的撤单往返延迟设置)。每个建模假设都应该有对应实盘数据可校验。

class Backtester: def run(self, events): for ev in events: # 严格按原始时间序重放 if ev.type in (ADD, CANCEL, TRADE): self.book.apply(ev) # 与实盘同一份重建代码 fills = self.matcher.match(self.open_orders, self.book) for f in fills: self.portfolio.on_fill(f) # 含手续费与滑点 sig = self.strategy.on_book(self.book) for o in sig.orders: self.matcher.submit(o, at=ev.ts) # 排队而非立即成交 return self.portfolio.report()

图:回测流水线与偏差注入点

图:回测流水线与偏差注入点

二、三大偏差:回测曲线的三种毒药

前视偏差:决策用了决策时刻不可得的信息。经典形态是用当根 K 线收盘价做信号(实盘里你收盘前看不到它)、用下一笔成交价成交自己的订单、特征计算窗口无意间覆盖了未来数据。防它的纪律是时间戳审计——给每个决策点断言"所用数据的最大时间戳不大于决策时间戳",断言失败即流水线有洞。幸存者偏差:标的池只用"活到今天"的品种,退市、摘牌、长期停牌的都不在——策略在历史回测里享受了永不踩雷的特权。防法是标的池取"当时点的全集合"并保留退市者的完整历史。成交乐观:回测里订单都成交在理想价位,实盘里排队、被跳过、部分成交是常态。防法在撮合模拟器的建模里,最终检验是成交率对照:回测预测的成交率与实盘前三周的实测偏差超过阈值,回测口径必须返工。

成本模型的诚实度同样分级。底级只算手续费;中级加滑点(按穿档表);高级加市场冲击(自己订单推动价格的部分,大单策略不可省)。检验标准一致:把成本假设上浮,净值衰减越慢的策略越真——在成本上浮五成后夏普仍达标的策略,才值得进入灰度。

三、指标体系:夏普之外的四个问题

夏普比率回答"收益的质量",但它沉默的问题太多。回撤结构回答"最疼的时候多疼":最大回撤之外,回撤的持续时间与恢复速度更影响执行力——深而快的回撤常见于短周期策略,可接受;阴跌不止的回撤往往意味着策略在缓慢失配。容量回答"能吃多大蛋糕":把规模逐步放大重跑回测,净值衰减到一半时的规模就是当前容量估计,超容运行是慢性自杀。延迟敏感度回答"这套逻辑吃不吃速度":给回测的执行端人为加延迟,观察净值衰减曲线——衰减平缓的策略对基建故障有韧性,陡峭的策略把命押在链路上,两者需要的运维投入完全不同。收益归因回答"钱从哪来":按时段、按标的、按信号分解收益,集中度过高(单一信号或单一时段贡献大半利润)的策略,本质是没分散的单一赌注。

指标 回答的问题 健康参考
夏普比率 收益质量 高频日度夏普可达个位数
最大回撤与恢复 最疼时多疼 回撤恢复期短于下行期
容量曲线 规模天花板 实盘规模低于容量七成
延迟敏感度 对基建的依赖 加倍延迟净值衰减可接受
收益归因集中度 是否单一赌注 头号来源占比受控

案例复盘:一条被成交率检验拦下的曲线

背景:某挂单策略回测夏普亮眼,模拟成交率九成,进入上线前评审。

操作:评审要求先跑两周影子对照:策略在实盘行情上空跑(发单到模拟撮合、不进真实交易所),逐单对照回测假设。结果实测成交率只有五成半——回测的排队模型低估了队列位置:策略总挂在同一侧最优价,而实盘该位置的竞争远比均匀假设激烈;部分成交的残单处理在回测里也被理想化了。

结果:按实测数据重校撮合模拟器的排队与部分成交模型,重跑回测,夏普降到原值的四成——仍然可做,但仓位方案全部按新数字重设。策略上线后实盘表现与修正后回测吻合。

解读:评审的价值不在拦下策略——它最终上线了——而在拦下了错误的数字。用未校准的回测数字定仓位,等于把杠杆建在沙子上。影子对照是回测与实盘之间最便宜的一座桥,两周的成本换来的是整套模拟器参数的校准。

变式:影子对照的时长因策略周期而异:秒级做市两周覆盖的行情状态已够,日内套利要覆盖月末与交割周,更长周期策略的验证只能靠小仓位实盘慢养——验证周期与策略周期同阶,是排期时就要接受的约束。

本节要点回顾

  • 高频策略最终验证必须事件驱动逐笔回放,向量化只配粗筛;
  • 三大偏差各有检查器:时间戳审计防前视、当时点标的池防幸存、成交率对照防乐观;
  • 成本模型分手续费、滑点、冲击三层,成本上浮五成仍达标才进灰度;
  • 夏普之外必看回撤结构、容量、延迟敏感度、归因集中度四问;
  • 影子对照是回测与实盘之间最便宜的桥,校准的是整套模拟器参数。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U