没有缝的时候,第一笔价格从哪来
连续竞价有个隐含前提:墙上已经有人挂单,有买一有卖一,新订单来了就有对手。但每天早上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.98:愿意接受的买单=全部三档(都愿出≥9.98),共3800股;愿意接受的卖单=9.98的500股。成交=min(3800,500)=500。
- 定9.99:买单=10.00档+9.99档=1800股;卖单=9.98档+9.99档=1700股。成交=min(1800,1700)=1700。
- 定10.00:买单=10.00档=1000股;卖单=全部3200股。成交=1000。
9.99能成交1700股,最多——开盘价定为9.99。所有被撮中的订单,不管限价多少,一律按9.99成交:出10.00的买方少付了一分,要9.98的卖方多收了一分。统一价格对所有人都是"不比你要求的差",这就是它能服众的原因。
大白话:连续竞价是"随到随配",集合竞价是"攒一波、民主投票"——哪个价格能让最多订单成交,哪个价格当选,当选后所有人按同一价格成交,没人吃亏。
平票怎么办
如果两个价格的最大成交量一样呢?规则会一层层往下加裁判(各交易所措辞略不同,思路一致):
- 未匹配量最小:选成交完之后,墙上剩的未成交差额最小的价;
- 还平,参考价最近:选离昨收盘价(或某个基准价)最近的;
- 还平,取中间或按规则取其一。
写实现时这就是一道清晰的算法题:枚举候选价(所有订单限价去重)→ 每个价算买侧累计量和卖侧累计量 → 取min得可成交量 → 按"最大成交量→最小剩余→最近参考价"排序选优。几十行代码。
为什么不一直用集合竞价
既然集合竞价这么"民主",为什么开盘后就换回连续竞价?因为两者的强项正好错开:
- 集合竞价强在定价:信息嘈杂、订单稀疏的时候(隔夜消息发酵后的开盘、大事发生后的复牌),把所有人的意愿攒起来一次性定价,比让前两张碰巧到达的订单定出价格要稳得多,也抗操纵——想操纵一个瞬间的统一价,你得扛住全市场的量。
- 连续竞价强在连续:市场正常运转时,交易者要的是"现在就能成交",等不起攒单。而且连续成交产生的连续价格本身就是信息,指引新订单进来。
所以成熟市场是两者接力:开盘集合竞价定开盘价 → 白天连续竞价 → 收盘再来一次集合竞价定收盘价。收盘价用集合竞价尤其重要——基金净值、指数、衍生品结算都拿收盘价算账,这个价必须是全天最抗操纵的一口价。
工程上的三个坑
- 集合竞价期间要广播"虚拟开盘价":一边攒单一边实时算出"如果现在截止,开盘价是多少、能成交多少",推给用户,引导大家调整订单。A股盘口的9:15-9:25你看到的价格变动就是它。这个虚拟价是只读计算,不改簿子。
- 撤单规则分时段:A股9:15-9:20可撤,9:20-9:25不可撤——最后五分钟锁死,防止有人用大单虚晃一枪再撤掉来操纵开盘价。你的状态机要按时间段切换"能不能撤"。
- 没撮中的订单去哪:集合竞价结束后,剩余未成交的限价单按价格-时间优先进入连续竞价的簿子——两套玩法共用同一本簿,交接要干净。
到这里,"一个交易所怎么定价"的两套发动机都齐了。下一章我们走出单个交易所,看看A股、美股、期货、加密货币这些真实玩家的规则差在哪——以及哪些是铁律、哪些只是地方习俗。