2. 盘口数据基础与误报诱因
盘口异常检测的第一道门槛不是算法,而是对行情数据本身的理解。很多被标记为“异常”的现象,追根溯源并不是市场真的出现了异动,而是数据在采集、传输、撮合回放或解析环节发生了变形。要把误报率压下来,必须先弄清楚我们手里的数据长什么样、以什么频率到达、时间戳代表什么含义,以及哪些数据质量问题会伪装成盘口异常。
Level-1 与 Level-2 的结构差异
Level-1 行情通常只提供最优一档买价、卖价及其对应数量,外加最新成交价、成交量、成交额、开盘价、最高价、最低价等统计字段。它的更新频率较低,常见为 3 秒一笔快照,部分市场为逐秒推送。Level-1 的信息量有限,用它做盘口异常检测时,只能观察到“最优价量”这一层,无法看到挂单在档位之间的迁移过程,因此对撤单、挂单堆积、虚假挂单等行为的识别能力天然不足。
Level-2 行情在最优档之外,提供多档买卖盘(常见为十档,部分市场为五档或更多),并附带逐笔委托与逐笔成交明细。十档盘口让我们能看到深度结构,逐笔数据则让我们能还原每一笔挂单、撤单和成交的先后顺序。Level-2 的字段通常包括:买卖各档价格与数量、委托序号、委托类型(限价/市价)、买卖方向、委托数量、成交价格、成交数量、成交方向等。做异常检测时,Level-2 的逐笔委托是判断“挂单是否真实”的关键依据,而十档快照则是判断“盘口形态是否异常”的主要输入。
逐笔委托与逐笔成交的时序关系
逐笔委托记录的是“谁在什么时间、以什么价格、挂了多少量、是买还是卖”,逐笔成交记录的是“哪两笔委托在什么时间、以什么价格、成交了多少”。两者通过委托序号或成交序号关联。理解这一点对排障非常重要:当盘口出现“某档位数量突然消失”时,可能是撤单,也可能是成交,还可能是快照采样恰好跳过了中间状态。只有把逐笔委托和逐笔成交按时间顺序对齐,才能判断数量消失的真实原因。
实际处理中,逐笔数据的时间戳精度通常为毫秒甚至微秒,而快照的时间戳精度可能只有秒级。这意味着快照是“某一时刻的截面”,逐笔是“连续的事件流”。异常检测如果只基于快照,容易把两次快照之间的正常撤单和成交误判为盘口突变;如果只基于逐笔,又容易忽略快照本身的采样偏差。合理的做法是以逐笔事件流为主干,用快照做交叉校验。
快照频率与时间戳的陷阱
快照频率决定了我们观察盘口的“采样率”。以 3 秒快照为例,如果某只股票在两次快照之间先挂出大额买单、随后迅速撤掉,快照上根本看不到这笔挂单,异常检测自然也不会触发;反过来,如果两次快照之间发生了多笔成交,快照上表现为“某一档数量大幅减少”,检测规则若简单按“数量骤降”报警,就会把正常成交误判为撤单异常。这就是典型的采样偏差型误报。
时间戳方面,需要区分三类时间:交易所撮合时间、行情推送时间、本地接收时间。交易所撮合时间最接近事件真实发生时刻,但精度和可得性因市场而异;行情推送时间受网络传输影响,可能滞后几十毫秒到数秒;本地接收时间还叠加了本机处理延迟。排障时如果发现“同一笔成交在逐笔和快照中的时间对不上”,首先要确认两边用的是哪一类时间戳,而不是急于怀疑数据错误。实践中建议统一以交易所时间为基准做对齐,本地接收时间只用于监控链路延迟。
常见数据质量问题与误报的对应关系
把误报按诱因归类,能显著加快排障速度。以下是一份可直接对照使用的检查表,字段和判断依据均围绕盘口数据本身设计:
| 数据质量问题 | 典型表现 | 易触发的误报类型 | 排查切入点 |
|---|---|---|---|
| 快照采样跳变 | 相邻快照某档数量骤降或骤增,逐笔中无对应事件 | 撤单异常、挂单堆积 | 用逐笔事件流回放两次快照之间的区间 |
| 时间戳乱序 | 逐笔成交时间早于对应委托时间 | 成交方向背离、价量关系异常 | 检查时间戳来源与排序键,确认是否混用推送时间 |
| 档位缺失 | 十档中部分档位数量为 0 或字段为空 | 盘口深度突变、档位消失 | 核对原始报文,区分“真空档”与“未推送” |
| 委托序号断档 | 委托与成交无法一一配对,序号不连续 | 虚假挂单、成交无法归因 | 检查丢包率与补推机制是否生效 |
| 单位与精度不一致 | 数量以手和股混用,价格小数位不统一 | 数量阈值类规则大面积误报 | 在入库前统一换算并记录换算规则 |
| 重复推送 | 同一快照或同一逐笔被推送多次 | 成交量虚增、换手异常 | 按唯一序号去重,保留首次到达记录 |
排障时的基本处理顺序
面对一条盘口异常告警,建议先做数据可信度判断,再做业务判断。具体来说:先确认该时间窗口内快照与逐笔是否完整、时间戳是否单调、委托序号是否连续;再用逐笔事件流重建盘口,与快照逐档比对;若两者一致,才进入“市场行为是否真的异常”的分析。这个顺序能把大量由数据质量引起的误报在早期拦截掉。
还需要注意,Level-1 与 Level-2 混用会引入额外的误报。例如用 Level-1 的最优价判断“买一被击穿”,但 Level-2 十档中买二仍有大量挂单,实际盘口并未失控。检测规则必须明确自己依赖的是哪一层数据,并在数据源切换时重新校准阈值。逐笔委托中的市价单、本方最优委托等特殊类型,也应在解析阶段单独标记,避免被当作普通限价单参与价量统计。
把上述数据结构、时序关系和常见质量问题梳理清楚之后,后续的规则设计、阈值设定和误报归因才有可靠的基础。盘口异常检测的准确性,很大程度上取决于我们对数据本身的敬畏程度——先相信数据可能出错,再谈市场是否异常。