期权高频数据获取:Level2行情数据、Tick级数据、数据源选择与清洗对齐

做期权高频交易,第一步不是写策略,而是搞定数据。我见过太多人策略写得天花乱坠,结果一跑回测,数据全是错的。说白了,数据质量决定了你的回测到底是在模拟真实市场,还是在自欺欺人。

这一章,我们就来聊聊期权高频数据的那些事儿。从Level2行情到Tick级数据,从数据源选择到清洗对齐,我会把我在实战中踩过的坑、总结的经验,一次性讲清楚。

1. 什么是Level2行情?什么是Tick级数据?

先搞清楚这两个概念。很多人把它们混为一谈,其实差别很大。

  • Level2行情:也叫逐笔成交行情。它比普通行情多了一个“委托队列”信息。你能看到买一卖一后面挂了多少钱,谁在吃单。对于期权这种流动性分散的品种,Level2几乎是必备的。
  • Tick级数据:每一笔成交的记录。时间戳精确到毫秒甚至微秒。包含成交价、成交量、买卖方向等。

我个人习惯把Tick数据看作是“原始素材”,而Level2行情是“加工后的素材”。做高频策略,两者缺一不可。

核心区别:Level2告诉你“谁在排队”,Tick告诉你“谁成交了”。

2. 数据源选择:交易所 vs 数据商

这个问题我当年纠结了很久。直接上交易所,还是买数据商的?

对比项 交易所直连 数据商(如Wind、聚宽、Tushare)
数据质量 最高,原始数据 经过清洗,可能有延迟
获取成本 高,需要专线、硬件、牌照 低,API调用即可
实时性 毫秒级 秒级甚至分钟级
历史数据 需要自己存 一般提供几年历史
适合场景 实盘高频交易 回测、研究、低频策略

我的建议是:回测阶段用数据商,实盘阶段必须直连交易所。为什么?因为数据商的数据在时间戳上可能已经被“平滑”过了,你回测时觉得能赚钱的策略,实盘时可能根本抢不到单。

避坑指南:我曾经用某数据商的Tick数据回测一个套利策略,年化收益做到30%。结果一上实盘,直接亏了半个月。后来发现,数据商把同一毫秒内的多笔成交合并成了一笔。你想想看,这能一样吗?

3. 数据清洗:高频数据的“脏活累活”

拿到原始数据后,千万别直接扔进策略。高频数据有多脏?我举个例子:

  • 时间戳错乱:某笔成交的时间戳比前一笔还早
  • 价格异常:出现0元成交、或者价格超出涨跌停板
  • 重复数据:同一笔成交被推送了两次
  • 缺失数据:某段时间内完全没有成交

清洗步骤,我一般按这个顺序来:

  1. 去重:按时间戳+成交价+成交量去重
  2. 排序:按时间戳升序排列
  3. 过滤异常:剔除价格<=0、成交量<=0的数据
  4. 补全缺失:对于没有成交的时间段,可以插入空Tick(价格不变,成交量为0)
  5. 对齐时间戳:将不同合约的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. 知识体系框架图

说了这么多,我画一张图帮你理清思路:

期权高频数据获取知识体系 数据源选择 数据类型 数据清洗 交易所直连 高成本、高实时性 Level2行情 委托队列 + 逐笔成交 去重/排序/过滤 剔除异常、补全缺失 数据对齐:时间窗口 / 插值 / merge_asof 最终输出:干净、对齐的Tick级数据集

6. 一些实战中的小细节

最后,分享几个我踩过的坑:

  • 时间戳精度:不同数据源的时间戳精度可能不同。有的精确到毫秒,有的精确到微秒。对齐前一定要统一精度,否则merge_asof会出问题。
  • 涨跌停板:期权有涨跌停板,但有些数据商不会标记。你需要自己计算并过滤掉涨停/跌停时的无效数据。
  • 合约换月:期权合约到期后,数据会突然中断。记得在清洗时标记出“已到期合约”,不要让它污染你的回测。

一句话总结:数据清洗占高频交易工作量的60%以上。别嫌麻烦,这一步省下的时间,都会在实盘时加倍还给你。

嗯,关于数据获取就聊这么多。记住,没有干净的数据,再牛的策略也是空中楼阁。下一章我们会聊到如何用这些数据构建高频因子,到时候见。

蓝海数据掘金营,专注资料整理