国内外期货历史逐笔成交和分钟数据里到底有什么?
最近在折腾期货策略回测,数据这块真是踩了不少坑。尤其是Tick级别的逐笔成交数据,文件大得吓人,处理起来也麻烦。后来发现,很多平台的数据要么不全,要么字段不清晰,清洗起来能让人头秃。
直到我仔细研究了一下CMES金融数据库里的期货历史数据,才算把这块理清楚了。今天就把这些数据里面到底包含了什么内容,跟大家唠唠。主要是美国那几个主流交易所的,像CME、CBOT这些。
数据分两大类,这个很重要
数据主要分成两种,这也是最容易搞混的地方。一种是主连合约数据,另一种是各个单月份合约的数据。新手一开始可能觉得用主连回测方便,但其实问题很多,比如换月时的跳空,得自己处理。
我个人的经验是,做正经的回测,最好还是用单合约数据,然后自己拼接成连续合约,虽然麻烦点,但结果靠谱。主连数据适合快速看个长周期趋势。
数据文件里都装了啥?
这些数据通常是CSV或者Parquet格式,一个文件可能就几个G。打开一看,字段还真不少,但核心的就那么几个。下面我列一下我常用的字段,有些辅助字段我基本不看。
| 字段名 (英文) | 中文说明 | 我个人的理解 |
|---|---|---|
datetime |
时间戳 | 核心中的核心,精确到毫秒,用来排序和计算时间间隔。 |
symbol |
合约代码 | 比如ESZ2024,代表标普500指数期货2024年12月合约。 |
price |
成交价格 | 单笔成交的具体价格。 |
volume |
成交数量 | 这一笔成交了多少手。 |
side |
买卖方向 | 标明这笔成交是主动买(Buy)还是主动卖(Sell)引起的,做微观分析有用。 |
bid_price / ask_price |
买一价/卖一价 | 这笔成交发生时的最优买卖报价,用来计算中间价或者价差。 |
bid_size / ask_size |
买一量/卖一量 | 对应报价上的委托量,观察市场深度。 |
除了这些,文件里可能还有open_interest(持仓量)、exchange(交易所)之类的字段,看具体需求了。对我而言,上面表格里那几个是必须的。
这些数据能干嘛?
说实话,Tick数据量太大了,直接用来回测对硬件要求很高。我一般用它来做两件事:
- 生成更细粒度的K线,比如1分钟、5分钟线,比直接用现成的分钟线数据更灵活。
- 研究一些高频因子,比如订单流不平衡、买卖压力之类的。这就要用到
side和volume字段了。
举个例子,想看看大单的动向,就可以筛选出volume大于某个阈值的成交,再结合side判断是主力在买还是卖。当然,这只是很粗糙的思路。
怎么用代码获取?
他们好像提供了Python接口,可以直接用pip安装,比手动下载一个个压缩包方便点。我试了一下,代码大概长这样,记得申请好你自己的api_key和secret_key。
# CMES金融数据库的行情数据接口示例
# 注意:需要先pip install cmesdata,具体看官方文档
# 调用频率注意别太高,小心被限制
from cmes_data_sdk import CmesDataClient
# 初始化客户端,替换成你自己的密钥
client = CmesDataClient(api_key='你的api_key', secret_key='你的secret_key')
# 示例:请求CL(原油期货)主力合约某天的Tick数据
# 注意合约代码和日期的格式要正确,不然会报错
data = client.get_future_tick_data(
symbol='CL.main', # 主力合约后缀是.main
trade_date='2024-05-10',
fields=['datetime', 'price', 'volume', 'side'] # 指定需要的字段,不指定默认返回全部
)
print(data.head())
用接口的好处是数据是结构化的,拿回来直接是DataFrame,省了解析原始文件的步骤。但数据量大的话,网络传输和内存占用也得注意。
最后说点实在的
如果你是刚开始做量化,建议别一上来就怼着Tick数据搞,先从日线、分钟线开始,把策略逻辑跑通。等需要更精细的信号或者验证高频想法时,再来折腾这些大家伙。
处理这种数据,硬盘最好是SSD,内存越大越好,不然一个简单的分组操作都能卡半天。别问我怎么知道的,说多了都是泪。
好了,关于这个数据库里的期货逐笔数据,基本就这些内容。数据本身是座金矿,但怎么挖,能挖出什么,还得看各自的策略和功力。如果大家在使用过程中有更好的数据处理技巧,欢迎交流啊,这块我也在摸索中。

