4. 累计可成交量的计算

盘口深度曲线之所以能反映“价格移动多少、需要吃掉多少量”,核心就在于累计可成交量这一层计算。单档盘口只告诉我们某一价位挂了多少手,而累计可成交量回答的是另一个问题:如果价格从当前最优价一路推进到某个指定价位,沿途一共要成交多少数量。这个量是深度曲线的纵轴来源,也是滑点估算、冲击成本测算和大单拆分的基础输入。

本节把计算拆成三件事:累计的路径与边界怎么定、买卖两个方向为什么不能套用同一个公式、以及单位与精度在工程实现中如何处理。三者缺一,曲线就会失真。

一、累计的起点、方向与边界

先明确参照约定,全文保持一致:以“价格从当前最优价向不利方向推进”为累计方向。对买方主动成交(吃卖盘)而言,不利方向是价格上行,累计从卖一(ask1)开始,逐档向卖二、卖三累加;对卖方主动成交(吃买盘)而言,不利方向是价格下行,累计从买一(bid1)开始,逐档向买二、买三累加。也就是说,累计的起点永远是“对手方最优价”,而不是本方最优价。

设卖盘档位价格为 a₁ < a₂ < … < aₙ,对应挂单量为 qᵃ₁, qᵃ₂, …, qᵃₙ。当指定价位 P 落在卖盘一侧时,累计可成交量定义为所有价格不高于 P 的卖档挂单量之和:

V_ask(P) = Σ qᵃᵢ ,对所有满足 aᵢ ≤ P 的档位 i
V_bid(P) = Σ qᵇⱼ ,对所有满足 bⱼ ≥ P 的买档 j

注意两个不等号方向相反:卖盘用“≤ P”,买盘用“≥ P”。这正是买卖方向差异在公式层面的直接体现。若指定价位恰好等于某一档价格,该档应被计入(闭区间),因为价格推进到该档时这一档的量必然被吃掉。若指定价位落在两档之间,则只累计到不越过它的那一侧,不引入插值——盘口挂单是离散的,插值会凭空造出不存在的流动性。

二、买卖方向差异:不只是符号相反

很多实现出错,是因为把买盘累计简单写成“卖盘公式取负”。实际上两者的差异体现在三个层面。第一是遍历顺序:卖盘按价格升序累加,买盘按价格降序累加,若数据以数组存储,买盘往往需要反向遍历或先做一次排序。第二是边界判定:卖盘用价格上界,买盘用价格下界,比较符方向必须随方向翻转。第三是“最优价”的含义:买盘的最优价是买一(最高买价),它天然高于买二,因此买盘的累计是“价格越低、累计越大”,曲线在价格轴上向左延伸时纵轴上升。

把两个方向画在同一张深度图上时,通常以价格为横轴、累计量为纵轴,卖盘曲线位于当前中间价右侧并向右上倾斜,买盘曲线位于左侧并向左上倾斜,两条曲线在中间价附近形成“V”形或“倒V”形的深度轮廓。理解这一点,就能明白为什么累计量曲线在最优价处起点为单档量而非零——起点档本身也要计入。

累计可成交量:买盘向下累计、卖盘向上累计 价格 → 累计量 ↑ 中间价 卖1 卖2 卖3 卖4 卖5 卖盘累计 V_ask(P) 买1 买2 买3 买4 买5 买盘累计 V_bid(P) 指定价 P 累计到卖3 卖盘:aᵢ ≤ P 的档位求和;买盘:bⱼ ≥ P 的档位求和;起点为对手方最优价

三、单位与精度:最容易埋雷的地方

累计量在工程实现中至少涉及三层单位:交易所原始字段、内部存储单位、展示单位。以常见A股盘口为例,交易所推送的挂单量常以“股”为单位,而界面习惯显示“手”(1手=100股)。若累计时混用两种单位,曲线纵轴会整体放大或缩小100倍,滑点估算随之完全失真。稳妥做法是在数据接入层统一转换为一个内部基准单位(例如“股”),累计计算全程使用基准单位,仅在最终展示时按需换算。

精度问题同样不可忽视。挂单量是整数,累计求和本身不产生小数,但一旦引入“按金额折算”“按比例拆分”等中间步骤,就可能出现浮点误差。建议累计量使用整数类型(如 int64)存储,避免用浮点数累加;若必须处理小数(如按成交金额占比折算的等效量),应明确保留位数并统一舍入规则,且舍入只发生在输出环节,不在累计过程中间进行,否则误差会随档位增加而累积。

另一个易错点是价格精度。不同标的的最小价格变动单位(tick size)不同,有的为0.01元,有的为0.001元甚至更细。指定价位 P 与档位价格的比较必须基于同一精度,否则“aᵢ ≤ P”可能因浮点表示误差把本应计入的档位排除在外。实践中可将价格统一转换为“最小变动单位的整数倍”再比较,从根本上规避浮点比较问题。

四、一个可复算的示例

假设某标的卖盘五档为:卖一 10.00 元 / 300 股,卖二 10.01 元 / 500 股,卖三 10.02 元 / 800 股,卖四 10.03 元 / 1200 股,卖五 10.05 元 / 2000 股。若指定价位 P = 10.02 元,则累计可成交量为 300 + 500 + 800 = 1600 股;若 P = 10.04 元,由于 10.04 落在卖四与卖五之间,只累计到卖四,结果仍为 300 + 500 + 800 + 1200 = 2800 股,卖五不计入。若 P = 10.05 元,则五档全部计入,累计 4800 股。这个例子说明:指定价位落在档位之间时,累计结果与取较低一档相同,不会因“更接近”而多算。

实现时建议把累计函数写成“方向 + 指定价 + 档位数组”的纯函数,方向用枚举区分买卖,内部统一单位与整数价格,输出前再做展示换算。这样同一份逻辑既能画深度曲线,也能复用于滑点估算,避免两处实现产生不一致。
常见错误:把买盘累计写成“从买一开始向上累加价格更高的档位”。买盘的价格是递减的,正确做法是从买一向下(价格更低方向)累计,比较符用“≥ P”。方向写反会导致买盘曲线形状完全错误,且不易被肉眼发现。

把以上三点落实后,累计可成交量就成为一个可复现、可校验的中间量:给定盘口快照和指定价位,任何人都能算出同一个结果。它既是深度曲线的数据基础,也是后续滑点与冲击成本分析的起点。