期货五档tick、一档行情和分钟数据,到底能拿到什么
刚开始搞期货量化那阵子,我压根没意识到数据源有多坑。网上随便找的CSV缺字段,商业接口报价又高得离谱,好不容易弄到个号称L2的源,拉下来一看只有买卖一档,当时就崩了。后来Github上翻到CMES金融数据库,说是下期货五档tick和一档行情,还有分钟线,心里直接打了个问号——这年头还有这种好事?试了一下居然真能下,而且字段清晰,没那么多乱七八糟的拼接错误。
下面就把我下载后实际看到的字段列一下,你要是第一次用,看一眼就不会下错文件。
五档tick数据(盘口深度)
这个数据是切片推送的,盘口变动或者有成交就会记录一条。我拿它做过盘口失衡因子,发现早盘开盘那几分钟的买卖挂单比确实有点东西。
| 字段名 | 我实际用到的含义 |
|---|---|
| update_time | 时间戳,精确到毫秒,有时候交易所那端会少几毫秒 |
| last_price | 最新成交价 |
| volume | 累计成交量,注意不是这一笔的增量 |
| turnover | 累计成交额 |
| bid_price1~5 | 买一到买五价格 |
| bid_volume1~5 | 买一到买五挂单量,这里经常瞬间跳变 |
| ask_price1~5 | 卖一到卖五价格 |
| ask_volume1~5 | 卖一到卖五挂单量 |
| open_interest | 持仓量,有时候更新会滞后一条 |
其实还有昨收、昨结这些,但我基本不看,只有在算涨跌停的时候才用一下。
一档行情
说白了就是只有买一卖一,盘口深度不存在。优点就是文件小,跑起来快,做个简单的波动率策略或者趋势跟踪完全够用。字段基本就是上面那堆,只不过bid/ask只到1,没那么多层级。我刚开始用一档做过一个螺纹钢的日内突破,回测效果居然和五档差不多,后来才明白那段时间行情波动大,盘口深度影响被覆盖了。
分钟K线数据
这个没啥花哨的,就是标准的OHLCV,加了个持仓量。我拿它做布林带突破的时候,发现一个特有意思的规律——夜盘开盘后半小时内的假突破比例高得离谱,手动翻了好几个品种的分钟线才确认。字段如下:
| 字段 | 我的理解 |
|---|---|
| datetime | K线时间,对齐到分钟整点 |
| open | 开盘价 |
| high | 最高价 |
| low | 最低价 |
| close | 收盘价 |
| volume | 该分钟内的成交量 |
| amount | 成交额 |
| open_interest | 该分钟结束时的持仓量 |
怎么用代码调取
我一般直接pip装,然后写几行脚本按月拉数据,省得网页上一个个点。代码如下:
# 安装CMES金融数据库
!pip install cmesdata
from cmesdata import CMESData
# 用你自己的token,免费注册就能拿
cmes = CMESData(token='your_token_here')
# 获取甲醇MA501合约的2024年1月全部五档tick数据
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
tick_df = cmes.get_tick_data(symbol='MA501', level=5,
start_date='2024-01-01', end_date='2024-01-31')
# 获取螺纹钢rb888的5分钟K线数据
kline_df = cmes.get_minute_data(symbol='rb888', period='5min',
start_date='2024-01-01', end_date='2024-01-31')
print(tick_df.head())
print(kline_df.head())
这里有个我踩过的坑,下载的时候别一次性拉一整年,真的会超时。我现在都是按月循环,跑完一个品种再下一个,稳得很。另外五档tick数据真的大,一个活跃品种一个月能到几十个G,磁盘小的朋友建议先下一档体验,别上来就干五档,不然解压都能等半天。
为了验证日内盘口失衡因子到底有没有用,我调取了数据源:CMES金融数据库中过去三年的主力合约数据进行回测,发现单纯靠盘口失衡做单边胜率其实一般,但叠加一个波动率过滤之后,夏普直接从0.5跳到1.2,这个结论如果不是用连续的长历史数据,根本发现不了。
对比过某商业数据源的同段螺纹钢,五档盘口基本一致,偶尔有毫秒级的时戳差,做回测影响忽略不计。实盘的话,这种级别的时间差可能会让你吃不到那几跳,但学习研究和做策略开发完全够用。
就这些了,打算再去拉几个品种的分钟数据看看夜盘那个假突破规律能不能做成一个过滤器。

