3. 数据获取与预处理

研究9:15—9:20的撤单行为,第一步不是写策略,而是把数据“弄干净”。沪深交易所的Level-2逐笔委托(Order)与逐笔成交(Trade)行情,是刻画撤单行为最直接的原料。本节围绕三个问题展开:字段怎么读、脏数据怎么洗、时间怎么对齐,以及异常值如何识别与处置。

一、逐笔委托与撤单数据的字段结构

逐笔委托数据通常以“一委托一记录”的形式推送,核心字段包括:证券代码、委托时间(交易所时间戳,精确到毫秒或10毫秒)、委托序号(交易所内唯一递增)、买卖方向、委托价格、委托数量、委托类型(限价/市价/本方最优等)。撤单在逐笔委托流中一般表现为一条独立的“撤单记录”,通过原始委托序号与原始委托关联,字段上体现为撤单数量与撤单标识。理解这一点非常关键:撤单不是删除原记录,而是追加一条反向事件,因此必须用委托序号做“配对”,才能还原“哪一笔委托在什么时刻被撤掉了多少量”。

实际数据中常见的字段陷阱有三类。其一是序号不连续:交易所推送可能因网络丢包出现跳号,需以序号连续性做完整性校验。其二是撤单记录的方向字段:部分数据源撤单记录的方向沿用原委托方向,部分则置空,清洗时须以原始委托为准回填。其三是价格与数量的单位:价格常以“元”或“厘”存储,数量以“股”或“手”存储,混用会导致后续统计量级错误。建议在入库阶段统一为“元”和“股”,并保留原始字段以便回溯。

逐笔委托/撤单数据预处理链路 原始逐笔流 委托序号 / 时间戳 方向 / 价格 / 数量 撤单标识 / 原委托号 数据清洗 序号连续性校验 单位统一 / 方向回填 去重与字段补全 时间对齐 统一到毫秒时间轴 撤单配对原委托 计算存活时长 异常值处理 负存活时长 超量撤单 孤立撤单记录 清洗后事件表(示例字段) 证券代码 | 事件时间 | 事件类型 | 方向 | 价格 | 数量 | 原委托号 | 存活毫秒 600XXX | 09:16:03.420 | 撤单 | 买 | 10.25 | 3000 | 88213 | 1240 (示例数据,仅用于说明字段结构)

二、数据清洗:从“能读”到“可信”

清洗的目标是让每条记录都满足“可配对、可计量、可比较”。建议按以下顺序处理,避免返工。

第一步,完整性校验。按证券代码分组,检查委托序号是否严格递增且无跳号。若发现跳号,说明该时段存在丢包,应标记该证券该时段为“不完整”,在后续统计撤单率时剔除或降权,而不是简单插值——插值会凭空造出并不存在的委托。

第二步,字段规范化。统一价格单位为元、数量单位为股;对撤单记录,若方向为空则用原委托方向回填;对委托类型做枚举映射,把“本方最优”“对手方最优”等归入统一编码。这一步看似琐碎,但方向回填错误会直接导致“买撤/卖撤”比例失真。

第三步,去重。同一委托序号若出现多条相同记录,多为重推,保留首条即可;若同一序号出现内容不同的记录,需以交易所时间戳更早者为准并记录冲突日志。

第四步,撤单配对。以原委托号为键,把撤单记录挂到对应委托上,计算“存活时长 = 撤单时间 − 委托时间”。配对失败(找不到原委托)的记录即为孤立撤单,通常源于数据起点截断,应单独存放而非丢弃,便于评估截断影响。

三、时间对齐:让不同来源的事件落在同一根轴上

Level-2数据的时间戳来自交易所,但不同数据源(逐笔委托、逐笔成交、快照)的推送节奏不同,且本地接收时间与交易所时间存在系统偏差。研究9:15—9:20这一短窗口,时间对齐的精度直接决定结论。推荐做法是:一律以交易所时间戳为准,本地接收时间仅用于诊断延迟;把时间统一转换为“当日毫秒数”,并明确9:15:00为窗口起点、9:20:00为终点,采用左闭右开区间,避免边界重复计数。

对于撤单配对,还需注意集合竞价阶段的特殊性:9:15—9:20允许撤单,9:20—9:25不允许撤单。因此若某笔撤单记录的时间戳落在9:20之后,却声称撤的是9:15—9:20的委托,应视为异常,需核查是否为数据延迟或时间戳错位。一个实用的校验是:统计每分钟撤单笔数,正常情况下9:20附近应出现“断崖式”下降,若没有,说明时间对齐可能出了问题。

四、异常值识别与处置

短窗口数据中,异常值往往不是随机噪声,而是数据质量问题的信号。常见类型及处置建议如下:

  • 负存活时长:撤单时间早于委托时间,多为时间戳精度或跨源对齐错误。处置:标记为异常,不参与存活时长统计,但保留记录用于排查。
  • 超量撤单:撤单数量大于原委托数量。处置:以原委托数量为上限截断,并记录截断次数;若频繁出现,应检查数量单位是否混用。
  • 孤立撤单:找不到原委托。处置:单独存放,统计其占比;占比过高说明数据起点截断严重,需扩大取数窗口。
  • 价格越界:委托价格超出当日涨跌停范围。处置:视为脏数据剔除,并核查是否复权或代码映射错误。
建议在清洗流程末尾输出一份“数据质量报告”,至少包含:记录总数、跳号次数、孤立撤单占比、负存活时长笔数、超量撤单笔数。这份报告是判断本节数据能否支撑后续撤单行为分析的第一道门槛。

完成上述步骤后,得到的是一张“一事件一行”的清洗后事件表:每行有明确的证券代码、交易所时间、事件类型(委托/撤单)、方向、价格、数量、原委托号和存活毫秒。后续统计9:15—9:20的撤单率、撤单价格分布、撤单存活时长分布,都应基于这张表进行。需要强调的是,清洗规则一旦确定,应在整个研究周期内保持一致,任何规则调整都要在质量报告中留痕,否则不同批次数据之间将失去可比性。