3、市场数据基础:Tick级数据、Level2行情数据、数据频率与精度、数据存储与回放
做微结构套利,说白了就是跟市场抢时间。你比别人快一毫秒,可能就多赚一笔。但这一切的前提是什么?是数据。没有高质量的市场数据,再牛的策略也是空中楼阁。
我刚开始做量化那会儿,以为拿个日线就能搞套利。结果呢?回测曲线漂亮得不行,实盘一跑就亏成狗。后来才明白,微结构套利玩的是「毫秒级」的博弈,日线数据根本看不到这些细节。
今天我们就来聊聊市场数据的基础。嗯,这部分内容比较硬核,但非常重要。你想想看,连数据都搞不明白,怎么去挖掘套利机会?
3.1 Tick级数据:最原始的市场脉搏
Tick级数据,就是交易所每笔成交的原始记录。它记录了每一笔交易的细节,包括成交时间、价格、数量、买卖方向等。
我个人习惯把Tick数据比作「市场的DNA」。它包含了最微观的市场行为信息。比如,你可以从Tick数据中看到大单的拆分、主力的挂单撤单行为、甚至是程序化交易的痕迹。
- 时间戳:精确到毫秒甚至微秒
- 成交价格:该笔交易的实际成交价
- 成交量:该笔交易的股数或手数
- 成交金额:价格 × 数量
- 买卖方向:主动买还是主动卖(B/S标识)
举个例子,A股市场的Tick数据大概长这样:
时间戳, 代码, 价格, 数量, 方向, 成交额
2024-01-15 09:30:00.123, 600519, 1685.00, 100, B, 168500
2024-01-15 09:30:00.124, 600519, 1685.01, 200, S, 337002
2024-01-15 09:30:00.125, 600519, 1685.00, 50, B, 84250
你看,一秒钟内就有三笔成交。这就是Tick数据的粒度。我在项目中遇到过,有些策略就是靠分析这种毫秒级的成交序列来捕捉套利机会的。
3.2 Level2行情数据:比Tick更丰富的信息
Level2行情,也叫深度行情。它比Tick数据多了什么?多了「十档买卖盘口」和「逐笔委托」信息。
说白了,Tick数据告诉你「已经发生了什么」,而Level2行情告诉你「正在发生什么」和「即将发生什么」。这对微结构套利来说,价值巨大。
| 数据维度 | Tick数据 | Level2行情 |
|---|---|---|
| 成交记录 | ✓ | ✓ |
| 十档买卖盘口 | ✗ | ✓ |
| 逐笔委托 | ✗ | ✓ |
| 委托队列 | ✗ | ✓ |
| 大单统计 | ✗ | ✓ |
我记得有一次做ETF套利,光看Tick数据根本看不出问题。后来上了Level2行情,才发现盘口上有大单在「钓鱼」,故意挂单引诱成交。嗯,这就是Level2的价值——让你看到水面下的冰山。
3.3 数据频率与精度:选对工具干对活
数据频率,就是你采样的间隔。常见的频率有:
- Tick级:每笔成交都记录,频率最高
- 秒级:每秒一个快照
- 分钟级:每分钟一个K线
- 日线级:每天一个数据点
做微结构套利,Tick级是标配。但这里有个坑——不是所有策略都需要最高频率的数据。
我曾经犯过一个错误:为了追求极致精度,把所有策略都跑在Tick数据上。结果呢?策略没赚到钱,服务器倒是先烧了。后来我学乖了,先搞清楚策略需要什么粒度的数据。
举个例子:
- 跨期套利:通常需要秒级或Tick级数据,因为价差变化很快
- 统计套利:分钟级可能就够了,因为均值回归需要时间
- 做市策略:必须用Tick级,毫秒级的订单簿变化都要捕捉
3.4 数据存储与回放:让历史告诉你答案
数据存下来,不是为了占硬盘,而是为了回测和回放。回放,就是模拟历史行情,让策略在历史数据上跑一遍。
我个人习惯用以下几种存储方案:
- CSV文件:简单直接,适合小规模数据
- Parquet格式:列式存储,压缩率高,适合大数据量
- 时序数据库:如InfluxDB、ClickHouse,查询效率高
- HDF5:科学计算常用,支持多维数据
这里我画了一张图,帮你理清数据从采集到回放的整个流程:
关于回放,我想多说两句。好的回放系统,不只是把数据按时间顺序喂给策略。它还要模拟真实的行情延迟、网络抖动、交易所撮合规则等。否则,回测结果跟实盘差距会很大。
3.5 数据质量:被忽视的关键
数据质量,是另一个容易被忽视的问题。你以为交易所给的数据就是完美的?太天真了。
常见的数据问题:
- 缺失数据:网络波动导致某些Tick丢失
- 重复数据:同一个Tick被推送了两次
- 乱序数据:后发生的成交先到达
- 异常值:价格或数量明显不合理
我建议在数据入库前做一次清洗。比如:
# 简单的数据清洗示例
def clean_tick_data(df):
# 去重
df = df.drop_duplicates(subset=['timestamp', 'price', 'volume'])
# 排序
df = df.sort_values('timestamp')
# 过滤异常价格(比如超过涨跌停板)
df = df[(df['price'] >= lower_limit) & (df['price'] <= upper_limit)]
return df
别小看这一步。数据质量差,策略再牛也白搭。我见过有人用脏数据跑回测,跑出年化500%的「神策略」,实盘直接亏光。嗯,数据清洗是基本功,偷懒不得。
- Tick数据是微结构套利的基石,精度越高越好
- Level2行情提供了盘口深度信息,能看到更多市场细节
- 数据频率要匹配策略需求,不是越高越好
- 存储方案要考虑成本和查询效率的平衡
- 回放系统要模拟真实行情环境
- 数据清洗是必须的,别偷懒
好了,市场数据基础就聊到这儿。数据是量化交易的「原材料」,原材料质量决定了最终产品的质量。下一节我们会聊到如何用这些数据构建套利策略的信号。嗯,到时候见。