4. 盘口特征计算中的漏报

盘口异常识别模型的第一道关口不是模型本身,而是特征计算。买卖价差、委托量、订单簿斜率这些特征一旦在计算窗口或边界条件上出错,异常信号就会在进入模型之前被"抹平",表现为规则明明配置了、阈值也合理,却始终不触发告警。这类漏报排查起来比模型漏报更隐蔽,因为特征值本身看起来"正常",只是它算的根本不是我们以为的那段盘口。

一、三类特征的计算口径与常见错误点

先明确本节涉及的三类特征及其标准口径,后续所有案例都以此为参照:

  • 买卖价差:通常取 spread = ask1 - bid1,或相对价差 (ask1 - bid1) / mid,其中 mid = (ask1 + bid1) / 2。错误高发点在于:用快照时间戳而非交易所撮合时间对齐、涨跌停或集合竞价阶段 ask1/bid1 缺失时未做空值处理、把"价差突然拉大"的异常样本在去极值环节误删。
  • 委托量:常见口径为买一量、卖一量、前 N 档累计量或买卖量比。错误高发点在于:窗口内多快照聚合时用了"求和"而非"取末值"或"取均值"、撤单未从累计量中扣除、单位(股/手)不统一导致阈值差 100 倍。
  • 订单簿斜率:常用定义是前 N 档价格对累计委托量回归的斜率,或 (P_N - P_1) / (V_N - V_1) 形式的近似。错误高发点在于:档位不足 N 档时仍强行计算、买卖两侧档位数量不一致、价格与量的量纲未归一化导致斜率数值不可比。

二、计算窗口错误:滚动窗口的"左开右闭"陷阱

最典型的一类漏报来自滚动窗口边界。假设我们要计算"过去 3 秒内买一量的均值",用于识别买盘突然撤单。实现时若写成左闭右开区间 [t-3s, t),而快照恰好每 3 秒一条,那么窗口内永远只包含 1 条快照,均值退化为瞬时值,撤单造成的量能骤降被单点噪声掩盖,阈值判断自然不触发。

更隐蔽的是"窗口对齐到快照时间"与"窗口对齐到自然时间"混用。若特征按自然秒切窗(如 10:00:00–10:00:01),而快照时间戳带毫秒偏移(10:00:00.350、10:00:01.350),则每个自然秒窗口内可能落入 0 条或 2 条快照,导致特征序列出现空洞或重复计数。排查时应先打印窗口内实际快照条数分布,若出现大量 0 或 1,基本可判定为窗口对齐错误。

排查动作:对每个滚动特征,统计"窗口内样本数"的直方图。正常应集中在预期条数附近;若大量落在 0/1 或出现双峰,优先检查窗口开闭区间与时间对齐基准。

三、边界条件错误:空档、涨跌停与集合竞价

订单簿斜率在档位不足时最容易出错。若某时刻卖盘只有 3 档有量、买盘有 10 档,而斜率按固定 10 档计算,缺失档位若被填 0,会人为制造出"远端价格趋平"的假斜率;若直接跳过该时刻,则连续缺失会形成特征断点,下游模型把断点当缺失值填充均值,异常被平滑掉。

涨跌停与集合竞价是另一类边界。涨停时 ask1 为空、跌停时 bid1 为空,若价差计算未判空而直接相减,会得到 NaN 或异常大值;若在清洗阶段把 NaN 统一置 0,则"一字板"这种极端盘口反而被记为价差为 0 的平静状态,异常识别彻底失效。正确做法是显式标记 spread = null 并附带状态位(涨停/跌停/集合竞价),由规则层决定是否跳过或单独处理。

盘口特征计算窗口与边界条件错误链路 原始快照流 时间戳带毫秒偏移 含空档/涨跌停 滚动窗口切分 左闭右开 [t-3s, t) 自然秒 vs 快照对齐 ✗ 窗口内仅 1 条样本 特征计算 价差 / 委托量 / 斜率 空档填 0、NaN 置 0 ✗ 极端盘口被平滑 阈值规则 spread > 阈值 量比 < 阈值 ✗ 不触发 漏报:异常未告警 特征值"正常",但算错了盘口 买卖价差 • 快照时间未对齐撮合时间 • 涨跌停 ask1/bid1 为空未判 • 去极值误删价差拉大样本 → 一字板被记为价差 0 委托量 • 多快照聚合用求和而非末值 • 撤单未从累计量扣除 • 股/手单位不统一 → 撤单骤降被噪声掩盖 订单簿斜率 • 档位不足 N 档仍强算 • 买卖两侧档数不一致 • 价格与量未归一化 → 假斜率/特征断点

四、案例复盘:一次典型的"斜率正常但漏报"

某次盘口异动监控中,规则设定"卖盘前 5 档斜率超过阈值即告警",用于捕捉卖压快速堆积。上线后连续多日零告警,但人工复盘发现确有数笔卖压突增的样本。排查过程如下:

  1. 取一段已知异常时段的快照,手工计算前 5 档斜率,结果明显超过阈值,说明数据本身有异常。
  2. 打印线上特征值,发现同一时刻斜率仅为手工值的约 1/5,且数值异常平稳。
  3. 检查实现代码,发现斜率按"固定 10 档"计算,而该标的卖盘常态只有 5–6 档有量,缺失档位被填 0,导致 (P_10 - P_1) 被拉大、(V_10 - V_1) 也被拉大,两者比值被稀释。
  4. 修正为"按实际有效档位计算,且买卖两侧取相同档数 N = min(买档数, 卖档数, 5)",并对 N < 3 的时刻标记为不可计算而非填 0。

修正后同一时段斜率恢复到手工计算量级,规则正常触发。这个案例的关键教训是:边界条件不是"异常情况",而是盘口的常态。A 股大量中小市值标的盘口本就稀疏,把稀疏当异常去填 0,等于系统性地把真实信号压平。

五、可执行的排查清单

针对本节三类特征,建议按以下顺序逐项核对,每项都应有可观察的输出而非"看一眼代码":

检查项观察方法判定标准
窗口内样本数分布统计每个滚动窗口实际快照条数集中在预期值附近;大量 0/1 或双峰即异常
窗口时间对齐基准对比窗口边界与快照时间戳偏移偏移应稳定小于一个快照周期
空档/涨跌停处理统计 ask1/bid1 为空的比例及后续特征值空值应显式标记,不应被置 0 参与计算
聚合方式抽查窗口内多快照的委托量聚合结果与"取末值/均值"手工结果一致
档位一致性统计买卖两侧有效档数差异斜率计算两侧档数应相同且 ≥ 最小档数
量纲与单位核对特征值与阈值的单位股/手、元/分统一,阈值量级匹配
常见误区:把"特征值分布看起来平滑"当作计算正确的证据。窗口过窄、空值填 0、档位补齐都会让特征变得异常平滑,而这恰恰是漏报的前兆。排查时应优先看"窗口内样本数"和"空值比例"这两个元指标,而不是只看特征值本身。

总结本节要点:盘口特征漏报的根因往往不在阈值,而在特征"算的是哪段盘口"。窗口开闭区间、时间对齐基准、空档与涨跌停的显式标记、档位一致性、聚合方式与量纲,这六个边界条件中任何一个出错,都足以让异常信号在进入规则层之前消失。排查时先用元指标(样本数、空值比例、档位差异)定位计算层问题,再回到特征值本身,比直接调阈值有效得多。