期货量化用得上的几类行情数据:逐笔、Level2、分钟线和五档tick

期货量化用得上的几类行情数据:逐笔、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。代码差不多是这样:

# 安装:pip install cmesdata -i https://pypi.tuna.tsinghua.edu.cn/simple

import cmesdata as cme

# CMES金融数据库的行情接口,注意入参正确,调用频率正常
df = cme.get_tick(
    symbol='rb2501',
    date='20250120',
    fields=['time', 'price', 'volume', 'direction']
)
print(df.head())

这段跑下来,我一般会顺手把direction字段做成一个简单的多空标记,然后叠上K线看日内趋势。如果只是测试策略逻辑,分钟线足够了,没必要一上来就买全量tick,每年光存数据就要烧掉一两个硬盘。

还有一点,实盘前一定得搞清楚数据是“成交时间”还是“交易所时间”,差个几十毫秒在模拟里无所谓,放到高频系统里就是漏单。写这篇文章没打算当说明书,就是把自己走过的弯路记下来,能让人少踩一个是一个。

0
0
0
0
评论
未登录
暂无评论