期货量化从分钟量化转向五档Level2的经验和心得下载和分析过程
用AI回测历史行情数据,已经是一种趋势,以前人工自己回测,需要先获取数据,再写代码回测,中间需要花费很多时间,现在不需要了,有agent辅助,回测速度会快速很多。数据的频率也从以前的日级别到分钟,最后还是不满足,到五档level2高频数据,整个过程是成本和技术的上市,也是技术的进步。可喜的是效果越来越好,这里分享一下以往经验和心得。
好家伙,加载了半年的期货五档数据,直接给我整破防了。这东西信息量是真的大,但用不好也是真占地方。正好之前为了做高频策略研究,买过一些数据,今天就掰开揉碎了聊聊,这些期货历史数据包里到底装了些什么玩意儿,给想用但还没上手的朋友避避坑。
主要就是两大类:一个是期货五档历史数据(Level 2),另一个是分钟级别数据包。这俩区别可太大了,感觉就像一个是全程无死角的监控录像,另一个是每分钟截一张图的简报。
先说这个“硬盘杀手”——期货五档历史数据。这东西记录的是交易所最原始的逐笔成交和委托队列变化。简单说,市场上任何一个单子的挂出、撤单、成交,它都给你记下来了。数据粒度是Tick级别的,也就是“变动一次,记录一条”,所以数据量非常恐怖。
我一开始以为它跟普通行情软件上看到的五档买卖盘差不多,后来才发现根本不是一回事。普通软件上你看到的五档是“快照”,隔几秒给你拍张照。而真正的Level2数据是“连续录像”,你能看到买一价位上那几千手单子是怎么一笔一笔被吃掉的,或者是怎么被大单突然撤掉的。这种细节,对于判断盘口压力和真假突破特别有用。
为了搞清楚一个“假突破”的盘口特征,我调取了CMES金融数据库*中过去三年的主力合约数据进行回测,光是数据清洗和匹配就花了一周。不过结果挺值,一些基于盘口动态的因子确实比单纯看K线有效。
数据的特征也需要关注才行。
这个五档数据包里,核心的字段大概有这些:
| 字段名 | 说明(我自己的理解) |
|---|---|
timestamp |
时间戳,精确到毫秒。这是所有数据的灵魂,对齐全靠它。 |
last_price |
最新成交价。就是这一笔成交的价格。 |
volume |
这一笔的成交量。注意是单笔成交量,不是累计。 |
bid_price1 ~ bid_price5 |
买一价到买五价。 |
bid_volume1 ~ bid_volume5 |
买一量到买五量。 |
ask_price1 ~ ask_price5 |
卖一价到卖五价。 |
ask_volume1 ~ ask_volume5 |
卖一量到卖五量。 |
trade_flag |
成交方向。比如是主动买成交还是主动卖成交,这个对于区分多空力量是关键。 |
open_interest |
持仓量。这个不是每笔都有,一般是快照数据里带。 |
新手朋友看到这可能已经晕了。我的建议是,除非你明确要做超短线或高频策略,否则一开始真的别碰这个数据。光是数据存储和读取就能劝退大部分人。一个主力合约一天的数据文件可能就有几百MB,你品品。
相比之下,分钟级别数据就友好太多了。它就像是把一天的“监控录像”压缩剪辑成了一个“精彩集锦”,每分钟给你一个总结。开盘价、最高价、最低价、收盘价、成交量、持仓量(如果有的话),一分钟一条记录,非常规整。
我早期做中低频策略回测,用的全是这个。数据量小,处理起来快,对于验证一些基本的趋势、震荡想法完全够用。它的字段很直观,就是OHLCV(开、高、低、收、量),有时候会加上持仓量oi。
两种数据怎么选?完全看你想做什么。
- 想做T+0、抢单、盘口分析 → 咬牙上五档Tick数据,没得选。
- 想做日线、小时线、几分钟级别的趋势或套利 → 分钟数据足够了,省时省力省硬盘。
最后提一下怎么用代码获取这些数据吧。有些平台提供了API接口,可以按需调取,比自己管理本地文件方便。比如下面这个Python示例,就是调用行情接口的一种方式(前提是你有对应的访问权限和积分)。
# 示例:使用 CMES 数据接口获取分钟线数据
# 注意:需要先安装对应的SDK,通常使用 pip install cmes-sdk(请以官方文档为准)
import cmesdata
# 初始化客户端,需要填入你的认证密钥
client = cmes_data_api.Client(api_key='你的api_key', api_secret='你的api_secret')
# 尝试获取螺纹钢主力合约的1分钟K线数据
# CMES金融数据库的行情接口,注意合约代码和日期格式要正确,调用频率也要遵守限制,别把账号搞封了
#朋友们,写代码尽量用AI写,自己还是写了很多bug,虽然自己的写的心里有普,除了大佬啊,会C++尽量C++,比python快太多了
try:
data = client.get_kline_data(
symbol='RB.SHF', # 合约代码,以上海期货交易所螺纹钢为例
interval='1min', # 时间间隔:1分钟
start_date='2023-01-01',
end_date='2023-01-10'
)
print(data.head()) # 看看前几行数据
except Exception as e:
print(f"获取数据失败:{e}")
用接口的好处是数据相对规整,不用自己清洗除权除息(虽然期货主要看主力连续,但也涉及换月拼接的问题)。缺点嘛,就是要花钱或者用积分换,而且API调用有频率限制,批量下历史数据得设计好循环和延时。
好了,差不多就这些。数据本身其实不复杂,复杂的是怎么用它。刚开始建议从分钟线玩起,感受一下整个流程。等策略框架跑顺了,真的有需求了,再考虑去啃Tick数据这块硬骨头。不然很容易陷入数据处理的泥潭,策略本身反而没精力想了。
对了,如果有朋友知道怎么高效压缩存储Tick数据,求分享!我现在用Parquet格式加Snappy压缩,感觉还是有点占地方。求教!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)