在交易系统的实现过程中,撮合模块往往是最早完成的功能之一。
从规则层面看,它并不复杂:价格优先、时间优先,买卖盘匹配即可成交。
但在实际量化研究和系统运行中,很多问题并不是在策略层暴露,而是在撮合层逐渐显现。尤其是在引入 tick 级行情、进行高频回测或多策略并行时,相同策略在不同环境下出现成交差异,往往并非偶然。
从经验来看,问题的根源通常不在策略逻辑,而在撮合算法是否真正符合“滚动撮合”的运行方式。
撮合模块在量化系统中的定位
从系统工程角度看,撮合并不是一个静态计算过程,而是一个持续运行的状态更新模块。其基本流程可以概括为:
行情输入 → 订单簿更新 → 撮合判断 → 成交生成 → 回报输出
在 tick 驱动的环境下,这一流程是随行情不断推进的,而非按固定时间窗口批量处理。
滚动撮合的核心特征在于:
- 每一笔新订单或盘口变化,都会立即触发撮合判断
- 成交过程是连续发生的,而不是集中结算
- 算法需要严格依赖时间顺序推进
因此,撮合实现是否稳定,直接影响回测结果的可重复性和策略评估的可信度。
滚动撮合的实现思路
从实现角度看,滚动撮合可以拆解为一个不断循环的过程:
- 新订单进入系统
- 与当前最优对手盘进行比较
- 满足条件则成交
- 未成交部分继续保留在订单簿中
这里真正决定撮合行为差异的,不是规则本身,而是订单簿的数据结构与更新方式。
常见的实现方式包括:
- 买盘按价格降序排列
- 卖盘按价格升序排列
- 同一价位内按照 FIFO 顺序处理
这实际上是撮合规则在代码层面的直接映射。
一个简化的滚动撮合核心逻辑
from collections import deque
class Order:
def __init__(self, price, volume):
self.price = price
self.volume = volume
def rolling_match(buy_book, sell_book):
trades = []
while buy_book and sell_book:
buy = buy_book[0]
sell = sell_book[0]
if buy.price < sell.price:
break
volume = min(buy.volume, sell.volume)
trades.append((sell.price, volume))
buy.volume -= volume
sell.volume -= volume
if buy.volume == 0:
buy_book.popleft()
if sell.volume == 0:
sell_book.popleft()
return trades
这段逻辑已经体现了滚动撮合的基本特征:
- 撮合按时间顺序逐笔推进
- 支持部分成交
- 成交价格来源于对手盘
- 未完成订单自动进入下一轮撮合
在真实系统中,复杂度更多来自以下方面:
并发处理、行情时间顺序保证、成交回报与订单状态的一致性维护。
撮合结果的可视化在调试中的价值
在撮合仿真或策略回放阶段,仅依赖日志往往不够直观。
将成交结果进行可视化,有助于快速识别异常行为。
例如,通过观察成交价格随时间的变化,可以判断:
- 成交路径是否存在非预期跳变
- 不同撮合逻辑对价格序列的影响
- 策略滑点是否源于撮合层而非策略信号
import matplotlib.pyplot as plt
prices = [101, 101, 100.5, 100.5, 100]
times = range(len(prices))
plt.plot(times, prices)
plt.xlabel("Match Sequence")
plt.ylabel("Trade Price")
plt.title("Rolling Matching Trade Price")
plt.show()
这种方式在比较不同撮合实现、验证回测一致性时非常有用。
滚动撮合与 tick 行情的关系
在撮合层面,时间顺序往往比价格本身更关键。
如果使用的是聚合行情数据:
- 多笔真实成交被压缩为单条记录
- 撮合触发时点被提前或延后
- 回测结果可能出现不符合实际的优势
因此,在工程实践中,更稳妥的做法是:
- 使用逐笔 tick 行情驱动撮合模块
- 让撮合节奏尽量贴近真实市场
在一些回放和仿真场景中,使用统一结构的多市场 tick 行情流,例如 AllTick API 提供的实时 tick 数据,可以显著降低适配成本,也更有利于还原滚动撮合的实际运行节奏。
撮合模块的长期影响
在系统早期,撮合模块往往“看起来没问题”。
但随着系统复杂度提升,例如:
- 高频回测
- 多策略并行运行
- 多市场扩展
撮合实现上的差异会被逐步放大。
是否正确理解并实现滚动撮合交易,往往决定了:
- 策略结果是否可复现
- 回测结论是否可靠
- 实盘与回测偏差的来源是否可解释
撮合逻辑本身并不复杂,但它是交易系统中最基础、也最难返工的部分。在量化研究和系统设计阶段,值得投入足够精力进行验证和拆解。


