高频数据基础:Tick级数据、Order Book数据结构与数据清洗

各位同学,今天我们来聊聊高频数据的底层逻辑。说实话,很多做量化的人一上来就搞因子、跑回测,结果数据源都没搞清楚。我见过太多人因为Tick数据没处理好,策略回测漂亮得像朵花,实盘一跑就崩。嗯,咱们今天就把这块地基打牢。

一、Tick级数据:市场最原始的呼吸

Tick数据是什么?说白了,就是交易所每发生一笔交易,就吐出来的一条记录。它不像分钟线那样被加工过,它是赤裸裸的原始数据。

我习惯把Tick数据比作市场的「心跳」。每一笔成交,都带着价格、数量、时间戳、成交方向。你想想看,如果你能捕捉到每一笔交易的细节,那对市场微观结构的理解,绝对比只看K线的人深一个层次。

Tick数据的核心字段

字段名 含义 典型示例
Timestamp 精确到毫秒甚至微秒的时间戳 2025-03-15 09:30:01.234
Price 成交价格 100.25
Volume 成交数量 500
Side 主动成交方向(买/卖) B / S
Exchange 交易所代码 SSE / SZSE

重要提醒:时间戳的精度决定了你策略的颗粒度。国内A股的Tick数据,上交所和深交所的时间戳精度不一样,这个坑我踩过。

二、Order Book数据结构:订单簿的骨架

Order Book,也就是订单簿,它记录了当前市场上所有未成交的买单和卖单。我个人觉得,理解订单簿比理解Tick数据更重要——因为Tick是已经发生的事,而订单簿告诉你接下来可能发生什么。

订单簿通常分为两个部分:

  • Bid(买方队列):从最高买价往下排
  • Ask(卖方队列):从最低卖价往上排

每一档价格上,都挂着对应的委托数量。这就是所谓的「深度」。我在项目中遇到过,有些股票看似流动性很好,但订单簿中间几档是空的,一有大单进来价格直接跳空。这种股票,做高频策略就是找死。

典型的Order Book快照结构

{
  "timestamp": "2025-03-15 09:30:05.123",
  "bids": [
    [100.20, 1000],  // 价格, 数量
    [100.19, 2000],
    [100.18, 1500]
  ],
  "asks": [
    [100.21, 800],
    [100.22, 1200],
    [100.23, 3000]
  ]
}

我的小技巧:做高频因子时,别只看第一档。我习惯把前五档的加权平均价格作为「有效价格」,这样能过滤掉很多挂单撤单的噪音。

三、数据清洗:90%的时间都在干这个

说实话,做高频策略最枯燥的就是数据清洗。你可能觉得写因子很酷,但真正的高手,花在清洗上的时间比写策略多得多。我曾经因为一个时间戳对齐的问题,回测结果差了3个bp,查了整整两天才找到原因。

常见的Tick数据脏数据问题

  1. 时间戳错乱:比如某条记录的时间戳比前一条还早。这通常是交易所撮合引擎的bug或者网络延迟导致的。
  2. 价格异常:突然出现一个离谱的价格,比如正常交易在100块,突然冒出来一个1000块的成交。这种多半是错误单。
  3. 重复数据:同一条成交被推送了两次。嗯,这个在部分券商的API里很常见。
  4. 缺失数据:某段时间内完全没有Tick数据。可能是交易所休市,也可能是数据源断了。

我的清洗流程(实战经验)

# 伪代码,展示清洗逻辑
def clean_tick_data(df):
    # 1. 去除时间戳逆序的记录
    df = df.sort_values('timestamp')
    df = df[df['timestamp'].diff() >= 0]
    
    # 2. 价格合理性检查(3倍标准差之外视为异常)
    mean_price = df['price'].mean()
    std_price = df['price'].std()
    df = df[(df['price'] > mean_price - 3*std_price) & 
            (df['price'] < mean_price + 3*std_price)]
    
    # 3. 去重(基于时间戳和价格)
    df = df.drop_duplicates(subset=['timestamp', 'price', 'volume'])
    
    # 4. 缺失时间段标记(超过5秒无数据)
    df['gap'] = df['timestamp'].diff().dt.total_seconds()
    df['is_gap'] = df['gap'] > 5
    
    return df

避坑指南:我曾经在清洗Order Book数据时,直接删除了所有价格异常的行。结果发现,有些「异常」其实是涨跌停板打开瞬间的真实成交。从那以后,我改用「与前后N笔数据比较」的方法,而不是简单粗暴的阈值过滤。

四、知识体系结构图

下面这张图,是我自己梳理的高频数据基础框架。你把它存下来,以后做任何高频策略,都先对照这张图检查一遍数据链路。

高频数据基础知识体系 Tick级数据 Order Book 数据清洗 时间戳 · 价格 · 数量 · 方向 成交标识 · 交易所代码 Bid/Ask队列 · 深度 快照 vs 增量更新 去重 · 异常值 · 缺失处理 时间对齐 · 涨跌停过滤 三者关系:Tick是原料 → Order Book是结构 → 清洗是精炼 数据质量决定策略上限,清洗不到位,因子全是噪音 建议:每次接入新数据源,先用这套框架做一次全面体检

五、实战中的几个关键点

讲完了理论,咱们聊聊实际干活时要注意什么。

第一,数据源的选择。不同数据商提供的Tick数据质量天差地别。我建议你拿到数据后,先随机抽几天的数据,手动检查时间戳的连续性。如果一天内缺失超过10个时间段,这个数据源基本可以放弃了。

第二,存储格式。Tick数据量巨大,一天可能几千万条。用CSV存?别闹了。我个人习惯用Parquet格式,压缩率高,读取速度快。配合分片存储,按日期分文件夹,查询效率能提升10倍以上。

第三,增量更新。Order Book是实时变化的,你不可能每次都拉全量快照。我建议用增量更新的方式——只记录变化的那几档。这样数据量能减少80%以上。

核心观点:高频数据的基础工作,决定了你策略的天花板。数据没处理好,再牛的因子也是空中楼阁。我见过太多人在这上面栽跟头,希望你不是下一个。

好了,这一章的内容就到这里。记住,Tick数据和Order Book是你的眼睛,数据清洗是你的手。眼睛要亮,手要稳,才能在市场里看到别人看不到的机会。

专注资料整理