撮合引擎原理:价格优先、时间优先原则;连续竞价与集合竞价机制
做量化交易这些年,我见过不少新手一上来就研究各种策略,却忽略了最底层的东西——订单簿是怎么撮合的。说白了,你连交易所怎么匹配买卖单都不清楚,策略写得再花哨也是空中楼阁。今天我们就来聊聊撮合引擎的核心逻辑。
一、价格优先与时间优先:两条铁律
撮合引擎的规则其实很简单,就两条:价格优先和时间优先。嗯,这里要注意,这两条是同时生效的,不是二选一。
- 价格优先:买单出价高的优先成交,卖单出价低的优先成交。说白了,谁更"急"谁先走。
- 时间优先:价格相同时,先挂单的先成交。这个好理解,先来后到嘛。
我个人习惯把这两条规则记成一句话:"高价买单优先,低价卖单优先;同价则先到先得"。你想想看,这其实跟菜市场买菜一个道理——你出价高,菜贩子肯定先卖给你;如果大家都出一样的价,那谁先开口谁先拿。
核心要点:价格优先的优先级高于时间优先。只有在价格相同的情况下,时间优先才会生效。
我在项目中遇到过一个问题:某个策略在回测时表现很好,实盘却总是成交不了。后来一查,原来是订单簿里同价位已经排了上千笔单子,我的单子排在了最后面。这就是典型的"只看价格不看时间"的坑。
二、连续竞价:日常交易的主战场
连续竞价,就是交易时间内一直在进行的撮合方式。每进来一笔订单,系统就立刻尝试匹配。匹配上了就成交,匹配不上就挂在那里等。
举个例子:
当前订单簿状态:
卖一:10.00元 100股
卖二:10.01元 200股
买一:9.99元 150股
买二:9.98元 300股
现在来了一笔买单:10.00元 200股
撮合过程:
1. 先匹配卖一10.00元,成交100股
2. 剩余100股继续匹配卖二10.01元?不行,因为买单价格只有10.00元
3. 所以最终成交100股,剩余100股挂在买一位置
为什么会这样?因为连续竞价的核心逻辑就是"见价成交"——只要买单价格 ≥ 卖单价格,就能成交。成交价取两者之间的某个值,通常是取先挂单的价格。
实战技巧:如果你想让订单快速成交,可以挂一个"吃单"价格。比如当前卖一是10.00元,你挂10.01元买入,系统会直接吃掉卖一的单子。这就是所谓的"市价单"逻辑。
我曾经踩过一个坑:在某个流动性很差的品种上挂了一个限价单,结果等了半小时都没成交。后来改成市价单,瞬间成交了,但成交价滑了三个档位。嗯,这就是流动性不足带来的代价。
三、集合竞价:开盘与收盘的"集中对决"
集合竞价跟连续竞价完全不同。它不是来一笔撮合一笔,而是先收集订单,再统一撮合。你想想看,这就像拍卖会——大家先出价,然后拍卖师找一个能让最多人成交的价格。
集合竞价的核心步骤:
- 收集阶段:系统接收订单,但不撮合,只记录
- 计算阶段:找出一个"平衡价格",使得成交量最大
- 统一成交:所有符合条件的订单按这个价格成交
这个"平衡价格"怎么找?我画了一张图来说明:
从图上可以看到,在10.00元这个价位上,买单有300股,卖单有250股,成交量是250股。其他价位成交量都更小。所以集合竞价就选10.00元作为开盘价。
注意:集合竞价期间,所有订单都是"暗牌"——你看不到别人的报价。只有到统一成交那一刻,所有信息才会公开。这也是为什么有些策略会在集合竞价阶段"试单"。
四、两种机制的对比
| 特性 | 连续竞价 | 集合竞价 |
|---|---|---|
| 撮合时机 | 订单到达即撮合 | 固定时间点统一撮合 |
| 价格确定 | 买卖双方报价匹配 | 最大成交量原则 |
| 信息透明度 | 实时可见订单簿 | 撮合前不可见 |
| 适用场景 | 日常交易时段 | 开盘、收盘、临时停牌 |
| 流动性 | 高(持续交易) | 低(集中爆发) |
我个人觉得,理解这两种机制的关键在于:连续竞价是"即时满足",集合竞价是"集中博弈"。做高频交易的人更喜欢连续竞价,因为可以快速进出;而做事件驱动策略的人,往往会在集合竞价阶段布局。
五、实战中的避坑指南
最后分享几个我踩过的坑:
- 不要忽视集合竞价的价格发现功能:我曾经以为集合竞价只是走个形式,结果有一次开盘价直接比前收盘低了3%,我的止损单全部被触发。后来我才明白,集合竞价的价格往往包含了隔夜信息。
- 注意订单簿的"厚度":在连续竞价中,如果你的订单量很大,一定要考虑市场冲击。我见过有人挂了一笔大单,结果把价格推高了两个档位,自己反而买贵了。
- 时间优先的陷阱:在流动性好的品种上,同价位的订单可能排了几百笔。你的订单如果排在后面,可能等很久都成交不了。这时候可以考虑稍微提高一点价格,或者用市价单。
小技巧:如果你在做回测,一定要模拟真实的撮合逻辑。很多回测框架只做"价格优先",忽略了"时间优先",这会导致回测结果过于乐观。我建议用事件驱动的回测引擎,逐笔模拟撮合过程。
好了,关于撮合引擎的原理就聊到这里。记住这两条铁律和两种机制,你就能看懂订单簿里发生的每一笔交易了。