2. 盘口数据基础与跨时段特性
构建跨时段盘口异常基线,第一步不是写检测规则,而是把“数据长什么样、每个字段在什么时刻有意义”搞清楚。盘口数据本质上是交易所行情网关按时间顺序推送的增量消息流,Level-1 与 Level-2 的差别不只是档位数量,更在于信息粒度与可还原的市场微观结构。若字段语义理解错位,后续任何基线都会把正常行为误判为异常。
Level-1 与 Level-2 的数据结构差异
Level-1 通常只提供最优一档买卖价与量、最新成交价、累计成交量与成交额、以及有限的统计字段。它适合刻画“价格中枢与即时流动性”,但无法还原挂单在档位间的迁移。Level-2 则提供十档甚至更多档位的买卖盘、逐笔委托与逐笔成交,能够重建订单簿的演化过程。工程上常见的快照结构可抽象为:
{
"symbol": "600XXX",
"timestamp": "2024-06-03 09:25:00.300",
"last_price": 10.52,
"volume": 128400, // 累计成交量(股)
"amount": 1351968.0, // 累计成交额(元)
"bids": [[10.51, 3200], [10.50, 8700], ...], // 价, 量
"asks": [[10.52, 2100], [10.53, 6400], ...]
}
逐笔委托字段一般包含委托序号、通道号、委托时间、价格、数量、买卖方向与委托类型;逐笔成交则包含成交序号、成交时间、成交价、成交量与买卖委托序号。这里有两个容易踩坑的细节:其一,累计成交量是单调递增的,跨时段计算增量时必须做差分,且要处理集合竞价一次性撮合造成的“跳变”;其二,逐笔委托的“撤单”往往以独立消息或数量为负的形式出现,若不单独识别,会把撤单误算成新增挂单,直接污染盘口深度基线。
四个时段的盘口行为差异
同一天内,盘口在不同交易时段呈现完全不同的统计特性,这正是“跨时段基线”必须分时段建模的根本原因。
- 集合竞价(09:15–09:25):只接受委托、不连续撮合,盘口会显示虚拟开盘参考价。09:20 前允许撤单,之后撤单受限,因此 09:20 前后挂单量常出现明显“抽单”或“堆单”,深度序列波动剧烈但并非异常。
- 连续竞价(09:30–11:30、13:00–14:57):逐笔撮合,订单簿持续演化,价差、深度、委托到达率相对平稳,是基线建模的主要样本区间。
- 午休前后(11:30 与 13:00):11:30 后停止撮合但委托可继续申报(视交易所规则),13:00 开盘瞬间常出现积压委托集中释放,形成短时成交与深度突变。
- 收盘集合竞价(14:57–15:00):与开盘竞价类似但方向相反,尾盘挂单集中,收盘价由一次性撮合产生,最后一笔成交量往往显著放大。
从字段到可用的基线输入
理解结构之后,需要把原始消息整理成可计算的时序特征。以十档盘口为例,常用特征包括:买一卖一价差、买卖一档量比、前五档累计深度、订单簿不平衡度(买量减卖量除以总量)。计算时统一以“快照时间戳”为对齐基准,同一秒内多条消息按序号排序,避免乱序导致深度回退。对于累计成交量,采用 delta_vol = vol_t - vol_{t-1},并在集合竞价结束、午休结束两个边界处单独标记,不参与连续段的平滑统计。
一个可操作的示例:假设某股票在 10:00–10:05 的买一量序列为 3200、3500、3100、2800、3000 手,卖一量序列为 2100、1900、2400、2600、2300 手,则不平衡度依次约为 0.21、0.30、0.13、0.04、0.13。若把这段数据与 09:20 前后的竞价数据混在一起求均值,得到的“正常区间”会被竞价阶段的极端值拉宽,导致连续竞价中的真实异常被掩盖。因此分时段、分特征建立基线,是后续异常检测能否有效的前提。
最后要强调的是数据质量校验:检查时间戳是否单调、档位价格是否严格有序、买卖价是否存在交叉、累计量是否出现负增量。这些校验应在进入基线计算前完成,任何一项失败都应打上质量标记而非直接丢弃,以便在异常复盘时区分“市场异常”与“数据异常”。只有把字段语义、时段边界与质量校验三者对齐,跨时段盘口异常基线才具备可解释性和可复现性。