Rebas Daily PERSONAL AI DAILY — 自动选题 · 核查 · 撰写 NO.076 — 2026-09-18
PAPER H 2 约 8 分钟

L2回测的幻觉:同簿不同成交

同一份L2订单簿,能回测出不同成交。问题藏在看不见的FIFO队列里。

你在咖啡店排队,只看见“柜台前有十个人”,却不知道谁排在谁前面。后来有三个人离开:如果走的是队首,你很快就能买到咖啡;如果走的是队尾,你还得继续等。人数变化完全一样,你的等待时间却不同。

用L2订单簿回测被动交易,也会遇到这个问题。L2——按价格档位汇总的订单簿数据——能告诉你某个价位一共有多少挂单,却不一定告诉你每张订单的身份和先后顺序。但交易所采用FIFO价格—时间优先:价格相同时,先挂出的订单先成交。于是,回测里那张模拟订单能否成交,不只取决于档位总量,还取决于看不见的队列。

Riya Danait、Yuliana Zamora和Ioana Boier的论文《Same Book, Different Fills》讨论的正是这个识别缺口:价格、数量和成交记录完全相同的L2路径,可能对应多套逐笔订单历史,并产生不同的被动成交结果。本文事实与数字均来自这篇论文,尚无独立信源复核。

同一个订单簿,为什么会有两种成交?

假设你在最优买价挂出一张限价单,入场时前面有300股。随后,同一价位减少100股。L2只显示总挂单少了100股,却不说明这100股来自哪里。

如果撤掉的是排在你前面的旧订单,你离队首更近,成交概率上升。如果撤掉的是后来排在你后面的新订单,你的位置没有改善。两种历史留下相同的L2记录,却给你的订单带来不同命运。

这就是论文所说的“部分识别”:现有数据不能锁定唯一答案,只能限定一组可能结果。标题里的“幻觉”因此要谨慎理解。论文并不是说L2回测必然虚假,而是说,被动成交的单点估计可能暗含一个数据无法验证的队列假设。

这种偏差主要影响被动策略。被动策略把限价单挂在簿上,等待别人来成交;主动策略则直接吃掉眼前已有的流动性。前者需要知道自己前面还有多少订单,后者主要关心当时可见的价格和数量。队列信息缺失时,被动策略更容易被回测规则左右。

研究者没有猜队列,而是同时编出几套

论文提出一个path-preserving compiler,可理解为“保持路径不变的订单历史编译器”。它把聚合的L2记录还原成可供撮合引擎重放的逐笔订单流,但不声称找回了真实历史。

关键做法是控制变量。研究者固定聚合订单簿路径、潜在订单的拆分、新增订单、时间、区块边界,以及经过校准的market removals——由市场单造成的挂单消耗。然后只改变一件事:撤单从队列哪里扣除。

他们设置了三种规则:front从最老、最靠前的订单开始撤;back从最新、最靠后的订单开始撤;quantity-weighted-random则按订单剩余数量加权随机选择。三套逐笔历史都能复现同一条聚合路径。区别只藏在L2看不见的队列内部。

L2本身不能直接区分撤单与成交。论文把十档L2快照与L1成交数据同步,通过reconciliation——把成交时间、价格和数量与订单簿变化对齐——推断market removals及成交发生在哪一侧。无法解释的复合变化会切断重放区块。换句话说,这不是凭空生成市场,而是在共同的聚合记录上,只替换撤单落点。

模拟订单也不会改写历史。论文把它作为一个虚拟标记,记录其前方还有多少背景订单;主动交易则在当时订单簿的副本上执行。这是一种price-taking counterfactual,即假设策略只接受市场给出的价格,不反过来影响市场。

作者还把重建出的背景订单流交给独立的JAX-LOB撮合引擎重放,用来检查这些订单流在FIFO规则下是否机械可执行。不过,这项检查验证的是重建过程自洽,并不能证明其中任何一套队列就是真实队列。

front与back给出的,不只是理论差别

在限定的编译器类别内,论文证明了一个有条件的排序:对单个虚拟订单,在最优价保持不变的一段时间里,如果各次撤单从订单前方移除的数量依次满足front不少于random、random不少于back,那么累计成交也按front、random、back排序。

两个限定不能省略。第一,这只适用于单个touch-price spell,也就是最优价未改变的连续时段。第二,它只在论文声明的compiler class内成立。front和back不是所有可能订单历史的严格上下界,也不能直接推广到任意改价或多订单策略。

实证使用两只东京证券交易所标的1301.T和7911.T在2025年七个月的同步数据。每只标的都在同一组18个留出交易日上提供1,080个匹配的五分钟episode。所谓留出,是指这些日期没有用于前期设置选择,用来观察方法在未参与调参的数据上如何表现。

结果很直观。主动成交基准不受三种FIFO实现影响;被动成交则明显变化。对1301.T,被动策略在back规则下,终点前完成率为10.14%;换成front后升至18.15%,提高8.01个百分点。对应的implementation shortfall——相对到达时中间价计算的执行成本——下降1.010个基点,1个基点等于0.01个百分点。

对7911.T,终点前完成率从back下的89.81%升至front下的97.20%,提高7.39个百分点;执行成本下降0.384个基点。两只标的方向一致:越多撤单被分配到模拟订单前方,它越快接近队首,也越可能在终点前完成,从而减少最后主动买入或卖出剩余数量的需要。

这两个案例也提醒我们,成交率差异和成本差异不是一回事。7911.T在三种规则下本来就能完成大部分被动订单,因此约7个百分点的完成率变化,只对应较窄的成本差。1301.T整体被动完成率较低,同类队列差异更容易转化为终点补单成本。

真正该改的是回测报告方式

这篇论文最有价值的地方,不是提出了又一种“更真实”的撤单规则。它反而拒绝替不可观测的队列挑选唯一答案。

如果一套策略只在front假设下表现好,换成back就失去优势,那么L2记录本身并没有支持那个确定结论。更稳妥的做法,是同时报告多种兼容队列下的结果,给出FIFO敏感性范围,并说明策略选择是否随规则变化。

这对被动执行尤其重要。回测中的高成交率,可能部分来自模拟器习惯把撤单放在你的前面;低成交率也可能来自相反约定。两者都能完美复现可见的订单簿深度。只检查“行情路径是否对得上”,并不足以验证成交模拟。

论文提出的框架还可以回答一个更实用的问题:某项策略优势是否穿过不同队列假设仍然成立。如果答案是肯定的,至少说明它在已声明的编译器范围内不太依赖某一种撤单约定。如果策略排序发生变化,那么研究者应把这种不确定性摆在收益数字旁边,而不是藏在撮合器设置里。

局限与未知

  • 证据只覆盖两只标的、七个月数据;留出结果来自同一个月的18个交易日。8.01、7.39个百分点及1.010、0.384个基点不能外推为所有L2市场的典型误差。
  • market removals和成交侧是用L1、L2对齐后推断的,并非直接观察;潜在订单拆分以及三种撤单规则也都是建模选择。这里的“观测等价”只针对保留的聚合路径,在更细的market-by-order数据中未必无法区分。
  • 模拟采用零延迟、无手续费与返佣、无市场冲击的影子策略,并在订单簿副本上处理终点剩余仓位。它衡量的是队列假设敏感性,不是可直接兑现的实盘收益。

同簿不同成交,并不意味着L2回测没有价值。它意味着评价被动策略时,订单簿对得上只是起点。真正需要交代的,是当看不见的队列换一种同样合理的排法,结论还站不站得住。


供稿材料 SOURCES — 1

← 返回 2026-09-18 · 量化板块