4. 盘口数据采集与清洗
研究炸板前的盘口流动性变化,第一步不是建模,而是把“原始数据”变成“可比较、可对齐、可复现”的研究底稿。盘口数据通常由三类异构数据构成:逐笔委托(order)、逐笔成交(trade)和快照(snapshot)。三者的时间粒度、字段含义和更新频率完全不同,若直接混用,很容易在炸板前几分钟得出错误结论。本节围绕“怎么取、怎么对齐、怎么处理异常”展开,并给出可直接套用的处理流程。
三类数据的获取方式与字段要点
逐笔委托记录每一笔委托的进入、撤单与交易所撮合前的状态变化,核心字段包括:证券代码、委托时间(精确到毫秒或微秒)、委托编号、买卖方向、委托价格、委托数量、委托类型(限价/市价/本方最优等)、以及撤单标识。逐笔委托是判断“封单是否真实、撤单是否集中”的关键数据,尤其要关注撤单时间与撤单量。
逐笔成交记录撮合成交结果,字段包括成交时间、成交编号、买卖委托编号、成交价格、成交数量、成交方向(主动买/主动卖)。逐笔成交用于还原主动买卖力量对比,是识别“炸板前主动性卖盘是否放大”的直接证据。
快照是每隔固定时间(常见为3秒)对盘口十档或五档的切片,字段包括快照时间、最新价、买一至买十价量、卖一至卖十价量、累计成交量、累计成交额等。快照适合刻画盘口深度与价差,但它是“采样”而非“全量”,不能替代逐笔数据。
获取方式上,逐笔数据一般通过交易所Level-2行情接口或券商行情网关订阅,快照则通过标准行情快照接口获取。实际工程中建议统一落库为三张表,并保留原始时间戳字段,不要在上游做任何时间截断或去重,以便后续可追溯。
炸板前时段的数据对齐
炸板前的研究窗口通常取“首次触及涨停后至炸板瞬间”这一段,例如以涨停封板时刻为T0,取[T0-10分钟, T0+1分钟]作为分析区间。对齐的核心原则是:以交易所时间戳为唯一基准,逐笔数据按事件时间排序,快照按采样时间归入最近的事件区间。
具体做法是:先将逐笔委托与逐笔成交合并为一张“事件流”表,按时间升序排列,并为每条事件打上“距炸板秒数”字段(炸板时刻记为0,之前为负、之后为正)。快照则按快照时间落入事件流的时间桶中,例如每3秒一个桶,桶内统计委托到达量、撤单量、成交量。这样,快照的“静态深度”与逐笔的“动态流量”就能在同一时间轴上对照。
需要特别注意的是时间戳口径:逐笔委托时间可能是交易所撮合前时间,逐笔成交时间是撮合时间,快照时间是行情生成时间,三者存在毫秒级偏差。建议统一转换为交易所时区,并在对齐时允许一个小的容差窗口(如±50毫秒),超出容差的事件单独标记为“待核验”,不要强行归并。
异常处理:炸板前数据最容易踩的坑
炸板前时段数据密度极高,异常也最集中。常见问题有四类:时间倒挂(后到的委托时间早于先到事件)、重复推送(同一委托编号多次出现)、价格越界(委托价超出当日涨跌停范围)、数量异常(撤单量大于原委托量)。处理原则是“先标记、后隔离、不静默删除”。
例如,对重复委托编号,保留首次出现记录,后续记录标记为dup_flag=1并移入异常表;对时间倒挂事件,若偏差在容差内则按时间重排,超出容差则标记time_flag=1;对撤单量大于原委托量的记录,直接判定为脏数据,不参与撤单率计算。所有异常记录必须保留原始字段,便于回溯。
另一个容易被忽视的问题是快照缺失。炸板瞬间行情推送可能拥堵,导致某几个3秒桶没有快照。此时不要用前后快照线性插值“补”出盘口深度,而应将该桶标记为缺失,并在计算封单变化率时跳过该桶,避免制造虚假的流动性突变。
一个可执行的处理示例
假设某只股票在10:15:00首次封板,10:22:30炸板。取窗口[10:12:30, 10:23:30],共11分钟。处理步骤如下:
- 从逐笔委托表中筛选该代码、该时间段的记录,按委托时间排序,计算每条记录的“距炸板秒数”。
- 将逐笔成交按成交时间并入同一事件流,成交记录关联对应的买卖委托编号。
- 将快照按3秒桶归入事件流,每个桶统计:新增委托量、撤单量、成交量、买一量、卖一量。
- 对事件流做去重与异常标记,输出清洗后的底稿表。
- 基于底稿计算炸板前5分钟的“撤单率 = 撤单量 / 新增委托量”和“主动卖占比”,观察其是否在炸板前出现拐点。