3、数据结构解析:逐笔委托的字段详解
做量化交易这些年,我接触过不少数据源。坦白说,逐笔委托是我认为最有「颗粒感」的数据之一。它不像分钟K线那样把信息揉成一团,而是把每一笔挂单都清清楚楚摆在你面前。
今天我们就来拆解一下,逐笔委托到底长什么样。
3.1 核心字段一览
先看一张表,把逐笔委托的字段列清楚。我习惯把这几个字段称为「五件套」——少了哪个都不行。
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| 时间 | int64 | 委托发生的时间戳,精确到毫秒 | 93000001 |
| 价格 | float64 | 委托价格,单位元 | 10.25 |
| 数量 | int64 | 委托股数(A股通常按手) | 1000 |
| 方向 | int8 | 1=买,2=卖 | 1 |
| 订单编号 | string | 交易所生成的唯一标识 | 20250301000001 |
嗯,这里要注意——不同交易所的字段命名可能略有差异。比如有的叫「Side」有的叫「Direction」,但本质是一样的。
3.2 时间字段:别小看它
时间字段看起来简单,其实坑不少。我刚开始做回测时,就吃过时间的亏。
举个例子:
# 错误示范:直接用字符串比较
time_str = "09:30:00.001"
if time_str > "09:30:00":
print("开盘后第一笔")
# 正确做法:转成时间戳
import pandas as pd
ts = pd.to_datetime("2025-03-01 09:30:00.001")
print(ts)
为什么会这样?因为字符串比较是按字典序,不是按时间序。「09:30:00.001」比「09:30:00」大,但如果你写成「9:30:00.001」就出问题了。
3.3 价格与数量:精度问题
价格字段,A股是两位小数,但有些品种可能是四位。我建议统一用float64,别用float32——精度不够。
数量字段,A股通常以「手」为单位,1手=100股。但有些数据源直接给股数,有些给手数。这个一定要确认清楚。
# 我常用的检查方法
def check_unit(df):
"""判断数量字段是股还是手"""
max_qty = df['quantity'].max()
if max_qty > 10000:
print("大概率是股数")
else:
print("大概率是手数")
我曾经遇到过一家数据商,把港股和A股混在一起,数量单位不统一。那一次排查花了我整整两天。
3.4 方向字段:买还是卖
方向字段很简单,1是买,2是卖。但有个细节——有些数据源用'B'和'S',有些用0和1。我建议统一映射成int8,节省内存。
3.5 订单编号:唯一性的保证
订单编号是交易所生成的,理论上全局唯一。但实际中,我遇到过重复的情况——比如数据商在拼接时出了bug。
我的做法是:
# 检查订单编号是否唯一
duplicates = df[df.duplicated(subset='order_id', keep=False)]
if len(duplicates) > 0:
print(f"发现{len(duplicates)}条重复订单编号")
# 进一步检查
print(duplicates.head())
如果发现重复,别急着删。先看看是不是同一笔委托被重复记录了,还是不同委托恰好编号相同。前者需要去重,后者可能是数据源的问题。
3.6 数据清洗与对齐
拿到原始数据后,我一般按以下步骤处理:
- 去重:按订单编号和时间去重
- 排序:按时间升序排列
- 对齐:把不同股票的数据按时间对齐
- 填充:缺失值处理(通常用前向填充)
举个例子:
def clean_order_flow(df):
"""逐笔委托数据清洗"""
# 1. 去重
df = df.drop_duplicates(subset=['order_id', 'time'])
# 2. 排序
df = df.sort_values('time')
# 3. 过滤异常值
df = df[(df['price'] > 0) & (df['quantity'] > 0)]
# 4. 重置索引
df = df.reset_index(drop=True)
return df
3.7 知识体系图
下面这张图,把逐笔委托的数据结构、清洗流程、对齐逻辑串起来了。我画图时习惯用SVG,清晰且可缩放。
这张图把整个流程串起来了。从原始数据到清洗对齐,每一步都有讲究。你想想看,如果数据没对齐,后面算出来的资金流向就是错的——那还不如不算。
3.8 避坑指南
最后分享几个我踩过的坑:
- 时间戳精度不一致:有的数据源给毫秒,有的给微秒。统一成毫秒,别混用。
- 价格零值:偶尔会出现价格为0的委托,通常是数据异常,直接过滤掉。
- 数量为负:理论上不可能,但数据商偶尔会搞错。遇到就标记出来。
- 订单编号重复:前面说过了,先排查再处理。
好了,逐笔委托的字段就讲到这里。记住这五个字段,理解它们的含义和坑,你就能驾驭逐笔数据了。