2. 盘口数据基础与队列形成机制
要分析盘口队列拥堵,首先必须把“盘口”从直觉上的买卖挂单列表,还原为一个有严格结构、有生命周期、有位置属性的数据结构——限价订单簿(Limit Order Book,LOB)。本节围绕四个问题展开:订单簿长什么样、一笔订单如何进入和离开、订单在队列中的位置由什么决定、以及行情数据里哪些字段能支撑后续的拥堵分析。
一、限价订单簿的对称结构
限价订单簿按价格分层组织,每一层称为一个“价位”(price level),每个价位上挂着一个订单队列。买侧(bid)按价格从高到低排列,卖侧(ask)按价格从低到高排列,两侧最靠中间的买一价与卖一价之间形成价差(spread)。这种“价格优先、时间优先”的排序规则决定了:任何时刻,最优买价一定在买侧队首,最优卖价一定在卖侧队首。
需要特别强调一个容易混淆的点:队列位置是“价位内”的概念。同一个价位上可能堆积几十甚至上百笔订单,它们价格相同,唯一的排序依据是到达时间。因此“买一队列长度”指的是买一价位上的订单笔数或总数量,而不是买侧所有价位的总和。后续讨论拥堵时,我们关心的正是某个具体价位内部队列的膨胀与消化。
二、订单生命周期与队列的动态性
一笔限价订单从提交到离队,通常经历四个阶段:提交(submit)、挂入某价位队尾、在队列中等待并可能被部分成交或改单、最终全部成交或撤单离队。理解这个生命周期,是理解“队列为什么会拥堵”的前提。
关键在于:队列不是静态的列表,而是持续被消耗和补充的流。消耗来自两类事件——成交(trade)和撤单(cancel);补充来自新订单到达。当某一价位上“新到达 + 改单转入”的速率持续高于“成交 + 撤单”的速率时,该价位队列就会变长,形成拥堵。反过来,若撤单速率突然放大,队列会快速“蒸发”,这往往意味着挂单方在主动撤退,是重要的盘口信号。
还要注意改单(modify)的语义差异。多数撮合规则下,改价等同于撤单后重新下单,会失去原有时间优先级、排到新价位队尾;而仅减少数量(减量)通常保留原队列位置。这一细节直接影响队列位置的判断:看到一笔大单“改价”,不能认为它仍在原位置,而应视为一次撤单加一次新到达。
三、队列位置的决定因素
订单在价位内的位置由三个因素共同决定:到达时间(越早越靠前)、是否发生过改价(改价即重置时间戳)、是否被部分成交(部分成交只消耗数量,不改变剩余部分的位置)。因此,一个常见的误判是:把“挂单量大”等同于“队列靠前”。实际上,一笔很晚到达的大单可能排在队尾,前面挡着大量小单,其实际成交概率远低于表面数量所暗示的水平。
这就引出队列位置分析的核心指标——前方排队量(queue ahead)。对某笔订单而言,前方排队量等于同价位上所有更早到达订单的剩余数量之和。它才是决定“这笔单要等多久才能成交”的真实变量,而不是该价位的总挂单量。后续章节的拥堵度量,本质上都是围绕前方排队量的估计与变化展开的。
四、盘口数据字段解析
实际行情数据通常分为两类:快照(snapshot)与逐笔(tick-by-tick / L2 增量)。快照按固定频率给出各价位聚合后的价格与数量,适合看整体形态;逐笔数据给出每一笔委托的进入、成交、撤单事件,是还原队列位置的必要材料。仅靠快照无法知道价位内部谁先谁后,因此做队列拥堵分析时,逐笔委托与逐笔成交数据是基础。
| 字段 | 含义 | 在队列分析中的作用 |
|---|---|---|
| bid_price / ask_price | 各档买价、卖价 | 确定价位层级与价差 |
| bid_volume / ask_volume | 各档聚合挂单量 | 观察队列总长度变化 |
| order_id | 委托唯一编号 | 追踪单笔订单的进入与离队 |
| order_time | 委托到达时间戳 | 决定价位内时间优先级 |
| side / price / qty | 买卖方向、委托价、委托量 | 定位所属价位与初始排队量 |
| trade_qty / cancel_qty | 成交量、撤单量 | 计算队列消耗速率 |
举个教学示例(以下为合理假设的示例数据,非实测):假设买一价 10.03 上依次到达 O1(500)、O2(800)、O3(1200)、O4(900) 四笔订单,则 O4 的前方排队量为 500+800+1200=2500。若随后 O1 全部成交、O2 撤单 300,则 O4 的前方排队量降为 0+500+1200=1700。可以看到,前方排队量是随事件动态更新的,必须用逐笔数据逐条回放才能准确维护。
小结本节要点:订单簿是价格分层、价位内时间排序的对称结构;订单有明确的进入—等待—离队生命周期;队列位置由到达时间、改价、部分成交共同决定,前方排队量才是关键变量;而逐笔委托与成交字段是还原这一切的数据基础。掌握这些,才能进入下一层的拥堵度量与等待时间估计。