第8章:市场微观结构数据:Tick级数据、Level2数据、数据清洗与预处理
做量化交易的朋友都知道,数据是咱们的命根子。但说实话,很多人对数据的理解还停留在日线级别。今天我想跟你聊聊更深一层的东西——市场微观结构数据。
什么叫微观结构?说白了,就是市场在极短时间内发生的一切。你看到的每一笔成交、每一次报价变动,甚至撤单,都是微观结构的一部分。我个人习惯把这类数据称为「市场的DNA」,因为它记录了价格形成的全过程。
8.1 Tick级数据:最原始的市场心跳
Tick级数据,就是逐笔成交数据。每一笔交易产生一条记录。A股市场,每天大概会产生几千万到上亿条Tick数据。
举个例子,你看到下面这样的数据:
时间戳 价格 成交量 方向
09:30:01.123 10.25 1000 买
09:30:01.456 10.26 500 卖
09:30:02.001 10.25 2000 买
每条记录都精确到毫秒甚至微秒。我在项目中遇到过最夸张的情况——某高频策略需要处理纳秒级数据,那真是考验硬件的极限。
Tick数据的关键字段:
- 时间戳:精确到毫秒/微秒
- 成交价格:实际成交价
- 成交量:该笔成交的股数
- 成交方向:主动性买盘还是卖盘
- 成交编号:交易所唯一标识
核心要点:Tick数据是最高频的数据源,能捕捉到秒级甚至毫秒级的市场变化。但数据量巨大,处理起来需要技巧。
8.2 Level2数据:比Tick更丰富的视角
Level2数据,也叫深度行情数据。它比Tick数据多了一个维度——订单簿信息。
你想想看,Tick数据只告诉你「成交了什么」,但Level2数据告诉你「谁在排队、排了多少、什么时候撤单」。这就像看足球比赛,Tick数据是进球集锦,Level2数据是全场录像。
Level2数据包含:
- 十档行情:买卖各10档的挂单量和价格
- 逐笔成交:同Tick数据
- 委托队列:前50笔挂单明细
- 撤单信息:谁撤单了、撤了多少
- 资金流向:大单、中单、小单统计
我记得刚接触Level2数据时,最让我震撼的是委托队列。你能看到大资金在某个价位挂了一万手,然后突然撤单——这种信息在Tick数据里是看不到的。
实战技巧:Level2数据中的「委托队列」是判断主力意图的好工具。如果买一价位突然出现大量挂单又迅速撤单,很可能是诱多。
8.3 数据清洗:脏数据是策略的杀手
嗯,这里要注意。很多人拿到数据就直接用,结果策略回测漂亮,实盘一塌糊涂。为什么?因为数据没洗干净。
我曾经吃过一次大亏。某次回测一个高频策略,年化收益高达80%。结果实盘第一天就亏了3%。排查了一整天,发现是Tick数据里有重复记录——同一个成交编号出现了两次,导致我多算了一次成交量。
常见的数据脏问题:
| 问题类型 | 表现 | 处理方法 |
|---|---|---|
| 重复数据 | 同一成交编号出现多次 | 按成交编号去重 |
| 缺失数据 | 某段时间没有记录 | 检查是否停牌或数据源问题 |
| 异常价格 | 价格偏离正常范围 | 设置价格上下限过滤 |
| 时间错乱 | 时间戳顺序颠倒 | 按时间戳排序并检查 |
| 撮合错误 | 买卖方向标记错误 | 用价格变动反推方向 |
避坑指南:我曾经遇到过一个数据供应商,他们的Tick数据在每天收盘前5分钟会丢失约30%的记录。后来发现是他们的服务器在收盘前做数据备份,导致写入延迟。所以,拿到数据后一定要做完整性检查。
8.4 预处理流程:从原始数据到可用数据
数据预处理,说白了就是把「毛坯房」装修成「精装房」。我一般按以下步骤操作:
- 格式统一:把不同数据源的时间格式、价格精度统一
- 去重:按成交编号或时间戳+价格+成交量组合去重
- 排序:按时间戳升序排列
- 异常值过滤:剔除价格涨跌停外的异常数据
- 缺失值处理:对于短暂缺失,用插值法填充;长时间缺失则标记
- 衍生指标计算:生成买卖压力、订单簿斜率等特征
这里给一段Python代码示例,展示基本的清洗流程:
import pandas as pd
def clean_tick_data(df):
# 1. 去重
df = df.drop_duplicates(subset=['trade_id'])
# 2. 排序
df = df.sort_values('timestamp')
# 3. 过滤异常价格
df = df[(df['price'] > 0) & (df['price'] < 1000)]
# 4. 检查时间连续性
time_diff = df['timestamp'].diff()
abnormal_gaps = time_diff[time_diff > pd.Timedelta(seconds=5)]
if len(abnormal_gaps) > 0:
print(f'发现{len(abnormal_gaps)}处时间间隔超过5秒')
return df
个人经验:清洗数据时,我建议保留原始数据副本。万一清洗逻辑有误,还能回退。我见过有人直接覆盖原始数据,结果发现清洗规则写错了,数据全废了——那叫一个惨。
8.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心内容串起来了。从上到下,从数据来源到清洗处理,每一步都环环相扣。你想想看,如果数据源就有问题,后面再好的策略也是白搭。
8.6 写在最后
市场微观结构数据,是量化交易中最接近「真相」的数据。但真相往往藏在细节里——一个毫秒级的时间戳偏差,可能让你的策略从盈利变成亏损。
我个人建议,刚开始接触这类数据时,不要急着跑策略。先花一周时间把数据摸透:它的结构、它的规律、它的坑。磨刀不误砍柴工,这句话在量化领域尤其适用。
好了,关于Tick数据和Level2数据,今天就聊到这儿。数据清洗是个细致活,急不来。下次有机会,咱们再聊聊如何从这些数据中提取有效的交易信号。