第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 预处理流程:从原始数据到可用数据

数据预处理,说白了就是把「毛坯房」装修成「精装房」。我一般按以下步骤操作:

  1. 格式统一:把不同数据源的时间格式、价格精度统一
  2. 去重:按成交编号或时间戳+价格+成交量组合去重
  3. 排序:按时间戳升序排列
  4. 异常值过滤:剔除价格涨跌停外的异常数据
  5. 缺失值处理:对于短暂缺失,用插值法填充;长时间缺失则标记
  6. 衍生指标计算:生成买卖压力、订单簿斜率等特征

这里给一段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 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图:

市场微观结构数据知识体系 数据来源 Tick级数据(逐笔成交) Level2数据(深度行情) 核心字段 时间戳 | 价格 | 成交量 成交方向 | 成交编号 核心字段 十档行情 | 委托队列 撤单信息 | 资金流向 数据清洗与预处理 去重 排序 异常过滤 缺失处理

这张图把本章的核心内容串起来了。从上到下,从数据来源到清洗处理,每一步都环环相扣。你想想看,如果数据源就有问题,后面再好的策略也是白搭。

8.6 写在最后

市场微观结构数据,是量化交易中最接近「真相」的数据。但真相往往藏在细节里——一个毫秒级的时间戳偏差,可能让你的策略从盈利变成亏损。

我个人建议,刚开始接触这类数据时,不要急着跑策略。先花一周时间把数据摸透:它的结构、它的规律、它的坑。磨刀不误砍柴工,这句话在量化领域尤其适用。

好了,关于Tick数据和Level2数据,今天就聊到这儿。数据清洗是个细致活,急不来。下次有机会,咱们再聊聊如何从这些数据中提取有效的交易信号。