期权高频数据获取:Level2行情数据、Tick级数据、数据源选择与清洗对齐
做期权高频交易,第一步不是写策略,而是搞定数据。我见过太多人策略写得天花乱坠,结果一跑回测,数据全是错的。说白了,数据质量决定了你的回测到底是在模拟真实市场,还是在自欺欺人。
这一章,我们就来聊聊期权高频数据的那些事儿。从Level2行情到Tick级数据,从数据源选择到清洗对齐,我会把我在实战中踩过的坑、总结的经验,一次性讲清楚。
1. 什么是Level2行情?什么是Tick级数据?
先搞清楚这两个概念。很多人把它们混为一谈,其实差别很大。
- Level2行情:也叫逐笔成交行情。它比普通行情多了一个“委托队列”信息。你能看到买一卖一后面挂了多少钱,谁在吃单。对于期权这种流动性分散的品种,Level2几乎是必备的。
- Tick级数据:每一笔成交的记录。时间戳精确到毫秒甚至微秒。包含成交价、成交量、买卖方向等。
我个人习惯把Tick数据看作是“原始素材”,而Level2行情是“加工后的素材”。做高频策略,两者缺一不可。
核心区别:Level2告诉你“谁在排队”,Tick告诉你“谁成交了”。
2. 数据源选择:交易所 vs 数据商
这个问题我当年纠结了很久。直接上交易所,还是买数据商的?
| 对比项 | 交易所直连 | 数据商(如Wind、聚宽、Tushare) |
|---|---|---|
| 数据质量 | 最高,原始数据 | 经过清洗,可能有延迟 |
| 获取成本 | 高,需要专线、硬件、牌照 | 低,API调用即可 |
| 实时性 | 毫秒级 | 秒级甚至分钟级 |
| 历史数据 | 需要自己存 | 一般提供几年历史 |
| 适合场景 | 实盘高频交易 | 回测、研究、低频策略 |
我的建议是:回测阶段用数据商,实盘阶段必须直连交易所。为什么?因为数据商的数据在时间戳上可能已经被“平滑”过了,你回测时觉得能赚钱的策略,实盘时可能根本抢不到单。
避坑指南:我曾经用某数据商的Tick数据回测一个套利策略,年化收益做到30%。结果一上实盘,直接亏了半个月。后来发现,数据商把同一毫秒内的多笔成交合并成了一笔。你想想看,这能一样吗?
3. 数据清洗:高频数据的“脏活累活”
拿到原始数据后,千万别直接扔进策略。高频数据有多脏?我举个例子:
- 时间戳错乱:某笔成交的时间戳比前一笔还早
- 价格异常:出现0元成交、或者价格超出涨跌停板
- 重复数据:同一笔成交被推送了两次
- 缺失数据:某段时间内完全没有成交
清洗步骤,我一般按这个顺序来:
- 去重:按时间戳+成交价+成交量去重
- 排序:按时间戳升序排列
- 过滤异常:剔除价格<=0、成交量<=0的数据
- 补全缺失:对于没有成交的时间段,可以插入空Tick(价格不变,成交量为0)
- 对齐时间戳:将不同合约的Tick数据对齐到同一时间轴
这里我分享一段我常用的清洗代码:
import pandas as pd
def clean_tick_data(df):
# 去重
df = df.drop_duplicates(subset=['timestamp', 'price', 'volume'])
# 排序
df = df.sort_values('timestamp').reset_index(drop=True)
# 过滤异常
df = df[(df['price'] > 0) & (df['volume'] > 0)]
# 补全缺失(假设每100ms一个Tick)
full_index = pd.date_range(start=df['timestamp'].min(),
end=df['timestamp'].max(), freq='100L')
df = df.set_index('timestamp').reindex(full_index, method='ffill')
return df.reset_index()
注意:补全缺失时,用“前向填充”还是“后向填充”,取决于你的策略逻辑。我个人习惯用前向填充,因为高频交易中,最新的成交价最有参考价值。
4. 数据对齐:多合约、多品种的同步难题
期权高频策略往往涉及多个合约。比如做跨式套利,你需要同时看认购和认沽的Tick数据。问题来了:这两个合约的成交时间戳可能完全不对齐。
怎么办?我的做法是:
- 统一时间基准:以交易所的撮合时间戳为准,不要用本地接收时间
- 时间窗口对齐:比如每1ms为一个窗口,将窗口内的所有Tick数据聚合(取最后一条、或取平均)
- 插值法:对于缺失的合约,用线性插值或前向填充
举个例子,假设你有两个合约A和B:
# 对齐到1ms时间窗口
aligned = pd.merge_asof(df_A, df_B, on='timestamp',
tolerance=pd.Timedelta('1ms'),
direction='nearest')
这里用merge_asof是最优雅的方式。它会自动找到时间戳最接近的匹配项。
5. 知识体系框架图
说了这么多,我画一张图帮你理清思路:
6. 一些实战中的小细节
最后,分享几个我踩过的坑:
- 时间戳精度:不同数据源的时间戳精度可能不同。有的精确到毫秒,有的精确到微秒。对齐前一定要统一精度,否则merge_asof会出问题。
- 涨跌停板:期权有涨跌停板,但有些数据商不会标记。你需要自己计算并过滤掉涨停/跌停时的无效数据。
- 合约换月:期权合约到期后,数据会突然中断。记得在清洗时标记出“已到期合约”,不要让它污染你的回测。
一句话总结:数据清洗占高频交易工作量的60%以上。别嫌麻烦,这一步省下的时间,都会在实盘时加倍还给你。
嗯,关于数据获取就聊这么多。记住,没有干净的数据,再牛的策略也是空中楼阁。下一章我们会聊到如何用这些数据构建高频因子,到时候见。