3. 逐笔成交数据获取与清洗

逐笔成交是封板结构分析最底层的“原材料”。它记录的是每一笔撮合成交的时间、价格、成交量和买卖方向,而不是分钟K线那种被压缩过的汇总结果。封板期间真正有价值的信息——封单被大单砸开、板上反复成交、撤单后重新排队、尾盘抢筹——都藏在逐笔明细里。因此,本节要解决的不是“怎么分析”,而是“怎么拿到干净、对齐、可比较的逐笔数据”。数据源选错、字段理解错、异常值没处理、时间没对齐、复权没做对,后面所有封板结构的判断都会失真。

一、常见数据源与获取方式

逐笔成交数据主要有三类来源。第一类是交易所官方行情,如上交所、深交所的Level-2逐笔成交与逐笔委托,精度最高,包含成交编号、委托编号、买卖方向等完整字段,但需要券商或行情商授权,个人通常通过券商终端或量化接口获取。第二类是第三方数据服务商,如聚宽、米筐、Tushare、Wind等,提供整理后的逐笔成交表,字段规范、接口友好,适合研究和回测,但要注意其时间戳精度和是否包含集合竞价。第三类是自行抓取的公开行情快照,精度较低,一般不推荐用于封板结构分析。

以Tushare的逐笔成交接口为例,典型调用方式如下:

import tushare as ts
pro = ts.pro_api("你的token")
df = pro.stk_mins(ts_code="600519.SH", freq="1min",
                  start_date="2024-06-03 09:30:00",
                  end_date="2024-06-03 15:00:00")
# 逐笔成交需使用更高权限接口,如 pro.tick 或券商Level-2推送

实际工程中,逐笔数据往往以当日全市场压缩包或按股票推送的流式数据形式到达,需要先落地为本地文件,再按股票、按日期切分。建议统一存储为Parquet或CSV,字段名标准化,避免不同数据源字段名不一致导致后续解析混乱。

二、字段解析:逐笔成交表里到底有什么

一份标准的逐笔成交记录通常包含以下字段:成交时间(精确到毫秒或微秒)、证券代码、成交价格、成交数量(股或手)、成交金额、买卖方向(B/S或主动买/主动卖)、成交编号、委托编号(部分数据源提供)。其中最容易出错的是“买卖方向”的定义:有的数据源以“主动方”标记,即主动买盘记为B;有的以“委托方”标记,含义相反。使用前必须核对数据字典,否则封板期间“主动买入占比”会算反。

另一个关键字段是成交编号。同一笔成交在逐笔成交和逐笔委托中可能对应不同编号,做委托与成交匹配时要以委托编号为纽带。若数据源不提供委托编号,则只能做近似统计,无法精确还原“一笔大单分多次成交”的过程。封板分析中,封单被吃掉往往表现为同一委托编号下连续多笔成交,缺少该字段会丢失这一结构信息。

三、异常值处理:先识别,再决定删还是修

逐笔数据常见的异常包括:价格为0或明显偏离涨跌停价、成交量为0、时间戳重复或倒序、同一成交编号重复出现、集合竞价阶段混入连续竞价表。处理原则是先标记、再分类、后处理,不要一上来就整行删除。

价格异常可用涨跌停价作为边界校验:若成交价高于涨停价或低于跌停价,基本可判定为脏数据。成交量异常可结合该股票当日平均单笔成交量做箱线图判断,但要注意封板瞬间的大单本身就会形成离群值,不能简单按统计离群删除。时间戳倒序需要按成交编号重新排序,而不是按文件行序。重复记录可用“成交编号+时间+价格+数量”组合去重。

注意:封板期间的大额成交是分析对象而非噪声。异常值处理的目标是剔除错误记录,不是抹平真实的大单结构。删除前应保留原始标记列,便于回溯。

四、时间对齐:让逐笔与快照、K线说同一种时间语言

逐笔成交的时间戳是交易所撮合时间,而分钟K线、盘口快照的时间戳通常是区间端点或快照时刻,两者不能直接拼接。常见做法是将逐笔成交按“时间戳落在哪个分钟区间”归入对应分钟,例如09:30:00至09:30:59.999归入09:30这根K线。但要注意,部分数据源的分钟K线以结束时间标记,即09:31标记为09:30的成交量,对齐前必须确认口径。

封板分析中还需要把逐笔成交与封单量快照对齐。快照通常是每3秒或每500毫秒一张,逐笔成交是事件流。正确做法是以快照时间为锚点,统计两个快照之间的逐笔成交汇总,形成“区间成交—区间封单变化”的配对序列。若时间戳存在毫秒级偏差,应统一转换为同一时区、同一精度后再比较,避免因四舍五入导致成交被归入错误区间。

逐笔成交数据清洗与对齐流程 交易所 Level-2 逐笔成交 / 逐笔委托 第三方数据服务 Tushare / 聚宽 / Wind 券商终端导出 CSV / Excel 明细 字段解析与标准化 时间戳 · 价格 · 数量 · 买卖方向 · 成交编号 · 委托编号 重点核对:买卖方向口径(主动方 / 委托方) 异常值识别与处理 价格越界 · 零量 · 时间倒序 重复编号 · 集合竞价混入 先标记,再分类,后处理 时间对齐 逐笔 → 分钟区间归属 逐笔 ↔ 盘口快照区间配对 统一时区与时间精度 复权处理 除权除息日 前复权 / 后复权 价格 × 复权因子 封板价需还原为 可比价格序列 注意:成交量不随 价格复权而调整 输出:干净、对齐、可比的逐笔成交序列 用于封板时长、封单结构、板上成交占比等指标计算

五、复权处理:封板价格必须放在可比序列里

逐笔成交记录的是当日真实成交价,本身不含复权信息。但做跨日封板结构对比时,如果期间发生除权除息,前一日涨停价与后一日涨停价不在同一价格尺度上,直接比较会得出错误结论。处理方式有两种:一是对逐笔成交价乘以复权因子,转换为前复权或后复权价格;二是不改逐笔价格,而是在计算涨跌幅、封板价差等指标时统一使用复权后的基准价。

需要特别提醒:复权只作用于价格,不作用于成交量。成交量在除权前后本身就会因股本变化而不同,不能简单乘以复权因子。封板分析中常用的“封单量/流通股本”指标,应以当日实际流通股本为分母,而不是复权后的虚拟股本。此外,逐笔成交的买卖方向、成交编号等字段与复权无关,不应参与复权变换。

六、一份可执行的清洗检查清单

把上述环节串起来,实际落地时可以按以下顺序检查:确认数据源字段字典,核对买卖方向口径;按成交编号去重并重排时间;用涨跌停价边界剔除价格异常;标记零成交量和集合竞价混入记录;将逐笔时间戳归入分钟区间并与快照配对;对跨除权日的样本应用复权因子;最后保留原始标记列,输出清洗日志。每一步都应记录被处理记录的数量和比例,便于判断数据质量是否影响封板结构结论。

实践建议:先用一只当日有封板行为的股票做小样本验证,人工核对封板瞬间的逐笔成交与盘口封单变化是否吻合,再推广到全市场批量处理。清洗规则一旦确定,应固化为脚本,避免不同日期口径漂移。

逐笔成交数据的获取与清洗,本质上是为封板结构分析建立可信的输入。数据源决定精度上限,字段解析决定方向是否正确,异常值处理决定噪声水平,时间对齐决定事件能否配对,复权处理决定跨日比较是否成立。这五个环节任何一处疏漏,都会在后续封板时长、封单结构和板上成交占比的计算中被放大。把清洗做扎实,后面的分析才有意义。