2026年十一月12日 · 执行

你的回测按官方收盘价成交了。你从未进入过收盘竞价。

你的回测按官方收盘价成交了。你从未进入过收盘竞价。

股票数据文件里的官方收盘价看起来和其他价格没什么两样。时间戳是美东时间 16:00:00,一个数字,随时可以成交。日频信号用它来标记。调仓打在它上面。研究代理会把它当成一直挂在盘口、等你来吃的报价。

收盘是一场竞价,不是一笔报价。它是必须在截止时间前被接受的收盘单的撮合价。如果回测在那里成交、却没有加入那一批,它拿走的是你根本不会参与的那一笔成交。

把 16:00 当成市价单去成交撮合价

常见捷径是:在收盘时或刚收盘前算出信号,按官方收盘价成交,盖上 16:00 的时间戳。在 AAPL 一个平静的周二,这个谎只差几美分。在主导日频调仓组合的那些日子里,它就是整笔交易。

到 16:00:00.000,收盘撮合正在进行,或刚刚完成。你这时发出的可立即成交订单进不了那场撮合。它落到剩下的东西里:残余显示量、零股、ARCA 或 Nasdaq 的盘后。那笔成交可能离官方收盘价差两美分,也可能差四十个基点,而且那是另一个流动性池。在罗素指数重组、月末或三重巫日周五,收盘往往占当日成交量的两位数百分比。那才是流动性。你不在里面。

3:50NYSE 收盘单截止时间(ET)
3:55Nasdaq 收盘撮合截止时间(ET)
~10%大盘股收盘时段的典型成交量占比

我们曾经无意中用模拟盘做成了这件事。一次参数微调落在 15:48。回测仍然按官方收盘价成交每一只股票。OMS 在 16:00:03 发出普通市价单,因为根本没把 MOC 接进系统。盘后成交、几笔拒单,以及相对数据文件 19 个基点的缺口——而那天文件显示我们在收盘时是平的。策略没坏。坏的是成交规则。

我仍然把 15:49 想成一个物理位置。有人在改权重。另一个人在盯着时钟。截止时间不在乎你们谁是对的。

真正去请求那场撮合的订单是 MOC,而即便是 MOC 也不是承诺。停牌、LULD 暂停、被取消的竞价、从未开盘的标的:你可以在 16:00 处于空仓,而一笔还在工作的收盘单死掉。LOC 被允许完全落空。如果撮合价是 $40.12 而你的限价是 $40.00,你什么也没拿到。大量回测照样记上收盘价。

更糟的是,有些数据商文件存的是从未在任何单一场所成交过的合成收盘价。你无法加入一场合成。如果策略本来会发 NYSE MOC,真正要紧的成交是 NYSE 的撮合价,以及那场竞价本来会吸收的量。

把常规交易时段的最后一笔成交当成收盘价

有些流水线原则上拒绝官方收盘价,改用 16:00 之前 SIP 的最后一笔成交,因为那笔成交至少“发生过”。在超大盘股上,最后一笔和官方收盘价常常只差一两美分,你不会察觉。在中盘股上,最后一笔可能是 15:59:51 的 200 股,方向由吃掉残余显示量的那一方决定。两秒后的官方收盘价是百万股的撮合,价格也不同。

指数、ETF 申购篮子,以及每一笔 MOC 调仓,都在撮合价上交易。你的回测交易的是残余。而且最后一笔成交并不带着你的量。如果那笔成交是 400 股而你的切片是 5,000,你没有拿到那个价格。你拿到的只是碰巧排在最后的时间戳。

我见过一份中盘股文件,在调仓周四,最后一笔与官方收盘价相差 28 美分。用最后一笔的回测看起来更“懂微观结构”。它只是另一个更薄的市场,而且还假定我们能成为那 200 股。

把成交滑到次日开盘以示保守

第三种规避会在代码审查里以注释出现:别假设我们能做收盘,所以按下一次开盘成交。听起来很成熟。它构建的是另一套策略。

收盘到收盘的信号在下一次开盘执行,已经吃掉了隔夜跳空。对许多股票因子来说,那段跳空是你以为自己抓住的那截行情里很大一块。按开盘成交并不能让回测更谨慎。它把 P&L 搬进你本没打算交易的那一时段,还把你丢进一场你同样没建模的开盘竞价。

纸面上,残骸很容易误读。回测的日度 P&L 仍然和信号对齐。模拟账本拿着一整夜的指数跳空,再加一早上开盘撮合的滑点。人们随后争论执行缺口,而诚实的说法是:两套系统做的根本不是同一笔交易。

但开盘也是一场竞价。如果你错过了昨天的截止时间,你不会自动拿到干净的 9:30 最后一笔。你拿到的是 MOO/LOO 机制、一笔失衡,以及一个跳空。把那叫做保守的收盘成交,不过是在一句高尚的注释下面藏了第二场未建模的撮合。

你记下的成交场所真正需要的残骸长什么样
官方收盘价,没有订单类型在该场所截止时间前被接受的 MOC 或 LOC盘后成交、一笔拒单,或没人承办的合成价
16:00 之前 SIP 的最后一笔成交一笔你本可以参与、且按你的量参与的交易把 200 股残余当成切片成交
把下一开盘当成“更安全”的收盘开盘撮合模型,外加隔夜跳空另一套策略,仍是竞价,仍然错过
如果模拟账户发不出 MOC 或 LOC,回测就不能拿官方收盘价。改成交规则。不要用 16:00 的市价单去近似撮合价。

诚实的分界很小。要么研究契约说我们在收盘里,那订单就是收盘单,时间戳在 NYSE 上早于 15:50、在 Nasdaq 上早于 15:55,按预期收盘量来定规模,若是 LOC 则允许未成交到期。要么我们不在收盘里,那盘后或下一开盘就是一项有名字的政策,自带自己的竞价,权益曲线也不再贴 16:00 的标签。

我们现在会让记下官方收盘价、却没有在该场所截止时间内挂着收盘单的回测失败。它毁掉过一些相当漂亮的日频信号曲线。那些曲线从来没法在它们声称的价格上执行。

回测市场微观结构股票收盘竞价执行
← 全部文章