3. 深度变化图谱的数据基础

深度变化图谱并不是一张“画出来的图”,而是由四类底层数据逐层加工得到的产物:逐笔交易数据回答“谁在什么价位成交了多少”,价格序列回答“每个时点的参考价是多少”,档位归属回答“每一笔成交落在哪个价格档”,深度指标回答“各档位的挂单量、成交量与撤单量如何随时间变化”。这四层数据任何一层出现偏差,图谱上的迁移轨迹就会失真。本节围绕这四层数据的采集口径、对齐方式与清洗规则展开,重点说明“怎么采、怎么算、怎么判异常”。

一、四层数据的采集口径与依赖关系

采集前必须先固定口径,否则后续清洗无从判断对错。交易数据通常来自逐笔成交(Trade)与逐笔委托(Order)两个流:成交流给出成交价、成交量、成交方向(主动买/主动卖,或由买卖盘口推断),委托流给出委托价、委托量、委托类型与撤单事件。价格序列一般取分钟或秒级中间价 mid = (bid1 + ask1) / 2,也可用成交加权均价 VWAP 作为参考价,但两者不可混用——中间价反映盘口中枢,VWAP 反映实际成交重心,图谱中若用 VWAP 做档位划分基准,就必须全程一致。档位归属是把连续价格离散化的过程,常见做法是以最小变动价位 tick 为步长,或以参考价的百分比带宽(如 ±0.1%、±0.2%)划分档位。深度指标则是在每个档位上聚合挂单量、成交量、撤单量与净流入量。

四层数据的依赖关系是单向的:交易数据与价格序列是原始输入,档位归属是映射规则,深度指标是聚合结果。因此采集顺序应为“先落原始流、再定参考价、后做档位映射、最后算指标”,任何一步都不能用下游结果反推上游。

深度变化图谱的四层数据加工链 逐笔成交流 成交价 / 量 / 方向 时间戳(毫秒) 逐笔委托流 委托价 / 量 / 类型 撤单事件 价格序列 mid = (bid1+ask1)/2 或 VWAP(二选一) 档位归属映射 tick 步长 或 百分比带宽 价格 → 档位编号 深度指标聚合(按档位 × 时间窗) • 挂单量 depth_bid / depth_ask • 成交量 vol_traded • 撤单量 vol_cancel • 净流入 net_flow = 买成交 − 卖成交 • 档位迁移量 migration • 深度变化率 Δdepth / Δt 清洗规则(按层执行,顺序不可颠倒) ① 去重与去噪 • 同一 trade_id 重复推送 • 价格越界(超出涨跌停) • 成交量为 0 或负值 • 时间戳乱序 / 回退 • 非交易时段数据 ② 时间对齐 • 统一到毫秒时间戳 • 成交与委托按时间窗对齐 • 价格序列按固定频率重采样 • 缺失窗口标记而非插值 • 停牌区间单独标注 ③ 档位映射校验 • 边界价格归属规则明确 • 档位编号连续无跳档 • 参考价变更时重映射 • 跨档成交拆分到两档 • 映射前后总量守恒 ④ 指标一致性检查 • 成交量 ≤ 委托量 • 撤单量 ≤ 挂单量 • 净流入与方向一致 • 深度变化率无突变尖峰 • 各档汇总 = 全市场总量

二、交易数据清洗:先保真,再补全

逐笔数据最常见的四类问题是重复推送、时间戳乱序、价格越界和零量成交。处理原则是“先保真、再补全”:重复记录按 trade_id 去重,保留首次到达的记录;时间戳乱序按交易所时间戳重排,而不是按本地接收时间;价格越界(超出当日涨跌停或明显偏离盘口)的记录直接剔除并记入异常日志,不做修正;零量或负量成交视为无效记录丢弃。对于撤单事件,必须与原始委托按 order_id 关联,否则撤单量会被重复计入。

