市场如何撮合
拆开交易所这台撮合引擎:订单簿、竞价规则、买卖五档,这是全书程序员最有快感的一章。
股价不是谁定的,是撮合出来的。交易所本质上是一个确定性的匹配服务:接收全市场的委托请求,按两条固定规则排序,能配对的当场成交,配不上的排队等着。整套逻辑简单到可以在一页纸上写完,规则全部公开,行为完全可预测。
理解这台引擎有两个直接好处。第一,你会知道按下「买入」之后到底发生了什么,不再把成交价的波动理解成「有人在操纵」。第二,散户交易成本里被白白浪费的那部分,大多发生在这一层:单子怎么下、什么时候下、下多大。
2.1 订单簿:两个有序队列
交易所为每一只股票维护一个订单簿(Order Book)。它就是两个按价格排序的队列:
- 买盘(bids):所有想买的委托,按出价从高到低排。出价最高的在最前面,叫「买一」。
- 卖盘(asks):所有想卖的委托,按要价从低到高排。要价最低的在最前面,叫「卖一」。
A 股的最小价格变动单位是 0.01 元,所以价格轴是离散的整数格子(以分为单位)。每个价格档位下面挂着若干笔委托,按进入交易所主机的先后顺序排成一条 FIFO 队列。委托的最小数量单位是「手」,买入 1 手 = 100 股。
买一价永远低于卖一价,两者之差叫价差(spread)。这个缺口是订单簿的空档:没人愿意跨过去,就一笔都不会成交。一旦有人跨过去——出一个不低于卖一的买价,或不高于买一的卖价——撮合立即发生。所谓「股价涨了」,物理含义就是买盘不断跨过价差、把卖盘一档一档吃光。
# 订单簿 = 两个按价格排序的队列,每档之内先到先得
bids = MaxHeap() # 买盘:出价越高越靠前
asks = MinHeap() # 卖盘:要价越低越靠前
def on_order(o):
book = asks if o.side == BUY else bids
while o.qty > 0 and book and crosses(o, book.top()):
best = book.top() # 对手方最优价
n = min(o.qty, best.qty)
trade(price=best.price, qty=n) # 成交价取「先挂单」一方的价格
o.qty -= n; best.qty -= n
if best.qty == 0: book.pop()
if o.qty > 0 and o.type == LIMIT:
push(o) # 没吃完的部分挂上去排队
注意 trade(price=best.price) 这一行。A 股的成交价取先挂单一方的价格:卖一挂在 10.24 元,你出价 10.30 元买,成交价是 10.24 元而不是 10.30 元,多出来的 6 分钱不会被吃掉。这是很多新手的第一个惊喜——挂高价买入并不会让你买贵,只会让你排到队伍最前面、优先成交。
2.2 撮合规则只有两条
整台引擎的排序规则只有两条,没有第三条:
- 价格优先:买入价高的先于买入价低的成交;卖出价低的先于卖出价高的成交。
- 时间优先:同一价格档位上,先到达交易所主机的委托先成交。
第一个结论:机构没有插队特权。基金公司的一手和你的一手在同一档位上排同一条队,谁先到谁先成交。所谓公平,是这条规则给的。
第二个结论:想优先成交,合法手段只有出价更有诚意(价格优先)或更早挂单(时间优先)。涨停板上排队买入常常一整天买不到,就是因为前面已经有几百万手在同一价格上排着,时间优先把你钉在了队尾。
2.3 限价单与市价单
你能提交的委托只有两大类,区别就是有没有 price 这个参数。
限价单带价格:「以不高于 10.24 元买入 10 手」。能成交就成交,不能就挂上去排队。保证是「价格绝不劣于我说的数」,代价是可能一直不成交。
市价单不带价格:「立刻按对手方现在的价格买 10 手」。保证是「大概率立刻成交」,代价是你不知道最终成交价。A 股的市价单细分成几种,名字吓人,含义都很直白:
| 委托类型 | 行为 | 适用 |
|---|---|---|
| 最优五档即时成交剩余撤销 | 只吃对手方前五档,剩余部分立刻撤销 | 沪、深 |
| 最优五档即时成交剩余转限价 | 只吃对手方前五档,剩余部分转成限价单挂上去 | 沪、深 |
| 对手方最优价格 | 按对手方第一档价格成交(买入按卖一价) | 深 |
| 本方最优价格 | 按本方第一档价格挂单(买入挂在买一价) | 深 |
| 即时成交剩余撤销(FAK)/全额成交或撤销(FOK) | 成交多少算多少剩余撤销;或者要么全成交要么全撤 | 深 |
「最优五档」是交易所替你做的兜底:即使交一张不设上限的市价买单,它最多也只吃到卖五,不会一路穿到涨停板。此外,连续竞价阶段还有有效竞价范围(俗称价格笼子):科创板、创业板要求买入申报价不高于基准价的 102%、卖出不低于 98%,超出范围直接拒单;主板机制类似,并额外允许「基准价上下 10 个最小变动单位」作为孰高/孰低的兜底。具体数值以交易所现行业务规则为准,设计意图是一致的——防止离谱报价把价格瞬间打飞。
2.4 集合竞价:一次批处理
开盘前的 9:15 到 9:25,交易所不撮合。它只做一件事:把所有委托攒起来。到 9:25 那一刻,用一次全局计算,求出一个使成交量最大的价格,然后把这个价格附近所有能成交的单子,统统按这一个价格成交掉。这个价格就是开盘价。
为什么这样设计?隔夜积压了大量信息(财报、政策、外盘),一开门就逐笔撮合的话,第一笔单会以一个近乎随机的价格成交,随后价格剧烈跳动。批处理把这段时间的所有信息一次性折叠成同一个价格,公平得多。
这个阶段还有一条关键的分段规则:
- 9:15–9:20:可以申报,也可以撤单。
- 9:20–9:25:可以申报,不能撤单。
- 9:25:一次性撮合,产生开盘价。
收盘时也有一次同样机制的集合竞价:14:57–15:00,全程不可撤单,15:00 一次性撮合产生收盘价,申报价格被限制在基准价上下 2% 以内。这条规则让收盘价难以被尾盘一两笔大单随意拉动,因此以收盘价为基准的指数、基金净值都更可信。
图 2-1 · 集合竞价怎么算出开盘价
2.5 连续竞价:来一条处理一条
9:30 开始,引擎切换到流式模式。交易时段是 9:30–11:30 和 13:00–15:00。每收到一笔新委托,就立刻和订单簿另一侧比对:买入价 ≥ 卖一价(或卖出价 ≤ 买一价)就成交,成交完还有剩余就挂上去排队。撮合本身是微秒级的,没有「每秒撮合一次」这种批次。
所以「最新价」这个数字,含义非常具体:它是最近一笔成交的价格,仅此而已。它不代表公司值多少钱,也不代表你现在一定能按这个价买到——它只是历史上某一微秒发生过的一次配对。
另外,15:05–15:30 还有盘后固定价格交易:所有成交统一按当日收盘价撮合,只排时间优先。2026 年 7 月的交易新规把它从科创板、创业板扩容到了沪深主板股票和 ETF,适用范围以交易所最新公告为准。
2.6 买卖五档:盘口怎么读
行情软件上那个「卖五到卖一、买一到买五」的小表格,就是订单簿最靠近价差的十个价格档位的切片。每一档两个数:价格,以及这一档上所有委托的总量。
读盘口只需要问两个问题:每档有多厚?档与档之间隔多远?厚且密,说明流动性好,你的单子进出不会撼动价格;薄且稀,说明一笔中等大小的单子就能把价格推走几个百分点。
图 2-2 · 一笔市价买单如何逐档吃掉卖盘
2.7 流动性与滑点:你的单子会不会撼动价格
流动性的工程定义很简单:把一定数量的股票立刻变成现金,需要付出多大的价格代价。代价越小,流动性越好。
代价有两个来源。一是价差:大盘蓝筹买一卖一常年只差一两分,可以忽略;冷门小盘股能差到几分甚至更多。二是冲击成本,也就是图 2-2 那样的逐档吃单——单子越大、盘口越薄,吃穿的档位越多,成交均价越差。
散户的单子通常小到吃不穿一档,日常感受不到。但这几种情况会让滑点突然变贵:
- 冷门小盘股:日成交额只有几千万,每档只挂一两手。买 10 万元就可能把价格拉高一两个点,卖出时再亏一两个点,一进一出白白蒸发几个百分点。
- 开盘和收盘前后几分钟:波动最剧烈,市价单的实际成交价和你按下按钮时看到的价格可能差很远。
- 突发消息瞬间:盘口在毫秒内被抽空,市价单直接吃到很远的档位。
- 跌停板上:买盘一侧几乎是空的,你想卖只能排在跌停价的长队里,很可能一整天都卖不出去——这时流动性不是变差,是归零。
于是有一条几乎零成本的纪律:默认永远用限价单。多花两秒填个价格,就把「成交价不确定」这类风险整个关掉。想成交快,就把买入限价定得比卖一价高一两分,照样立刻成交,同时给自己留了上限。
2.8 A 股竞价制 vs 美股做市商制
上面讲的整套机制叫订单驱动(order-driven):所有人的委托进同一个订单簿,互相直接配对,交易所只做撮合,自己不参与买卖。A 股的主体就是这套集中竞价制度。
美股主流是报价驱动(quote-driven):做市商同时挂出买价和卖价,随时用自己的账户接下你的单子,赚价差作为提供流动性的报酬。而且美股不是一个市场,是几十个交易场所(多家交易所加暗池),监管要求订单以全市场最优报价 NBBO 成交,券商会把单子路由到价格最好的地方——这是美股常有「成交价比我挂的还好」的原因。
两种制度各有代价。竞价制透明、规则简单、一视同仁,但冷门股票没人负责提供流动性,盘口可能极薄。做市商制保证随时有对手方,代价是你付了价差,而且路由链条复杂(比如订单流付费 PFOF),透明度不如前者。
A 股也在做混合尝试:科创板自 2022 年 10 月 31 日起在竞价基础上引入做市商,由有资格的券商双边报价改善流动性。但对个人投资者,心智模型依然是订单簿加两条优先规则,做市商只是簿里一个报价特别勤快的参与者。
| A 股(竞价制为主) | 美股(做市商制为主) | |
|---|---|---|
| 价格形成 | 全部委托进同一订单簿互相配对 | 做市商双边报价,多场所竞价 |
| 对手方 | 另一个投资者 | 常常是做市商的自营账户 |
| 市场结构 | 沪、深、北三家交易所,各股票单一场所 | 数十个交易场所 + 暗池,NBBO 最优价保护 |
| 流动性保障 | 无人负责,冷门股盘口可能极薄 | 做市商有义务持续报价 |
| 你付出的隐性成本 | 价差 + 冲击成本 | 价差(做市商的利润)+ 路由差异 |
2.9 一笔订单的一生
最后把链路串起来。你在手机上点「买入」之后,这笔委托要穿过四个系统。
图 2-3 · 从点击「买入」到真正过户
四个环节各司其职:App 只是输入界面;券商柜台做资金和权限校验,是链路上唯一会因为你自己的问题(余额不足、无权限)打回委托的地方;交易所只负责撮合,不碰钱也不碰股份;中国结算做清算交收,持股最终登记在它的账本上。
成交回报到你的手机通常在一秒之内,但所有权变更要到 T+1 才完成。理解了这一点,「今天买明天才能卖」就不是一条奇怪的限制,而是交收周期在交易层的直接映射。下一章会把它和涨跌停、税费一起,当成这套协议的规范文档来读。
2.10 这一章的可操作结论
- 默认用限价单。多填一个数字,换掉一整类不确定性;想成交快就把价格定得比对手方最优价好一两分。
- 挂高价买不会买贵。成交价取先挂单一方的价格,高出的部分不会被吃掉,只让你排得更靠前。
- 9:20 之前的盘口不要信。那五分钟的挂单可以随意撤销,虚拟开盘价可以被零成本操纵。
- 把成交额当成仓位的容量上限。日成交额太小的股票进得去出不来,这和你看好不看好无关。
- 五档盘口是 3 秒一张的快照。任何建立在「逐笔观察主力挂单」上的方法论,在数据精度上就站不住。
- 撮合层不会暗算你。规则完全公开、对所有人一致。真正的成本发生在你按了多少次买入按钮上——那是第 3 章和第 9 章的主题。