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」就出问题了。

我的习惯:拿到数据后,第一时间把时间字段转成统一的datetime格式。别偷懒,后面会省很多事。

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 数据清洗与对齐

拿到原始数据后,我一般按以下步骤处理:

  1. 去重:按订单编号和时间去重
  2. 排序:按时间升序排列
  3. 对齐:把不同股票的数据按时间对齐
  4. 填充:缺失值处理(通常用前向填充)

举个例子:

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,清晰且可缩放。

逐笔委托数据结构与清洗流程 原始逐笔委托 时间 | 价格 | 数量 方向 | 订单编号 数据清洗 去重 → 排序 过滤异常 → 重置索引 数据对齐 多股票时间对齐 缺失值前向填充 字段详解 ⏰ 时间 (毫秒级) 💰 价格 (float64) 📦 数量 (股/手) ⬆️ 方向 (1买/2卖) 🔖 订单编号 (全局唯一标识) 清洗后数据 → 可用于资金流向计算、订单簿重建、微观结构分析

这张图把整个流程串起来了。从原始数据到清洗对齐,每一步都有讲究。你想想看,如果数据没对齐,后面算出来的资金流向就是错的——那还不如不算。

3.8 避坑指南

最后分享几个我踩过的坑:

  • 时间戳精度不一致:有的数据源给毫秒,有的给微秒。统一成毫秒,别混用。
  • 价格零值:偶尔会出现价格为0的委托,通常是数据异常,直接过滤掉。
  • 数量为负:理论上不可能,但数据商偶尔会搞错。遇到就标记出来。
  • 订单编号重复:前面说过了,先排查再处理。
我的经验:数据清洗花的时间,通常占整个项目的60%以上。别嫌麻烦,这一步做扎实了,后面的分析才能站得住脚。

好了,逐笔委托的字段就讲到这里。记住这五个字段,理解它们的含义和坑,你就能驾驭逐笔数据了。

专注资料整理