撮合引擎:交易所是怎么把买单卖单凑成一笔交易的 书架

第 07 章 / 共 12 章

第七章 · 集合竞价:开盘价是投票投出来的

没有缝的时候,第一笔价格从哪来

连续竞价有个隐含前提:墙上已经有人挂单,有买一有卖一,新订单来了就有对手。但每天早上9:25(A股开盘前),墙是空的——或者更准确地说,隔夜攒了一堆互相碰不上的订单,谁也不知道"此刻的公道价"是多少。这时候第一章那条"碰上就成交"的规则没法直接开跑:先放谁进来?按什么价?

交易所的答案不是"赶紧开始连续竞价",而是换一个玩法:集合竞价(call auction)——先把所有人的订单收上来攒着,谁都别成交,然后在一个瞬间,按一个统一的价格,一次性全部撮完。A股早上9:15到9:25就是这样:你下的单进了交易所但不成交,只在9:25:00那一刻,全部按同一个开盘价成交。

核心原则:让最多人成交的那个价赢

集合竞价的定价规则叫最大成交量原则:找出一个价格,使得在这个价位上能成交的总量最大,它就是开盘价。

算一遍就懂了。假设9:25前攒下的订单是这样:

买单:10.00买1000股 / 9.99买800股 / 9.98买2000股
卖单:9.98卖500股 / 9.99卖1200股 / 10.00卖1500股

(注意:这里的买单限价是"最多出多少",卖单是"最少收多少",所以10.00的买单愿意按任何 ≤10.00 的价格成交。)现在逐个候选价格试算"如果开盘价定在这里,能成交多少":

9.99能成交1700股,最多——开盘价定为9.99。所有被撮中的订单,不管限价多少,一律按9.99成交:出10.00的买方少付了一分,要9.98的卖方多收了一分。统一价格对所有人都是"不比你要求的差",这就是它能服众的原因。

大白话:连续竞价是"随到随配",集合竞价是"攒一波、民主投票"——哪个价格能让最多订单成交,哪个价格当选,当选后所有人按同一价格成交,没人吃亏。

平票怎么办

如果两个价格的最大成交量一样呢?规则会一层层往下加裁判(各交易所措辞略不同,思路一致):

  1. 未匹配量最小:选成交完之后,墙上剩的未成交差额最小的价;
  2. 还平,参考价最近:选离昨收盘价(或某个基准价)最近的;
  3. 还平,取中间或按规则取其一。

写实现时这就是一道清晰的算法题:枚举候选价(所有订单限价去重)→ 每个价算买侧累计量和卖侧累计量 → 取min得可成交量 → 按"最大成交量→最小剩余→最近参考价"排序选优。几十行代码。

为什么不一直用集合竞价

既然集合竞价这么"民主",为什么开盘后就换回连续竞价?因为两者的强项正好错开:

所以成熟市场是两者接力:开盘集合竞价定开盘价 → 白天连续竞价 → 收盘再来一次集合竞价定收盘价。收盘价用集合竞价尤其重要——基金净值、指数、衍生品结算都拿收盘价算账,这个价必须是全天最抗操纵的一口价。

工程上的三个坑

  1. 集合竞价期间要广播"虚拟开盘价":一边攒单一边实时算出"如果现在截止,开盘价是多少、能成交多少",推给用户,引导大家调整订单。A股盘口的9:15-9:25你看到的价格变动就是它。这个虚拟价是只读计算,不改簿子。
  2. 撤单规则分时段:A股9:15-9:20可撤,9:20-9:25不可撤——最后五分钟锁死,防止有人用大单虚晃一枪再撤掉来操纵开盘价。你的状态机要按时间段切换"能不能撤"。
  3. 没撮中的订单去哪:集合竞价结束后,剩余未成交的限价单按价格-时间优先进入连续竞价的簿子——两套玩法共用同一本簿,交接要干净。

到这里,"一个交易所怎么定价"的两套发动机都齐了。下一章我们走出单个交易所,看看A股、美股、期货、加密货币这些真实玩家的规则差在哪——以及哪些是铁律、哪些只是地方习俗。

撮合引擎:交易所是怎么把买单卖单凑成一笔交易的 · 王建硕
费曼式写法 · 由多个 AI 代理撰写与互相审校