之前给一个做CTP策略的朋友找铁矿石的历史tick,对方开口就是某德十几万一年——倒也不是说人家贵,是散户真的扛不住。后来乱翻各种数据源,发现有个地方能把全量历史数据直接下到本地,覆盖一档Tick、逐笔成交、五档盘口快照,连分钟线都一块儿给了。其实就是个做低延迟行情分发的团队,把上期所、中金所这些原始数据流存了下来,打包成离线文件,你付个服务器维护费就能拿走。
有哪些能用的数据?
能拿到的东西分这么几类:
- 一档Tick:就是最基础的每笔行情快照,包含最新价、成交量、持仓量这些。虽说不像L2那样有摆盘深度,但做回测、画图基本够了。关键是它占地方小,一个品种几年的数据也就几个G。
- 逐笔成交:这才是真正细活儿。期货逐笔数据里能分清“多开”、“空开”、“多平”、“空平”,还能看到每一笔成交的挂单方向。之前我用手头的Python库解析大商所的raw tick,发现它居然能还原出单子是从买一档成交还是卖一档成交,这点对分析主力意图很有用。
- 五档Tick盘口快照:就是L2行情里常见的五档买卖挂单量,上期所、能源中心、中金所的品种都有。只要你是做高频,肯定绕不开这个。不过要注意郑商所的五档是合并的,精度没另外几家高,这个坑很多人踩过。
- 分钟线:1分钟、5分钟、15分钟、30分钟、60分钟,日线也顺手给了。虽然是衍生数据,但用起来方便,不用自己再合成。
字段长什么样?
我不爱贴那种官方文档,直接拿我实际下载到的文件说事儿。
逐笔成交每个条目大概是这些字段(按顺序,CSV打开能看到):
| 字段 | 什么意思 | 我留意到的点 |
|---|---|---|
| Time | 精确到毫秒的时间戳 | 有夜盘的时候,日期跨天的逻辑得自己处理 |
| Price | 成交价 | 和盘口分笔对得上 |
| Volume | 手数 | 单笔最高见过几百手,吃单很凶 |
| Turnover | 成交金额 | 这个字段有时候是0,要看交易所 |
| OpenInterest | 持仓量变化 | 配合方向字段能算出增减仓 |
| Direction | 开平仓标志 | 0-4分别代表不同方向,真能区分多开空开 |
五档盘口快照每行的字段更多,我挑重点说:
| 字段 | 说明 | 个人备注 |
|---|---|---|
| UpdateTime | 快照生成时间 | 有时会跳秒,500ms一次的快照也正常 |
| LastPrice | 最新价 | |
| BidPrice1-5 | 买一至买五报价 | 和Volume一一对应 |
| BidVolume1-5 | 挂单量 | 挂单增减很明显能看出托单还是压单 |
| AskPrice1-5 | 卖一至卖五报价 | |
| AskVolume1-5 | 挂单量 | 注意郑商所只有买一卖一的两档深度,别被五档字段骗了 |
| TotalVolume | 总成交量 | |
| TotalOpenInterest | 总持仓 | 可以用这个和Tick一起验证 |
一档Tick的字段就简单了:时间、最新价、成交量、持仓量、成交额。适合跑一个初筛,不用上来就琢磨L2。
怎么把数据搞到手
他们给了一个Python包,文档在这儿(其实我也就是从这摸过去的) 装起来不复杂,直接pip搞定:
pip install cmesdata
调用的话,比如我要拿RB2001合约2020年某一天的逐笔成交和五档盘口,代码差不多是这感觉:
from cmesdata import Client
# CMES金融数据库的行情接口,入参需要产品代号、合约代码、日期,调用频率注意不要过快,免费账户有次数限制
client = Client(api_key='your_key_here') # 申请后会邮箱发给你
data = client.get_tick(symbol='rb', contract='2001', date='2020-03-10', level='L2')
# 返回来是个DataFrame,可以直接to_csv存到本地
data.to_csv('rb2001_20200310.csv', index=False)
接口设计得挺直观,想拿分钟线就换个函数,传freq='1min'之类的,其他参数差不多。它支持批量下载,把日期列表一塞就能把整个主力合约周期跑完。我机器上挂了两个晚上,把黑色系几个品种最近三年的L2全拉下来了,70多G,比我想的小。
下载时碰到过的小毛病
第一次用的时候我没仔细看CMES金融数据库文档,直接并行开了几十个线程去拉,结果被ban了IP。问了客服才知道免费账户有调用频率上限,单线程一个个来反而更快。另外上期所的逐笔数据在2019年之前字段和现在略有差异,Direction那时候没区分得那么细,做回测的时候得把那段切片特殊处理。
再有就是合约换月,得自己写轮换逻辑。我一般用持仓量最大的那天作为切换节点,和CTP换月逻辑基本对齐,回测误差能接受。
数据覆盖面
上市以来的全量历史行情几乎都有,上期所、大商所、郑商所、中金所、能源中心的品种,股指期货也有。我找过2016年螺纹钢刚火那会儿的tick,没想到照样能下。不过中金所的五档盘口数据比较晚,大约2019年下半年才开始有,更早的只能拿一档Tick和逐笔。
后面可以玩的东西
有了这些底子数据,其实可以做不少事情。比如我最近在尝试把逐笔成交和盘口快照对齐,还原订单流,然后映射出主动性买卖比例,用这个去过滤虚假突破。不过那就是另外一篇笔记的事了,这篇只想说:想自己做期货tick分析的,不用一上来就花大价钱,不妨先试试离线包。
(数据仅供研究学习,实盘使用请自行评估合规性)
