4. 价格形成机制:撮合引擎的工作原理
做量化交易这些年,我见过太多人把价格当成一个「黑箱」——屏幕上跳动的数字,好像天然就该在那里。但说白了,价格是怎么来的?是撮合引擎一单一单「撞」出来的。
今天我们就拆开这个黑箱,看看撮合引擎到底怎么工作。我个人习惯把撮合引擎比作一个「红娘」——它不生产订单,只是把买卖双方拉到一起。但这位红娘的规则,决定了整个市场的价格走向。
4.1 撮合引擎的核心逻辑
先看一个最简单的场景:
- 买方A:出价100元,买10股
- 卖方X:要价99元,卖10股
你想想看,A愿意出100,X只想要99,中间有1块钱的「便宜」可占。撮合引擎会怎么做?
答案是:立即成交。成交价是多少?不是100,也不是99,而是99元(以先进入系统的价格为准,具体看规则)。
嗯,这里要注意:成交价不一定等于买一或卖一的价格。它取决于订单簿的「流动性」和「到达顺序」。
核心公式:
成交条件:买价 ≥ 卖价
成交价格:通常取「先进入订单簿」的那一方的价格
4.2 价格优先与时间优先原则
这是撮合引擎的「宪法」。我当年刚入行时,觉得这规则太简单了,直到有一次在实盘中发现订单被「插队」了……其实不是插队,是我没理解透。
4.2.1 价格优先
说白了就是:出价高的买家优先成交,要价低的卖家优先成交。
举个例子:
| 买方队列 | 价格 | 数量 |
|---|---|---|
| 买方A | 101元 | 100股 |
| 买方B | 100元 | 200股 |
| 买方C | 99元 | 150股 |
这时候来了一笔卖单,要价100元,数量150股。谁会先成交?
答案是买方A,因为他出价101元,价格最高。哪怕他来得最晚,只要价格有优势,他就排在前面。
实战经验:我在做高频策略时,经常利用「价格优先」来抢单。比如盘口买一挂100元,我挂100.01元,虽然只多1分钱,但能排到所有100元订单的前面。这在流动性好的品种上特别管用。
4.2.2 时间优先
当价格相同时,就看谁先到。先到先得。
还是上面的例子,如果买方A和买方B都出价100元:
| 买方队列 | 价格 | 数量 | 到达时间 |
|---|---|---|---|
| 买方B | 100元 | 200股 | 09:30:01.000 |
| 买方A | 100元 | 100股 | 09:30:01.050 |
这时候来了一笔卖单,要价100元,数量150股。买方B先到,所以先成交150股(买方B的200股被吃掉150股,还剩50股)。买方A?等下一轮吧。
我曾经踩过的坑:有一次做套利策略,我同时挂了买单和卖单,以为价格相同就能成交。结果因为网络延迟,我的买单比对手晚了0.1毫秒,硬生生被「插队」了。后来我专门优化了网络拓扑,把服务器搬到交易所机房隔壁。嗯,做高频,时间就是金钱。
4.3 盘口价差与市场深度
这两个指标,是量化交易者每天都要盯的。我习惯把它们称为「市场的体温计」。
4.3.1 盘口价差(Spread)
定义很简单:卖一价 - 买一价。
比如:
- 买一:100.00元,挂单1000股
- 卖一:100.02元,挂单800股
价差 = 100.02 - 100.00 = 0.02元。
价差越小,说明市场流动性越好,交易成本越低。我一般这样判断:
- 价差 < 0.01%:流动性极好,适合高频策略
- 价差 0.01% - 0.1%:正常水平
- 价差 > 0.1%:流动性差,小心滑点
注意:价差不是固定的。盘中会波动,尤其是大单出现时。我见过一个品种,平时价差0.01元,突然来了一笔大卖单,价差瞬间扩大到0.50元。如果你用的是市价单,这一下就亏大了。
4.3.2 市场深度(Depth)
市场深度,说白了就是「每个价位上挂了多少单」。它告诉你:如果你想买/卖一大笔,价格会滑多少。
举个例子:
| 档位 | 买价 | 买量 | 卖价 | 卖量 |
|---|---|---|---|---|
| 1 | 100.00 | 1000 | 100.02 | 800 |
| 2 | 99.98 | 2000 | 100.04 | 1500 |
| 3 | 99.96 | 3000 | 100.06 | 2500 |
| 4 | 99.94 | 5000 | 100.08 | 4000 |
| 5 | 99.92 | 8000 | 100.10 | 6000 |
如果你想买入10000股,用市价单:
- 先吃掉卖一的800股,价格100.02
- 再吃掉卖二的1500股,价格100.04
- 再吃掉卖三的2500股,价格100.06
- 再吃掉卖四的4000股,价格100.08
- 最后吃掉卖五的1200股(还剩1200),价格100.10
平均成交价 = (800×100.02 + 1500×100.04 + 2500×100.06 + 4000×100.08 + 1200×100.10) / 10000 ≈ 100.068元。
比当前的卖一价100.02高了0.048元。这就是滑点。
我的习惯:在做大单交易时,我会先看市场深度。如果深度不够,我会拆成小单,或者用冰山订单(只显示一部分数量)。有一次我要买入50万股,盘口深度只有10万股,我硬是拆了20笔,花了15分钟才吃完。虽然慢,但滑点控制得很好。
4.4 撮合流程的完整逻辑
下面我用一张流程图,把整个撮合过程串起来。这是我自己画的一个简化版本,但核心逻辑是一样的。
这张图的核心逻辑是:
- 新订单到达:先判断能不能和现有订单成交
- 价格优先:找到最优价格的对手单
- 时间优先:同价情况下,先到先得
- 执行成交:更新双方持仓和订单簿
- 未成交部分:进入订单簿,等待后续订单
关键点:撮合引擎不是「一次匹配完」,而是「逐笔匹配」。每来一个新订单,都会触发一次完整的匹配流程。这就是为什么高频交易中,订单到达的顺序和速度如此重要。
4.5 实战中的注意事项
最后,分享几个我在实战中总结的经验:
- 别只看买一卖一:盘口深度才是真正的「流动性池子」。买一卖一可能只有几百股,但下面几档可能有几万股。
- 小心「假深度」:有些做市商会挂大单但随时撤单。我见过一个品种,卖二挂了5万股,但一有买单接近就撤了。这种「幽灵订单」会误导你的判断。
- 价差不是成本的全部:滑点才是。尤其是大单交易,滑点可能比价差大10倍。
- 时间优先在极端行情下会失效:比如熔断、涨跌停时,交易所可能会启用「集合竞价」模式,这时候所有订单按同一价格成交,时间优先原则暂时失效。
我曾经犯过的错:有一次做统计套利,我根据历史数据算出了一个「合理价差」,然后挂了限价单等成交。结果市场突然波动,价差瞬间扩大,我的订单被「吃掉」了——不是成交,而是被更优价格的订单「插队」了。后来我才意识到,在波动剧烈的市场中,限价单的「时间优先」优势会大打折扣。现在我做这类策略,都会加上「价格偏移保护」,避免被极端行情误伤。
好了,关于价格形成机制,今天就聊到这里。记住一句话:价格不是算出来的,是「撞」出来的。理解撮合引擎的每一笔匹配,你才能真正看懂盘口的每一次跳动。
公众号:蓝海资料掘金营,微信deep3321