一个容易被忽略的细节是成交方向。若数据源不直接提供主动买卖标识,需要用成交价与当时盘口比较推断:成交价 ≥ ask1 记为主动买,成交价 ≤ bid1 记为主动卖,介于两者之间则按上一笔方向或按 tick 规则处理。推断规则一旦确定,全流程不得更改,否则净流入指标会出现系统性偏差。

三、价格序列与档位归属:映射规则要守恒

价格序列的作用是提供档位划分的基准。若采用百分比带宽,需在每个时间窗内以该窗的参考价为锚点重新计算档位边界,这意味着同一绝对价格在不同时间窗可能属于不同档位,这是正常现象,但必须在元数据中记录锚点,否则跨窗比较会错位。若采用固定 tick 步长,则档位边界稳定,但需处理“价格落在两档边界上”的归属问题——通常约定“左闭右开”,即价格等于边界值时归入较高档位。

档位映射必须满足总量守恒:映射前所有成交的成交量之和,应等于映射后各档成交量之和。若出现跨档成交(一笔大单吃掉多个档位),应按各档实际成交量拆分,而不是整笔归入成交价所在档。校验方法很简单:对每个时间窗,比较 Σ vol_traded(档位) 与原始成交总量,偏差超过 0.1% 即需回查映射逻辑。

四、深度指标计算与异常判读

深度指标在“档位 × 时间窗”的二维网格上聚合。以 1 分钟窗为例,某档位的净流入可写为:

net_flow[d, t] = Σ buy_vol(d, t) − Σ sell_vol(d, t)
depth_change[d, t] = depth_end(d, t) − depth_start(d, t)
migration[d, t] = depth_change[d, t] − net_flow[d, t]

其中 migration 表示该档位深度的变化中,扣除实际成交后的“迁移”部分,主要来自挂单新增与撤单。若 migration 为正且远大于成交量,说明有大量挂单在该档位堆积;若为负且绝对值较大,则可能是撤单潮。判读时需结合 vol_cancel 交叉验证:撤单量突增而成交量平稳,通常意味着流动性撤离而非真实成交驱动。

异常判读有三条实用规则:其一,单档深度变化率 Δdepth/Δt 超过该档过去 20 个窗口标准差的 3 倍,标记为尖峰;其二,某档位成交量超过其挂单量的 80%,说明该档被快速消耗,需检查是否触发跨档拆分;其三,各档净流入之和与全市场主动买卖差不等,说明方向推断或档位映射存在遗漏。这三条规则可直接写成清洗后的校验脚本,作为图谱生成前的最后一道闸门。

采集阶段建议保留原始流不删不改,所有清洗动作以“标记 + 派生字段”的方式追加,而不是覆盖原值。这样当图谱出现异常时,可以回溯到原始记录定位是采集问题、映射问题还是聚合问题。

五、一份可直接套用的采集字段清单

下表给出四层数据各自的最小字段集,字段名可按实际数据源调整,但语义不可缺失。缺失任一关键字段,图谱的某一维度就无法闭合。

数据层 关键字段 用途 缺失后果
逐笔成交 trade_id、时间戳、成交价、成交量、方向 计算成交量与净流入 无法去重、方向偏差
逐笔委托 order_id、时间戳、委托价、委托量、撤单标识 计算挂单量与撤单量 迁移量无法解释
价格序列 时间戳、bid1、ask1、参考价类型 档位锚点与重采样 档位边界漂移
档位归属 档位编号、边界规则、锚点时间 价格到档位的映射 跨窗比较错位
深度指标 档位、时间窗、depth、vol_traded、vol_cancel、net_flow 图谱直接输入 图谱无法生成

把这五组字段按“原始流 → 参考价 → 映射 → 聚合”的顺序串起来,并在每一层设置守恒校验与异常标记,深度变化图谱的数据基础才算真正可靠。图谱上看到的每一次档位迁移,背后都应当能追溯到一笔具体的成交或撤单,而不是清洗过程中被悄悄修正过的数字。