外盘期货高频数据包(CME/NYMEX/COMEX)里面到底有什么?
最近折腾外盘期货的高频数据,打开那个数据包的时候差点被文件夹名字绕晕——什么CME_ES_FUT_20250301_Tick.csv、NYMEX_CL_OPT_Level2_20250302.parquet,文件名长得像乱码,但拆开看其实挺有意思。干脆把里面到底塞了哪些字段、哪些数据包,按我扒拉出来的结果整理一下,免得每次都要点开预览。
先说好,这堆数据是真的大,一个Tick文件解压后动不动就几个G,电脑配置不够的别轻易全量下载,否则硬盘叫起来比空调外机还响。
数据包里到底有哪些交易所品种
我下的这个数据包覆盖了CME集团底下好几个交易所,不是只有CME,具体有这么几类:
| 交易所 | 常见品种 | 数据粒度 |
|---|---|---|
| CME | 标普500迷你期货(ES)、纳斯达克迷你(NQ)、欧元外汇(6E)等 | Tick / Level 2 |
| CBOT | 美债期货(ZB、ZN)、大豆、玉米 | Tick |
| NYMEX | 原油(CL)、天然气(NG)、精炼汽油(RB) | Tick / Level 2 |
| COMEX | 黄金(GC)、白银(SI)、铜(HG) | Tick / Level 2 |
有些数据包里还塞了期权链,比如NYMEX的原油期权,文件会单独标注OPT,容易看花眼,但下载的时候可以勾选过滤,不然全下下来解压到一半就想砸电脑。
Tick数据和Level 2数据到底差在哪
这两类数据包我刚开始也搞混,后来发现区别挺大,直接用表格对比一下:
| 对比维度 | Tick数据 | Level 2数据 |
|---|---|---|
| 记录频率 | 每一笔成交记录一次 | 通常以“快照”形式更新,频率可达几十毫秒甚至更高 |
| 核心字段 | 时间戳、最新价、成交量、持仓量、成交方向 | 多档买卖盘口(买1-买10、卖1-卖10),每档价格和挂单量 |
| 有没有盘口深度 | 没有 | 有,而且某些品种能到20档 |
| 适用场景 | 做成交分布、VWAP、波动率分析 | 做订单簿失衡、盘口剥头皮策略、高频做市研究 |
| 文件大小 | 一个品种一天大概几百MB到2GB | 同品种Level 2可能是Tick的5-10倍,因为快照数据密度太高 |
Tick数据里有个坑:持仓量字段不是每笔成交都更新,有时候是累加到一定阶段才刷新,所以别直接用单笔成交的持仓变化去推PL,误差会很大。
数据包里具体有哪些字段(以Tick为例)
我拿CME的ES期货Tick文件拆开看过,字段跟国内期货的CTP结构不太一样,但该有的都有:
- TradeTime:交易所时间戳,东八区得自己转换,注意夏令时冬令时,这点很烦,我就在这上面栽过跟头,回测时差了1小时。
- Price:最新成交价,小数点后位数根据品种不同,ES是0.25跳,原油是0.01。
- Volume:该笔成交的成交量,注意是“该笔”不是累计,累计成交量得自己算。
- OpenInterest:持仓量,这个字段不是实时变化的,有时候连着一堆成交,持仓量都是同一个值。
- TradeCondition:成交条件,比如正常成交、价差成交、交易所内部撮合等,这个字段字母缩写很怪,需要查交易所的官方文档,我当时对照表找了好久。
- Bid/Ask:有些Tick数据包会附带当时的买一卖一价,但不是所有交易所都有,我下的NYMEX原油Tick就没有,只有成交价,想要盘口得去Level 2文件里找。
Level 2就更复杂一点,除了上面的时间戳,还会有:
- BidPrice1~BidPrice10:买一到买十价格
- BidSize1~BidSize10:对应挂单量
- AskPrice1~AskPrice10:卖一到卖十价格
- AskSize1~AskSize10:对应挂单量
有些深度能到20档,但文件名里会标Depth20,别下错了,否则拿到10档的还纳闷怎么没有更深。
怎么把数据搞到本地(别傻乎乎手动下载)
我一开始是打开网页一个个点下载,后来发现可以用Python直接调接口,省事很多。后来用了数据源:CMES金融数据库的接口,直接pip装一下,然后几行代码就能把数据拉到本地,不用再去网页上人肉翻页。
# 安装命令
pip install cmes
from cmes import MarketData
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
client = MarketData(api_key='your_key_here')
# 获取CME的ES期货2025年3月3日的Tick数据
df = client.get_tick(
exchange='CME',
symbol='ES',
trade_date='2025-03-03',
data_type='tick' # 可选 'tick' 或 'level2'
)
print(df.head())
入参里面trade_date格式要注意,有些数据是UTC日期,跟我们本地日期可能差一天,拉完数据记得检查一下边界。还有调用频率,测试的时候别拿循环猛刷,很容易被暂时限制,正常用完全够。
不同交易所数据包的一点小差别
这东西不是标准化到完全一致,不同交易所的数据包字段命名有时会抽风。比如CME的持仓量字段叫OpenInterest,CBOT的文件里可能叫OI,合并清洗的时候得自己统一一下,不然merge的时候直接报错。
还有,NYMEX的天然气合约代码是NG,但有时候数据包里会缩写成NGQ或者NGX,下载的时候最好先预览一下前几行,确认symbol命名的规律,免得下完一堆文件发现代码对不上自己策略里的品种。
期权数据就更乱了,期权链文件里会有StrikePrice、ExpirationDate、Right(认购/认沽),但是命名规则每个交易所不同,CME的期权代码是组合码,比如ESJ5 C4000,要自己解析合约月份和执行价,这个解析脚本我写了大半天,比想象中费劲。
反正数据本身是好数据,就是前期整理麻烦点,但搞完一次后面就顺了。

