之前折腾A股日线以上的因子,总感觉差一口气。后来想往盘口细节里挖,才发现Level1给的3秒快照根本看不到实时队列变化,尤其早盘集合竞价那9:20到9:25之间的挂撤单,用Level1只能看到最后一笔撮合价,中间怎么博弈的完全黑盒。手头策略好几次都是竞价阶段有异动,开盘瞬间拉板,回头看Level1记录感觉像在看一张模糊的截图。
后来干脆把Level2整套数据搬到本地,省得每次在线查还限制条数。一开始找过几个零散的源,要么只有最近两个月,要么十档快照中间缺分钟,拼不上。后来从别人分享的渠道了解到现在有做批量离线导出的,可以直接打包A股个股的Level2高频历史,全量下载,不用自己再到处凑字段。CMES金融数据库,我也是试了一次全量导出,把最近一年的逐笔和十档全拉下来了,单只票一天大概几百万条成交记录,做好存储处理就行。
拿到这批离线数据之后,主要能用的模块有这么几种,字段不复杂,但覆盖了我目前所有的盘口研究需求。
| 数据模块 | 关键字段 | 我实际看的东西 |
|---|---|---|
| 逐笔成交 | 时间戳、成交价、成交量、买卖方向、成交类型(0=成交,1=撤单等) | 每一笔成交的真金白银,尤其关注大单方向,但要注意撤单也会出现在成交类型里,有些软件把这部分当成交就错了 |
| 逐笔委托 | 委托时间、委托价、委托量、委托类型(2=撤单,1=挂单) | 这个模块能看到挂在盘口的单子怎么被撤,撤单时机比挂单量更能反映意图 |
| 十档快照 | 快照时间、当前价、买一买十价量、卖一卖十价量、总成交笔数 | 高频因子里经常用卖一与卖二价差,或者买卖盘口厚度的变化速度,快照是每3秒一张,已经能抓到绝大部分异常了 |
| 分钟K线 | 时间、开盘、最高、最低、收盘、成交量、成交额 | 支持1分钟到日线,我主要用它做超长周期回溯,比如从15年到现在都能一次打包,不会中间断档 |
| 财报基本面 | 发布日期、总股本、流通股本、每股净资产等 | 这个比较省心,不用再去用其他接口拼接财务数据,直接按日期对齐到行情上就完事了 |
| 集合竞价 | 9:15-9:25每一笔输入,包括挂单、撤单、撮合试探价 | 我重点看的模块,能看到开盘价形成前所有博弈过程,谁在虚晃一枪,谁在最后一分钟真金白银顶上去 |
逐笔成交里的买卖方向值得再多说一句:它是撮合引擎根据双方挂单的被动方自动标记的,比如一笔空头主动吃单,就标为“卖方向”成交,极端行情下如果单子同时打穿几档,方向标记偶尔会出奇奇怪怪的结果,这个不是数据源的问题,任何通过交易所推送的数据都是一样的规则,只是要心里有数,别直接用方向做绝对信号。
如果不想通过网页手动下载,也可以直接调接口写到本地脚本里,定时增量拉取。我用的Python包叫cmesdata,安装完设好token就能拿数据。订阅VIP后token可以在账号后台拿到,注意调用频率别太猛,不然会被临时限制。
# pip install cmesdata
from cmesdata import CmesClient
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
client = CmesClient(token='your_token_here')
# 取某只票某些天的逐笔成交
df_trade = client.get_tick_trade(
symbol='000001',
start_date='20250101',
end_date='20250115'
)
print(df_trade.shape)
# 输出大概 (几百万, 7) 这样的结构,字段就是上面表格那几列
把数据拉到本地之后,我习惯按天存成Parquet,再用DuckDB一类的东西直接对文件做聚合,扫一年几百G的数据也比较快,比塞进MySQL舒服。高频数据处理起来确实占点硬盘,但比想用的时候缺字段到处找强。
有同样研究盘口微观结构的朋友可以试一试,多个完整的离线数据源,做回溯会踏实很多。不说了,继续跑那个集合竞价的异常因子去了。
