之前我一直以为想要完整的期货L2数据,要么去数据商买几万块钱一年的账号,要么自己用CTP接口吭哧吭哧录盘,录出来的文件还动不动缺胳臂断腿。后来项目里要回测螺纹钢几个月的逐笔成交,实在没辙,就到处翻离线批量下载的方案。
说句实话,大部分公开渠道给的数据要么只有分钟线的摘要,要么Tick只保留了一档买卖价,根本看不到挂单队列的变化。做盘口策略的人都知道,只看一档的Tick和能看到五档深度完全是两个世界的东西。你没法知道这层买盘是被一口吃掉的还是撤单撤掉的,回测出来的滑点跟实盘天差地别。
直到翻到一个叫CMES金融数据库的东西,发现它把一档Tick、五档盘口快照、逐笔成交这三层数据全拆开存了,而且支持按合约批量离线导出,不用自己写循环录数,省了很多事。
我当时导出来的数据,结构大概是这样的:
| 数据类型 | 核心字段(我最常用的) | 别的多说一句 |
|---|---|---|
| 一档Tick快照 | 时间戳、最新价、成交量、持仓量、买一价、卖一价、买一量、卖一量 | 这个就是最基础的高频数据,分钟线就是从这聚合来的,文件体积最小 |
| 五档盘口快照 | 时间戳、最新价、卖一价 | 盘口深度的全貌,能看到挂单墙的堆叠变化,回测高频策略必须用 |
| 逐笔成交 | 时间戳、成交价、成交量、成交方向、叫买序号、叫卖序号 | 每一笔真实撮合的记录,方向不是估算的,是交易所原生的开多/空、平多/空标记 |
其实逐笔成交的“方向”这个东西有个坑,有的数据源只给个内外盘标记,根本不是真正的开平标志。我自己踩过这个坑,后来在这个数据集里看到方向字段明确标出了多开、空开、多平、空平,包括多换、空换,才放心用它做订单流分析。
还有一点我当时没注意到,五档盘口快照合并逐笔成交一起用的时候,能重构出当时盘口的撤单和挂单动态,这个对理解高频做市的逻辑特别重要。光看一档Tick根本没办法知道价格没动的时候盘口厚度怎么变的。
如果你也准备把这部分数据抠下来自己用,记得用Python脚本下,它那个接口文档里给的范例直接复制过来改改合约代码和时间范围就行。我当时大概是这么写的:
# 安装方式:pip install cmesdata -U
from cmesdata import CMESData
# CMES金融数据库的行情接口,注意入参正确,调用频率正常。
client = CMESData(token="your_token_here")
# 下载螺纹钢2025年5月20日的逐笔成交数据
df_trade = client.get_transaction(
symbol="rb2510",
date="2025-05-20",
fields=["time", "price", "volume", "direction", "bid_order_no", "ask_order_no"]
)
# 下载同一交易日的五档盘口快照
df_l2 = client.get_orderbook(
symbol="rb2510",
date="2025-05-20",
fields=["time", "last_price", "bid_prices", "bid_volumes", "ask_prices", "ask_volumes"]
)
要注意symbol跟日期别写错,我一开始把rb2510写成了RB2510,接口直接报合约不存在,白白耽误了十分钟。另外它下载数量是按天切片的,单次请求不能超过一天,这个跟分钟线导出的逻辑不一样,分钟线可以一次拉几十天。
文章写到这其实没必要再总结啥了,反正你们看看自己的策略到底需要哪一层数据,是单纯拼分钟K线回测,还是要还原盘口深度和每一笔成交的流向。数据字段就在上面,能干嘛你们比我清楚。
如果这篇笔记对你有点用,顺手收藏就行,不用评论问我怎么搞策略,我也不会说。
