3. 回测引擎的撮合逻辑
回测结果差异的根源,往往不在策略信号本身,而在引擎如何把“信号”变成“成交”。同一套均线策略,在分钟回测里可能年化 18%,换到逐笔回测却只剩 11%,差距主要来自撮合逻辑对价格路径、成交时点和可成交量的不同假设。本节聚焦引擎内部:订单如何进入撮合、以什么价格匹配、在什么条件下判定成交,以及两种粒度在这些环节上的机制差异。
一、撮合的基本要素:订单、盘口与撮合时钟
任何撮合逻辑都围绕三个要素展开:订单(方向、类型、价格、数量)、盘口(买一卖一及更深档位的价格与挂单量)、撮合时钟(引擎推进时间的最小步长)。分钟回测的撮合时钟是“分钟 bar”,逐笔回测的撮合时钟是“逐笔快照或逐笔成交事件”。时钟粒度决定了引擎能看到多少价格路径信息,也决定了成交判定的精细程度。
以限价单为例,其成交条件可抽象为:买单要求“卖一价 ≤ 委托价”,卖单要求“买一价 ≥ 委托价”。这个条件在两种粒度下形式相同,但代入的盘口数据不同——分钟回测代入的是该分钟 bar 的收盘价或最高最低价推导出的近似盘口,逐笔回测代入的是事件发生时刻的真实盘口快照。差异就从这里开始放大。
二、分钟回测:以 bar 为撮合单元的近似机制
分钟回测的引擎通常采用“信号—下一 bar 成交”的时序约定:策略在第 t 根 bar 收盘后计算指标并产生信号,引擎在第 t+1 根 bar 上执行撮合。市价单一般以第 t+1 根 bar 的开盘价成交;限价单则用该 bar 的最高价、最低价与委托价比较来判定是否触价。例如委托买入价 10.00,若第 t+1 根 bar 最低价为 9.95,引擎判定“触价成立”,成交价取 min(10.00, 开盘价)。
这种机制的核心局限在于丢失了 bar 内的价格路径。一根分钟 bar 只保留开、高、低、收四个价格和总成交量,引擎无法知道最低价出现在开盘后第几秒、当时卖一挂单还剩多少。于是产生两类系统性偏差:其一,若 bar 内价格先跌破委托价又迅速拉回,引擎仍判定成交,而真实市场中订单可能只排在队列末尾未能成交;其二,引擎通常假设委托量可以全部成交,忽略盘口深度约束,导致大资金策略的容量被高估。此外,分钟回测对滑点的处理多为固定值或按成交量比例估算,而非由盘口深度自然推导。
三、逐笔回测:以事件为驱动的真实盘口匹配
逐笔回测的引擎以逐笔快照(Level-1 或 Level-2)或逐笔成交明细为驱动事件。每到一个事件,引擎更新盘口状态,然后对活动订单执行撮合:买单从卖一开始逐档比较价格,若卖一价不高于委托价,则按卖一价成交 min(委托剩余量, 卖一挂单量),不足部分继续吃卖二、卖三,直至价格不满足或数量耗尽;未成交余量保留在订单簿中,等待后续事件。卖单方向对称处理。
这一机制天然支持部分成交与排队模拟。例如在 09:31:03 的快照中卖一为 10.01×100,若买单委托 500 股、限价 10.02,则先成交 100 股于 10.01,剩余 400 股继续匹配卖二;若卖二价为 10.03 已高于限价,则剩余部分挂单等待。引擎还能根据订单到达时刻与快照中已有挂单量的关系估算排队位置,从而判断后续成交明细中哪些成交量应归属本订单。滑点不再是外生参数,而是盘口深度与订单规模相互作用的内生结果。
四、机制差异的量化影响与选用建议
两种机制的差异可归纳为三个维度:成交时点(bar 级延迟 vs 事件级即时)、成交价格(开盘价/触价近似 vs 逐档真实盘口价)、成交数量(全量假设 vs 部分成交与排队约束)。对低频、持仓数日以上的策略,分钟级近似带来的误差在统计上可能被平滑;但对日内、打板、套利等对成交价格和数量敏感的策略,逐笔撮合是必要选择。
| 对比维度 | 分钟回测 | 逐笔回测 |
|---|---|---|
| 撮合时钟 | 分钟 bar | 逐笔快照/成交事件 |
| 盘口信息 | OHLC + 总量,近似推导 | 真实买卖档位与挂单量 |
| 成交判定 | 触价即成交 | 逐档匹配,支持部分成交 |
| 滑点来源 | 外生参数估算 | 盘口深度内生 |
| 计算成本 | 低 | 高,依赖逐笔数据质量 |
实操中,建议先用分钟回测做策略逻辑的快速验证与参数粗筛,再对候选策略用逐笔回测复核成交敏感环节。若两者收益差距显著,应优先检查限价单触价判定、大单成交量假设与滑点模型这三处,它们通常是差异的主要来源。理解撮合机制,才能判断回测数字里哪些是策略能力,哪些是引擎假设的馈赠。