1. 集合竞价在订单簿重建中的定位

在逐笔行情驱动的订单簿重建中,绝大多数时间我们处理的是连续竞价阶段的增量消息:一笔新订单进入、一笔订单被撤销、一笔成交吃掉对手方挂单。但每个交易日开盘与收盘前后,市场会切换到另一种撮合机制——集合竞价。如果重建程序把集合竞价期间的消息当作普通连续竞价消息处理,得到的盘口往往在开盘瞬间出现明显偏差,甚至出现负的挂单量。因此,理解集合竞价在重建流程中的位置,是构建可靠订单簿的第一道关口。

集合竞价的基本概念

集合竞价是指在规定时间段内接收买卖申报,但不逐笔立即撮合,而是在时点到达时把所有有效申报集中起来,按同一价格原则一次性成交的撮合方式。以沪深交易所开盘集合竞价为例,9:15–9:20 接受申报并可撤单,9:20–9:25 接受申报但不可撤单,9:25 集中撮合产生开盘价,未成交部分随后进入连续竞价。收盘集合竞价(如 14:57–15:00)同理,只是不接受撤单。

集中撮合的核心是“最大成交量原则”:系统在所有可能的成交价格中,选取能使成交量最大的价格;若存在多个价格满足最大成交量,则选取使未成交量最小的价格;若仍不唯一,则取最接近前收盘价(或参考价)的价格。这个规则决定了集合竞价产生的成交价不是某笔订单的价格,而是整个申报簿的均衡结果。

与连续竞价的区别

两者在订单簿重建中的处理逻辑差异很大,主要体现在四个方面:

  • 撮合时机:连续竞价逐笔实时撮合,每来一笔消息就可能改变盘口;集合竞价在时点集中撮合,期间盘口不产生成交,只累积申报。
  • 消息语义:连续竞价阶段的成交消息对应明确的买方订单与卖方订单;集合竞价成交是一次性批量成交,逐笔成交明细中往往以“集合竞价成交”标识,且不直接对应某两笔具体订单。
  • 可撤单性:集合竞价存在“可撤单窗口”和“不可撤单窗口”,重建时必须按时间窗口区分撤单消息是否合法有效。
  • 价格形成:连续竞价成交价由对手方价格决定;集合竞价成交价由最大成交量原则统一确定,所有成交按同一价格结算。

在订单簿重建中的关键作用

集合竞价在重建流程中承担三个不可替代的作用。第一,它是开盘簿的初始化来源。开盘前订单簿为空,集合竞价期间累积的申报构成初始挂单集合,9:25 的集中成交则从这些挂单中扣除已成交部分,剩余挂单成为连续竞价开始时的盘口。第二,它是价格基准的锚点。开盘价、收盘价都来自集合竞价,后续许多风控与统计指标以此为参照。第三,它是状态切换的边界。重建程序必须识别“集合竞价→连续竞价”的状态迁移,在迁移点做一次簿的一致性校验,否则错误会一路累积到全天。

集合竞价在订单簿重建中的时间轴与状态迁移 9:15 9:20 9:25 9:30 可撤单申报窗口 接受申报 · 允许撤单 不可撤单窗口 接受申报 · 禁止撤单 集中撮合 最大成交量原则 连续竞价 逐笔撮合 · 增量更新 重建程序处理动作 累积申报挂单 记录撤单有效性 冻结撤单处理 仅接受新申报 批量扣减成交 生成开盘簿快照 增量更新盘口 逐笔校验一致性 常见挑战 ① 撤单窗口边界误判导致挂单量虚增 ② 集合竞价成交明细与挂单无法一一对应 ③ 开盘瞬间状态迁移未做一致性校验 ④ 收盘集合竞价与开盘规则差异(如是否可撤单)需分别建模 ⑤ 部分成交后剩余挂单的簿内位置需重新定位

常见挑战与处理要点

第一个挑战是撤单窗口的边界判断。9:20 之后交易所不再接受撤单,但行情消息可能因网络延迟在 9:20 之后才到达。重建程序不能简单按本地接收时间判断,而应以消息中的交易所时间戳为准,否则会把 9:19:59 发出的合法撤单误判为非法,或把 9:20:01 的非法撤单误判为合法,导致挂单量偏差。

第二个挑战是成交与挂单的对应关系。集合竞价成交是批量结果,逐笔成交明细通常只给出成交价、成交量,不给出具体买卖订单号。重建时不能像连续竞价那样逐笔扣减,而应采用“先按最大成交量原则推算各价位成交量,再从对应价位挂单中按时间优先扣减”的方式。一个可操作的近似做法是:对每个成交价位,按该价位挂单的申报时间先后依次扣减,直到成交量耗尽。

第三个挑战是状态迁移的一致性校验。在 9:25 集中撮合完成后、连续竞价开始前,应做一次簿校验:所有价位挂单量非负、买卖盘不交叉(买一价小于卖一价)、总挂单量等于集合竞价申报量减去成交量。若校验失败,说明集合竞价处理有误,应在进入连续竞价前修正,而不是带着错误继续累积。

处理集合竞价时,建议在重建程序中显式维护一个“市场阶段”状态机:PRE_OPEN → OPEN_AUCTION_CANCELABLE → OPEN_AUCTION_FROZEN → OPEN_MATCH → CONTINUOUS。每条消息先根据交易所时间戳映射到阶段,再决定走哪条处理分支。这样能把窗口边界、撤单合法性、批量成交等差异集中管理,避免散落在各处的条件判断。

最后需要强调,集合竞价与连续竞价不是两套独立逻辑,而是同一订单簿在不同阶段的不同演化规则。重建程序的价值在于用统一的数据结构承载两种机制,并在阶段切换点保证簿的一致性。把集合竞价处理正确,开盘后的连续竞价重建才有可靠的起点;反之,开盘簿的偏差会通过后续每一笔增量消息持续放大,最终使整个交易日的盘口失真。