数据基础:逐笔成交数据的字段解析
逐笔成交数据(Tick-by-Tick Trade Data)是金融市场微观结构分析中最细粒度的数据形态,它记录了每一笔真实成交的完整属性。与分钟级或日级K线不同,逐笔数据保留了交易发生瞬间的原始状态,是进行高频因子构建、冲击成本测算、主力行为识别和订单流重构的基础原料。理解逐笔数据的字段含义、格式差异和来源特征,是后续所有特征提取工作的前提。如果字段解析出现偏差,后续计算出的任何指标都将失去可靠根基。
核心字段逐一拆解
逐笔成交数据的核心字段通常包含以下六类,每一类在特征提取中承担不同角色。下表展示了A股Level-2逐笔成交的典型字段结构,这也是国内量化机构最常用的数据格式之一。
| 字段名 | 类型 | 示例值 | 说明与特征提取用途 |
|---|---|---|---|
| TradeTime | datetime | 2025-06-18 09:30:01.250 | 交易所撮合时间,精确到毫秒或微秒。用于计算成交间隔、订单流到达速率。 |
| TradePrice | float | 12.35 | 该笔成交的撮合价格。注意复权处理与涨跌停价格边界。 |
| TradeVolume | int | 500(股) | 该笔成交的数量。A股通常以股为单位,部分数据源以手为单位(1手=100股)。 |
| TradeNumber | int64 | 202506180000123456 | 交易所生成的唯一成交编号,用于去重、排序和关联订单。 |
| BuyOrderID | int64 | 2025061800234567 | 买方委托订单编号,用于识别同一订单的多次部分成交。 |
| SellOrderID | int64 | 2025061800345678 | 卖方委托订单编号,与BuyOrderID共同决定买卖方向判定。 |
买卖方向的判定逻辑
买卖方向(Trade Direction)是逐笔数据中最具策略价值的字段,但也是最容易产生歧义的字段。不同数据商对方向的标记规则并不统一,常见的有三种标准:
- 主动买/主动卖(Aggressor Side):根据订单簿撮合规则,以“谁主动吃单”来判定。若买方订单主动与卖方挂单成交,则标记为主动买(Bid);反之标记为主动卖(Ask)。这是Level-2数据中最常用的标准。
- 买方/卖方发起(Initiator Side):部分数据源直接记录是买方订单还是卖方订单触发的成交,与主动买/主动卖含义相同,但命名不同。
- 中性标记(Neutral):某些特殊成交(如开市集合竞价、大宗交易)无法明确区分主动方向,标记为中性。
数据格式与常见来源
逐笔成交数据的格式因来源渠道不同而存在显著差异。国内量化从业者常用的数据来源主要有以下三类,每类在字段完整性、延迟和成本上各有取舍。
| 来源 | 格式 | 字段完整性 | 延迟 | 典型使用场景 |
|---|---|---|---|---|
| 交易所原始数据 | 二进制流(如STEP协议) | 最完整,包含所有字段 | 实时(毫秒级) | 高频做市、极速策略 |
| 券商柜台/量化平台 | CSV / Parquet / 数据库表 | 较完整,可能缺失部分扩展字段 | 准实时(秒级) | 中频策略、盘后分析 |
| 第三方数据商 | CSV / HDF5 / API接口 | 经过清洗,字段命名统一 | 延迟不等(T+1或实时) | 研究回测、因子挖掘 |
以国内某第三方数据商提供的CSV格式为例,其逐笔成交数据文件通常按“日期+股票代码”分文件存储,每行记录一笔成交,字段以逗号分隔。典型的文件内容如下:
TradeTime,TradePrice,TradeVolume,TradeNumber,BuyOrderID,SellOrderID,TradeDirection
2025-06-18 09:30:00.125,12.35,200,202506180000001,202506180000123,202506180000456,B
2025-06-18 09:30:00.128,12.35,100,202506180000002,202506180000123,202506180000789,S
2025-06-18 09:30:00.130,12.36,500,202506180000003,202506180000234,202506180000456,B
案例拆解:从原始逐笔数据到标准化特征表
下面通过一个具体案例,展示如何将原始逐笔数据解析为可用于特征提取的标准化数据表。假设我们拿到某股票2025年6月18日的Level-2逐笔成交数据,原始文件为CSV格式,共约12万笔成交记录。
初始现象与目标:原始数据中TradeTime字段为字符串类型,TradeVolume单位不统一(部分记录为股,部分为手),且存在少量重复记录。目标是将数据清洗为标准化的DataFrame,并计算每分钟的主动买卖量差(Order Flow Imbalance, OFI)。
操作步骤:
- 格式识别与加载:使用Pandas读取CSV,检查前5行数据,确认字段分隔符和编码格式。
- 时间字段解析:将TradeTime从字符串转换为datetime类型,并设置为索引,便于后续时间重采样。
- 单位统一:检查TradeVolume列,若存在手为单位的数据,统一乘以100转换为股。
- 去重处理:根据TradeNumber字段去重,保留首次出现的记录。
- 方向映射:将TradeDirection字段中的'B'映射为1,'S'映射为-1,中性标记映射为0。
- 特征计算:按分钟重采样,计算OFI = sum(TradeVolume * Direction)。
结果对比:清洗前,原始数据中约0.3%的记录存在单位混用问题,若不处理,计算出的OFI将产生约2.7%的偏差。清洗后,OFI序列与盘口买卖压力的变化趋势高度吻合,验证了数据解析的正确性。
常见误区与复盘
在逐笔数据解析的实践中,以下误区值得特别注意:
- 时间戳精度误判:部分数据源的时间戳精确到秒,而另一些精确到毫秒。若将秒级数据当作毫秒级处理,计算出的成交间隔和订单流速率将严重失真。
- 成交量单位混用:A股通常以股为单位,但部分历史数据或港股数据以手为单位。建议在数据加载后立即统一为股,并在特征命名中明确标注单位。
- 买卖方向标记规则不一致:不同数据商对主动买/主动卖的判定可能基于不同的撮合逻辑(如部分数据源以订单编号大小判断方向),跨数据源使用时必须重新映射。
- 忽略集合竞价数据:开盘集合竞价和收盘集合竞价的成交记录在价格形成机制上与连续竞价不同,若直接纳入特征计算,可能引入噪声。