期货量化用得上的几类行情数据:逐笔、Level2、分钟线和五档tick
刚入坑期货量化的时候,我属于那种上来就怼模型的人,结果被行情数据格式搞到一头包。同一品种,同样是"tick数据",不同来源给的东西完全不是一个维度------有的只能看盘口快照,有的把每一笔成交都摊出来,偏偏说明书又写得跟天书一样。后来做跨品种套利时踩了几个坑,顺带把这几种数据的关系理了一遍,如果再有人问我,我大概只会丢这个笔记过去。
先说逐笔成交数据。这玩意就是最底层的流水,交易所撮合了多少钱、以什么价格、多开还是空平,都一笔笔记下来。我自己处理的时候发现,它并不是每秒推送一次,而是只要有成交就会生成一条记录。常见字段有:
- 成交时间(毫秒级)
- 成交价格
- 成交量(手)
- 增仓方向(多开、空开、双开、多平、空平、双平等)
- 成交性质标记(比如是否是主动买)
这东西最大的好处是可以做主力资金方向的推演。我不太信那些把挂单撤单算进去的"主力动能",但用纯逐笔累加的大单净额,放在螺纹这种品种上,跟着日内方向拿一小时,胜率确实比原地拍脑袋高。唯一烦的是数据量,一天下来几百万条,千万别用Excel打开,会死得很难看。
Level2行情数据就完全不是一个逻辑了。它是交易所定时发的快照,期货这边一般是500ms一次,不像股票有3秒间隔。字段里面包括了大家最关心的五档买卖:
- 卖一价、卖一量
- 买一价、买一量
- ... 一直到卖五、买五
- 最新价、昨收、持仓量、成交量
但注意了,这个是切片,不是逐笔。所以你不能拿它去精确推演"这一口单子把挂单吃掉了多少"------你看到的只是两个快照之间的变化。我有次用Level2去算盘口深度失衡度,结果回测美如画,实盘一堆滑点,就是亏在500ms的延迟上。别把它当高频数据用,策略频率高于1秒的,还是老老实实搞tick流。
分钟线反而是最老实的。开、高、低、收、成交量、持仓量,时间戳按分钟对齐。因为基础,所以出错的概率也小。我做主连复权的时候会额外补一个字段"是否换月",不然回测曲线能离谱到怀疑人生。CMES金融数据库上的分钟线我拉下来和自己算的对比过,准确度没问题,主力连续也有优化处理,省得自己写一坨代码去拼接。
五档tick行情数据在很多平台上叫"tick快照",其实跟Level2是同一类。只不过有的供应商把它扩展成每一次盘口变动就推一次,甚至是每一笔成交都带着五档一起推,比标准Level2的500ms切片密得多。字段跟Level2一样的,只是时间粒度更细。拿来构建高频因子或者训练订单簿模型会舒服一点,但磁盘占用量也爆炸,一个活跃品种一天能有好几个G。
下面这个表格是我自己干活时常用的对比,不一定严谨,但至少能提醒自己该买什么层级的数据,不花冤枉钱。
| 数据类型 | 核心字段 | 适合干嘛 | 我要吐槽的 |
|---|---|---|---|
| 逐笔成交 | 时间戳、价、量、开平方向 | 主力资金流向、大单拆解 | 文件巨大,需要过滤无效单 |
| Level2快照 | 五档价量、最新价、持仓量 | 盘口策略、挂单分析 | 容易和高频tick混淆,慎入 |
| 分钟K线 | OHLC+成交量、持仓量 | 中低频CTA、K线形态 | 主连换月处理不好就是坑 |
| 五档tick | 同Level2,但更新更密 | 高频因子、订单簿微观结构 | 存储贵,得自己写降采样 |
说一个省事的办法。之前我都是走网页批量下载csv再导进数据库,光读取那天就跑了大半天。后来发现可以用一行pip装个库,跟他们服务器直连拉数据,几秒就把行情推到DataFrame。代码差不多是这样:
python
import cmesdata as cme
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
df = cme.get_tick(
symbol='rb2501',
date='20250120',
fields=['time', 'price', 'volume', 'direction']
)
print(df.head())
这段跑下来,我一般会顺手把direction字段做成一个简单的多空标记,然后叠上K线看日内趋势。如果只是测试策略逻辑,分钟线足够了,没必要一上来就买全量tick,每年光存数据就要烧掉一两个硬盘。
还有一点,实盘前一定得搞清楚数据是"成交时间"还是"交易所时间",差个几十毫秒在模拟里无所谓,放到高频系统里就是漏单。写这篇文章没打算当说明书,就是把自己走过的弯路记下来,能让人少踩一个是一个。