3. 限价订单簿结构

要估算不同盘口深度下的可成交量,第一步不是写公式,而是把限价订单簿(Limit Order Book,LOB)看清楚。可成交量本质上是对订单簿某一侧若干价格档位数量的累加,如果对订单簿的组成、档位划分和聚合规则理解有偏差,后面所有估算都会系统性偏移。本节围绕三个问题展开:订单簿由什么构成、价格档位与数量如何聚合、快照数据是怎样从逐笔事件生成的。

一、订单簿的组成:两个方向、两类订单、一个价格优先队列

限价订单簿是交易所为每只标的维护的“待成交委托集合”,按买卖方向分为两侧:买方(Bid)与卖方(Ask)。每一侧内部按价格排序,同一价格上再按到达时间排序,形成“价格优先、时间优先”的队列结构。订单簿中真正被记录的是限价订单:它带有明确的价格和数量,未立即成交的部分留在簿中等待。与之相对的是市价订单,它不进入订单簿,而是直接与对手方最优档位撮合,消耗簿中流动性。

因此,订单簿的组成可以概括为:买侧价格档位集合、卖侧价格档位集合,以及每个档位上的委托队列。最优买价(Best Bid)与最优卖价(Best Ask)之间的差额就是买卖价差(Spread),两者构成最优一档(Level-1)盘口。价差之外,档位越往外,价格越差、数量分布通常越稀疏,这正是“盘口深度”概念的来源。

需要特别区分两类事件对订单簿的影响:新增委托在对应价格档位增加数量;撤单减少数量;成交则同时减少被动方档位数量,并可能产生新的最优价。订单簿不是静态表格,而是一个被逐笔事件持续修改的状态机,快照只是它在某一时刻的切片。

二、价格档位与数量聚合方式

真实订单簿中,同一价格上往往挂着成百上千笔委托。如果逐笔展示,数据量巨大且不利于估算,因此交易所和行情商普遍采用价格档位聚合:把价格落在同一“档位”的所有委托数量加总,形成一个(价格,总量)二元组。聚合的关键参数是最小价格变动单位(tick size)与聚合粒度。

以某标的 tick size 为 0.01 元为例,若聚合粒度为 1 个 tick,则每个价位单独成档;若聚合粒度为 5 个 tick(0.05 元),则价格 10.00、10.01、10.02、10.03、10.04 上的委托会被合并到同一档,档位价格通常取该区间内对买方最优(最高)或对卖方最优(最低)的价格作为代表价。不同交易所、不同行情的聚合规则并不一致,做估算前必须确认口径,否则“第 N 档”的含义会完全不同。

聚合还会带来一个容易被忽略的问题:档位数量不等于可成交量。某一档显示 500 手,并不意味着你能以该档价格成交 500 手,因为其中可能包含冰山订单的隐藏部分、可能在你下单瞬间被撤走,也可能因为你的订单本身改变了撮合顺序。估算时应把“显示数量”视为上限参考,而非承诺量。

实操建议:在建立估算模型前,先记录三个口径参数——tick size、聚合粒度(几个 tick 一档)、快照档位数(如 Level-10 或 Level-20)。这三个参数决定了后续所有累加计算的基准,务必与数据源文档核对一致。

三、快照数据的生成逻辑

快照(Snapshot)是订单簿在某一时刻的完整或部分状态记录,通常包含时间戳、买侧若干档、卖侧若干档,每档给出价格与聚合数量。它的生成逻辑有两种典型路径:

路径一:交易所直接发布。交易所在撮合引擎内部维护订单簿,按固定频率(如每 100 毫秒或每 500 毫秒)或按事件触发,将当前最优 N 档打包成快照推送。这种方式口径统一、延迟可控,但档位深度有限,且频率固定,可能错过两次快照之间的剧烈变化。

路径二:由逐笔委托与成交重建。行情商接收逐笔新增、撤单、成交事件,在本地按相同规则维护订单簿,再按需生成快照。这种方式灵活、可自定义深度与频率,但对事件完整性要求极高:一旦丢包或乱序,重建的订单簿就会与真实状态偏离,且偏差会累积。

无论哪种路径,快照都遵循“先应用事件、后取切片”的顺序。以重建为例,一个简化的处理流程是:收到新增委托事件,定位其价格所在档位,将该档数量加上委托量;收到撤单事件,减去对应量,若档位数量归零则移除该档;收到成交事件,减少被动方档位数量。处理完一批事件后,按价格排序取前 N 档,即得到一张快照。

限价订单簿结构与快照切片示意 卖侧 Ask(价格由低到高) Ask 5 10.05 数量 320 Ask 4 10.04 数量 180 Ask 3 10.03 数量 460 Ask 1 10.01 数量 250(最优卖价) Ask 2 10.02 数量 90 价差 0.01 买侧 Bid(价格由高到低) Bid 1 10.00 数量 400(最优买价) Bid 2 9.99 数量 220 Bid 3 9.98 数量 610 Bid 4 9.97 数量 150 Bid 5 9.96 数量 280 逐笔事件流(快照的输入) 新增委托 +200 撤单 −80 成交 −120 按档位聚合 → 排序取前 N 档 快照:时间戳 + 买 N 档 + 卖 N 档

上图给出一个教学示例(数值为合理假设,非实测):卖侧最优价为 10.01、数量 250,买侧最优价为 10.00、数量 400,价差 0.01。若我们要估算“以不超过 10.03 的价格买入”的可成交量,就把卖侧从最优档开始累加:250 + 90 + 460 = 800。这个 800 就是该价格约束下的显示可成交量上限。可以看到,估算过程完全依赖档位划分与聚合口径——如果聚合粒度变成 5 个 tick,10.01 到 10.04 会被合并成一档,累加结果和档位含义都会改变。

四、从结构到估算:三个必须核对的口径

把订单簿结构用于可成交量估算时,建议在数据接入阶段就固定三件事。第一,方向约定:买侧价格从高到低、卖侧从低到高,累加时始终从最优档向外推进,避免方向混淆导致取错档位。第二,聚合口径:明确 tick size 与每档包含的 tick 数,并在整个估算链路中保持一致,不要混用不同粒度的快照。第三,快照时点:记录快照时间戳与事件处理进度,明确该快照是“事件全部应用后”的状态,避免把中间态当作最终态。

此外,快照的档位深度直接限制了估算范围。若快照只有 10 档,那么超过第 10 档的成交量无法从快照中直接得到,只能借助历史分布或更深的逐笔数据外推。这一点在后续讨论“深度不足时的估算修正”时会反复用到,本节先建立结构认知:订单簿是价格优先、时间优先的队列集合,快照是它在聚合口径下的定时切片,可成交量则是对切片中若干档位数量的有序累加。