高频数据基础: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数据脏数据问题
- 时间戳错乱:比如某条记录的时间戳比前一条还早。这通常是交易所撮合引擎的bug或者网络延迟导致的。
- 价格异常:突然出现一个离谱的价格,比如正常交易在100块,突然冒出来一个1000块的成交。这种多半是错误单。
- 重复数据:同一条成交被推送了两次。嗯,这个在部分券商的API里很常见。
- 缺失数据:某段时间内完全没有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数据质量天差地别。我建议你拿到数据后,先随机抽几天的数据,手动检查时间戳的连续性。如果一天内缺失超过10个时间段,这个数据源基本可以放弃了。
第二,存储格式。Tick数据量巨大,一天可能几千万条。用CSV存?别闹了。我个人习惯用Parquet格式,压缩率高,读取速度快。配合分片存储,按日期分文件夹,查询效率能提升10倍以上。
第三,增量更新。Order Book是实时变化的,你不可能每次都拉全量快照。我建议用增量更新的方式——只记录变化的那几档。这样数据量能减少80%以上。
核心观点:高频数据的基础工作,决定了你策略的天花板。数据没处理好,再牛的因子也是空中楼阁。我见过太多人在这上面栽跟头,希望你不是下一个。
好了,这一章的内容就到这里。记住,Tick数据和Order Book是你的眼睛,数据清洗是你的手。眼睛要亮,手要稳,才能在市场里看到别人看不到的机会。