第四章:撮合引擎原理——订单簿的心脏
做量化交易,绕不开一个核心问题:订单到底是怎么成交的?
很多人以为,我下了一个买单,价格到了就自动成交。其实背后的逻辑比这复杂得多。今天我就带你拆解撮合引擎的工作原理,这是订单簿仿真模拟的基础,也是策略验证的起点。
4.1 价格优先、时间优先——两条铁律
撮合引擎的核心原则,说白了就八个字:价格优先,时间优先。
什么意思?我举个例子你就明白了。
假设现在订单簿上有两个卖单:
- 卖家A:挂100元,10股,上午9:00挂单
- 卖家B:挂101元,10股,上午9:01挂单
这时候你下了一个市价买单,要买10股。引擎会先扫到谁?价格低的优先——所以先成交卖家A的100元单子。
那如果两个卖家都挂100元呢?这时候看时间——先挂的先成交。卖家A先挂,所以还是他先成交。
嗯,这里要注意:价格优先的优先级高于时间优先。价格不同时,根本不看时间。只有价格相同时,才比较时间先后。
核心原则总结:
- 价格优先:买单看谁出价高,卖单看谁要价低
- 时间优先:同价格下,先到先得
我在项目中遇到过一个问题:有人把时间优先理解成「先下单的先成交」,忽略了价格因素。结果回测时发现策略表现异常,查了半天才发现是撮合逻辑写错了。你想想看,如果价格优先被忽略,那市场就乱套了——谁都可以用低价抢到成交。
4.2 限价单与市价单——两种订单的撮合逻辑
订单类型不同,撮合方式也不同。我习惯把这两种订单比作「钓鱼」和「抢购」。
4.2.1 限价单:钓鱼式成交
限价单就是你设定一个价格,只有市场达到这个价格时才成交。说白了,你在等鱼上钩。
比如你挂了一个限价买单:买100元,10股。那么:
- 只有当卖单价格 ≤ 100元时,才会成交
- 如果市场最低卖价是101元,你的单子就挂在订单簿上,等着
限价单的撮合逻辑:
- 检查订单簿上是否有对手方订单
- 如果有,按价格优先、时间优先原则匹配
- 如果对手方订单数量不足,部分成交,剩余部分继续挂单
- 如果没有对手方订单,直接挂单等待
个人经验:限价单在回测中容易被忽略的一个细节是「滑点」。我曾经写过一个策略,回测时假设限价单总能按指定价格成交,结果实盘时发现成交价总是偏离。后来才意识到:限价单的成交价取决于对手方订单的价格,不一定是你挂的价格。
4.2.2 市价单:抢购式成交
市价单就简单了——不管价格,立即成交。你只说要买多少,不关心价格。
比如你下了一个市价买单:买10股。引擎会:
- 从订单簿上找到最低的卖单(价格优先)
- 如果这个卖单数量足够,直接成交
- 如果不够,继续扫下一个卖单,直到买够10股
市价单的成交价是「扫单」的结果。如果市场流动性差,你可能要扫好几个价位,成交均价会比你预期的差很多。
避坑指南:我曾经在回测中直接用「当前最优价」作为市价单的成交价,结果回测收益漂亮得不行。实盘一跑,亏得亲妈都不认识。为什么?因为回测时忽略了「滑点」和「流动性不足」的问题。市价单的真实成交价,往往比最优价差几个tick。
4.3 部分成交与完全成交——订单的生命周期
一个订单进来,可能一次性全部成交,也可能只成交一部分。这取决于对手方订单的数量。
4.3.1 完全成交
你挂了一个买单:买100元,10股。订单簿上正好有一个卖单:卖100元,10股。两者一匹配,你的10股全部成交。这就是完全成交。
完全成交后,你的订单从订单簿上消失,对手方的订单也消失。
4.3.2 部分成交
还是你挂了一个买单:买100元,10股。但订单簿上只有一个卖单:卖100元,5股。
这时候怎么办?引擎会先成交5股,你的订单还剩5股没成交。这5股继续挂在订单簿上,等待下一个对手方。
这就是部分成交。你的订单状态会变成「部分成交,剩余5股挂单」。
关键点:部分成交后,订单的时间优先级不变。也就是说,你剩下的5股仍然保留原来的挂单时间,不会因为部分成交而重新排队。
为什么会这样?你想想看,如果部分成交后重新排队,那大额订单就太吃亏了——每次成交一部分,时间优先级就重置,永远排不到前面。所以交易所的设计是:部分成交不影响时间优先级。
4.4 撮合引擎的核心流程——一张图看懂
说了这么多,我画了一张流程图,把整个撮合逻辑串起来。你看完应该就全明白了。
4.5 实战中的注意事项
讲完了原理,我再说几个实战中容易踩的坑。
| 场景 | 常见错误 | 正确做法 |
|---|---|---|
| 限价单回测 | 假设限价单总能按挂单价成交 | 考虑对手方订单簿深度,模拟真实撮合 |
| 市价单回测 | 用最优价代替成交价 | 模拟扫单过程,计算加权平均成交价 |
| 部分成交 | 忽略剩余订单的时间优先级 | 保留原挂单时间,不重置优先级 |
| 大额订单 | 认为可以一次性成交 | 拆分成小单,模拟逐笔成交 |
我的建议:如果你在写回测引擎,一定要把撮合逻辑单独封装成一个模块。这样方便调试,也方便替换不同的撮合策略。我自己的回测框架里,撮合引擎是独立的一个类,支持限价单、市价单、冰山订单等多种类型。
好了,这一章的内容就到这里。撮合引擎是订单簿仿真的核心,理解了它,你才能写出靠谱的回测系统。下一章我们会深入订单簿的数据结构,看看如何高效地存储和查询订单。
公众号:蓝海资料掘金营,微信deep3321