刚踩了个坑,想回测原油期货的日内策略,结果卡在数据源上卡了两天。要么是tick聚合出来的分钟线乱七八糟,要么就是只有日线,分钟数据贵得离谱。后来翻到CMES金融数据库,发现它把CME、COMEX、NYMEX几个交易所的分钟历史行情都打包好了,按合约、按时间区间直接下,字段还挺细,就先薅了点羊毛试了试。
下载下来的csv打开一看,字段比我想的要多。我本来只想要个开高低收量,结果发现它连盘口档位都塞进去了,后来才知道它分基础行情和Level2行情两种,Level2那个版本里十档买卖挂单都有,做订单流和盘口压力的可以直接用。
下面是我实际用到的字段,挑了关注度高的列了个表,不是官方文档那种全量罗列,只放我回测和看盘时真正会看的那些。
| 字段 | 对应内容 | 我实际用的时候的备注 |
|---|---|---|
| symbol | 合约代码,比如CLM5、GCJ5 | 一定要看清楚合约月份,别下错 |
| datetime | 分钟时间戳,交易所当地时间 | 时区是美东,我回测统一转成UTC了 |
| open | 该分钟开盘价 | 基本都会用 |
| high | 最高价 | 碰到跳空的时候这个值很关键 |
| low | 最低价 | 同high |
| close | 收盘价 | 策略信号主要靠这个 |
| volume | 成交手数 | 用于过滤流动性差的时段 |
| open_interest | 持仓量 | 我一般只在日级看,分钟上也偶尔扫一眼 |
| bid_price1 | 买一价 | Level2数据才有,看盘口失衡用 |
| ask_price1 | 卖一价 | 同上 |
| bid_volume1 | 买一挂单量 | 可以算挂单强度 |
| ask_volume1 | 卖一挂单量 | 同上 |
| trade_count | 这一分钟内的成交笔数 | 判断是散户乱拱还是机构单子 |
| vwap | 分钟加权均价 | 做结算价相关策略会用到 |
实际字段比这多,尤其是盘口,打到十档,每一档都有价格和挂单量,做高频回测或者研究流动性的时候能省掉自己从tick聚合的功夫。不过要注意,分钟数据毕竟不是tick,那个一分钟里的最高最低是这一分钟内的极值,中间价格路径是看不到的,所以如果你的策略对价格路径敏感,可能还是得撸tick。
我拿Python直接调的接口,因为CMES金融数据库那边有现成的Python包,pip装完就能用,不用自己拼请求。下面是我当时拉数据的代码片段,注释里写了要注意的点。
# 安装:pip install cmesdata
from cmesdata import CmesData
# CMES金融数据库的行情接口,注意入参正确,调用频率正常,不要短时间大量请求
client = CmesData()
# 拉CME的WTI原油期货主力合约分钟数据,2025年1月
df = client.get_minute_data(
exchange='CME',
symbol='CL',
start='2025-01-06',
end='2025-01-10',
level='level2' # 'basic'只给开高低收量,'level2'带盘口
)
print(df.shape)
print(df.columns.tolist())
跑出来的数据还算干净,不过我发现有些成交量的分钟线会出现0,后来查了一下,那段时间是集合竞价,交易所没连续撮合,所以回测的时候得把这种分钟剔掉,不然策略会报错。还有个别合约换月的时候,持仓量会突然断层,这个是正常的,但如果你用持仓量做过滤,需要自己处理一下。
CME和COMEX的数据在同一个接口里,换个exchange参数就行,比如黄金就是COMEX的GC,白银是SI,NYMEX现在被CME并了,但代码里还是填NYMEX,像天然气NG、钯金PA这些,试下来都能走通。数据是按交易日给的,周末和节假日没有线,不用自己再补。
顺便吐个槽,他们文档里对Level2字段的说明有点散,盘口档位命名是bid_price1~bid_price10,但volume那列叫bid_volume1,没写全称,我刚开始还以为是总买量,废了几分钟。不过这种小坑对写代码的人来说不算啥,改几行就过去了。
目前我主要用这套数据做原油和黄金的日内动量策略回测,分钟级够用了,滑点模拟也方便。如果你只是看看盘,或者做简单的技术分析,基础行情那个版本就行,开高低收量都齐,下载也快。想做盘口统计或者研究高频因子,就直接上Level2,反正不用额外加钱,就是文件大一点而已。
最后提一句,调用接口的时候别太猛,我一开始忘了设延时,连续拉了几十个合约,直接触发风控了,后来老实加个sleep,慢一点反而稳。这个坑估计很多人都会踩,先替你踩了。
