4. 队列位置的定义
在撮合系统的建模中,队列位置是连接“订单微观状态”与“成交概率”的关键变量。它描述的不是价格,而是同一价格档位内,一笔订单相对于其他订单的先后关系。理解队列位置,等于掌握了限价单在等待成交过程中的“排队号码牌”。本节将围绕排序、队列长度、前方订单量、后方订单量四个核心指标,建立可量化、可复用的定义体系。
一、核心原理:为什么队列位置决定成交概率
撮合引擎遵循价格优先、时间优先原则。在同一价格上,先进入订单簿的订单拥有更高的成交优先级。因此,一笔订单的成交概率并不只取决于它距离对手价有多近,还取决于它前面还有多少可成交的委托量。队列位置越靠前,被主动成交单“吃掉”的概率越高;队列位置越靠后,等待时间越长,撤单或价格反转的风险越大。
从建模角度看,队列位置可以拆解为四个可观测指标:
- 排序(Rank):订单在该价格档位队列中的序号,通常从 1 开始,1 表示队首。
- 队列长度(Queue Length):该价格档位当前挂单的总笔数或总数量。
- 前方订单量(Ahead Volume):排在该订单之前的所有订单数量之和,是决定等待时间的核心量。
- 后方订单量(Behind Volume):排在该订单之后的所有订单数量之和,反映队列的“厚度”和后续支撑。
关键公式:前方订单量 = 队列中排在该订单之前的所有订单数量之和。若订单位于队首,则前方订单量为 0,此时它是最有可能被下一笔主动单成交的订单。
这四个指标共同构成队列位置的完整画像。仅看排序不够,因为一笔大单可能排在前面但数量巨大;仅看前方订单量也不够,因为后方订单量会影响队列被消耗后的补充速度。只有将排序、长度、前方量、后方量结合,才能更准确地估计成交概率。
二、方法流程:如何计算与维护队列位置指标
在工程实现中,队列位置指标通常由订单簿维护模块实时计算。以下是一个简化的计算流程:
- 定位价格档位:根据订单价格找到对应的买卖档位。
- 确定排序:按时间优先级遍历该档位订单链表,得到当前订单的序号。
- 累计前方量:从队首遍历到当前订单之前,累加数量。
- 累计后方量:从当前订单之后遍历到队尾,累加数量。
- 计算队列长度:统计该档位总笔数或总数量。
- 输出快照:将四个指标写入订单状态或特征表,供成交概率模型使用。
下面是一段伪代码,展示如何从订单簿快照中提取某笔订单的队列位置:
def get_queue_position(order_book, order_id):
side = order_book.get_side(order_id) # 'bid' 或 'ask'
price = order_book.get_price(order_id)
queue = order_book.get_queue(side, price) # 按时间排序的订单列表
rank = 0
ahead_volume = 0.0
behind_volume = 0.0
found = False
for idx, o in enumerate(queue):
if o.id == order_id:
rank = idx + 1
found = True
continue
if not found:
ahead_volume += o.remaining_qty
else:
behind_volume += o.remaining_qty
queue_length = len(queue)
return {
"rank": rank,
"queue_length": queue_length,
"ahead_volume": ahead_volume,
"behind_volume": behind_volume
}
在高频场景中,不建议每次全量遍历。更高效的做法是使用双向链表加节点指针,在订单插入、成交、撤单时增量更新前方量和后方量,将复杂度从 O(n) 降到 O(1)。
三、案例/场景:队列位置如何影响成交概率
假设某股票买一价为 10.00 元,当前买方队列如下:
| 排序 | 订单 | 剩余数量 | 前方订单量 | 后方订单量 |
|---|---|---|---|---|
| 1 | A | 50 | 0 | 230 |
| 2 | B | 80 | 50 | 150 |
| 3 | C | 100 | 130 | 50 |
| 4 | D | 50 | 230 | 0 |
若此时来了一笔 120 手的主动卖单,它会依次吃掉 A 的 50 手和 B 的 70 手。结果:A 完全成交,B 部分成交,C 和 D 未成交。可以看到,前方订单量越小,被成交的概率越高。订单 A 前方量为 0,几乎必然被优先成交;订单 D 前方量为 230,需要等待前面全部消耗后才有可能成交。
进一步,如果队列长度很长但前方订单量很小,说明前方订单虽然笔数多但每笔数量小,消耗速度快;反之,如果前方订单量很大但笔数少,说明存在大单压阵,等待时间可能更长。因此,排序、长度、前方量、后方量需要联合解读,不能孤立使用。
四、误区/复盘:常见理解偏差与修正
误区一:只看排序,忽略数量。排第 2 位不一定比排第 3 位更快成交,如果第 1 位是一笔巨量订单,第 2 位可能长期无法成交。
误区二:把队列长度等同于前方订单量。队列长度是笔数,前方订单量是数量。两者维度不同,对成交概率的影响也不同。
误区三:忽略后方订单量的作用。后方订单量虽然不直接决定当前订单的优先级,但它影响队列的稳定性和后续补充速度。后方量越大,队列被消耗后越容易维持,价格支撑越强。
误区四:静态看待队列位置。队列位置是动态变化的,成交、撤单、新单插入都会改变前方量和后方量。建模时必须使用实时或准实时快照。
复盘时,建议将队列位置指标与成交结果做相关性分析。例如,统计不同前方订单量区间内的成交率、平均等待时间、部分成交比例等。通过数据验证,可以校准成交概率模型中的队列位置权重,避免主观假设带来的偏差。
总结来说,队列位置的定义不是单一数字,而是一组结构化指标:排序回答“排第几”,队列长度回答“有多少”,前方订单量回答“还要等多少”,后方订单量回答“后面还有多少”。只有把这四个指标放在同一框架下理解,才能为后续的成交概率建模打下坚实基础。