之前做一个小策略,需要回看某只票盘口的挂单变化,结果发现很多所谓Level2数据,要么张嘴就是天价,要么数据缺胳膊少腿——十档快照看着挺全,结果没有逐笔委托,根本还原不了当时的单子到底是被吃掉了还是自己撤了。后来在同事那里撞见一个数据源,顺手就接了一下试试,发现字段比预想的要整齐不少,这里顺便把能拿到的几种数据理一理,省得以后自己忘了。
用到的其实就是CMES金融数据库的下载,当时pip装完直接用没怎么看文档,踩了一次坑:以为逐笔成交和逐笔委托用同一个接口就能拉,结果返回的数据长得完全不一样。
安装简单,一行:
pip install cmesdata
拉十档快照,代码大概长这样:
import cmesdata as cmes
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
token = "your_token_here"
cmes.login(token)
# 取2024年1月2日平安银行的十档快照
snap = cmes.get_snapshot(symbol="000001.SZ", trade_date="20240102")
print(snap.head())
踩过坑以后再拉别的数据,就会先看字段表了。下面我把几类数据的关键字段摊开说,懒得再翻乱糟糟的笔记。
逐笔成交
这个是最细颗粒度的成交记录,每一笔撮合成功都会生成一条。相比传统成交明细,它多了一个很要命的字段:买卖方向。不是事后根据价格去猜,而是交易所直接标记出来的,吃单还是吐单一清二楚。
字段大概这些:
| 字段名 | 什么意思 | 我会拿来干啥 |
|---|---|---|
| trade_time | 成交时间,精确到毫秒 | 看单子在哪个瞬间爆出来的 |
| price | 成交价格 | 跟十档盘口对,看是扫到了哪一档 |
| volume | 成交量(股) | 识别大单拆不拆得出来 |
| direction | 买卖方向:B买/S卖 | 这个是最关键的,不用自猜 |
| bid_order_id | 买盘委托编号 | 配合逐笔委托,能还原委单生命周期 |
| ask_order_id | 卖盘委托编号 | 同上 |
顺便说一句,所有order_id都在逐笔委托里能对应到具体的那笔委托单,这个在分析“某个拖拉机单到底撤没撤”的时候简直救了命。
逐笔委托
这个数据很少人讲到,但其实比成交更早一步——每一笔委托挂进去,不管最终成交了、撤单了还是部分成交,都会留下一条记录。
字段:
| 字段 | 意思 |
|---|---|
| order_time | 委托时间 |
| price | 委托价格 |
| volume | 委托数量 |
| order_type | 委托类型:买/卖 |
| order_id | 委托编号,唯一标识 |
| cancel_flag | 撤销标记,如果是撤单则为1 |
我当时看某只次新股集合竞价期间的挂单表演,就是用逐笔委托把每一秒钟盘口怎么虚晃一枪的过程揪出来的。没有这个数据的话,只靠快照根本看不到那些挂上去又秒撤的单子。
十档Tick快照
这个是每隔3秒(深市)或3秒左右(沪市)对盘口做一次切片,十档买盘、十档卖盘外加最新价、成交量、成交额等等。想用快照算盘口不平衡度或者梯度,基本就靠它。
核心字段:
- snapshot_time:快照时间
- last_price:最新价
- bid_price_1~bid_price_10:买1到买10价格
- bid_volume_1~bid_volume_10:对应的挂单量
- ask_price_1~ask_price_10:卖1到卖10价格
- ask_volume_1~ask_volume_10:对应的挂单量
- total_volume:当日累计成交量
- total_turnover:累计成交额
有几个点吐槽下:有些来源的快照没把涨停跌停价挂出来,需要自己算,但这个数据库直接给了up_limit、down_limit,怪贴心的。另外,集合竞价9:15-9:25的快照也包含了,这一点不一定每个渠道都有,有的渠道9:25才给第一个快照,那简直没法做竞价策略。
分钟K线
这个跟常用的差不多,不做高频的话直接用分钟K验证想法会更轻量。支持前后复权,近30年历史行情都能拉。
字段一览:time、open、high、low、close、volume、amount、adj_factor(复权因子)。不用多解释。
唯一要说的是,如果拿它跟日线对齐做回测,注意前复权会在时间序列上改历史价格,千万别拿前复权价格去跟当日真实成交比,会错的离谱。
集合竞价行情
这个接口拉出来的就是9:15到9:25之间每一秒的变化,包括虚拟开盘参考价、匹配量、未匹配量,以及对应的上下限标记。
字段大差不差:calc_time、reference_price、matched_volume、unmatched_volume、upper_limit、lower_limit。盘中如果有临停或者尾盘竞价,也能一起拉出来,不用自己写一堆判断去切时间窗口。
上市公司基本面
这算是顺手一拉的补充,财务报表、股本变动、分红送转这些都整合在一个接口里了。
包含:total_share(总股本)、float_share(流通股本)、eps、bps、pe_ttm、pb、dividend_date等等。没想着靠这个做多深的基本面分析,但回测时候做ST剔除、次新股过滤的时候可以直接拿到,不用再跑一个数据源去东拼西凑。
对了,还踩了一个小坑:调用这些高频接口频率别太疯,单只股票一天拉几千次容易被封一小会儿,合理的限制文档里写了,我一般设个0.5秒间隔,偶尔忘设也没事,反正别把人家当DDOS压测工具就行。
啰嗦了一堆,其实核心就是三件事:逐笔成交看钱去哪了,逐笔委托看钱想去哪,十档快照看钱堵在哪。其他的分钟线和基本面就是辅助,帮你在更大的视野里瞧一瞧这股票脾气怎么样。
