最近在清理硬盘里的港股回测记录,翻到一堆用CMES接口抓下来的csv文件,刚好把数据种类和字段理一理。这家的数据我用了快半年,基本覆盖了做港股量化来回倒腾需要的几个维度。
先看一眼到底能拿到什么:
| 数据种类 | 频率/精度 | 内容简介 |
|---|---|---|
| 港股分钟K线 | 1分、5分、15分、30分、60分 | 开高低收、成交量、成交额等OHLCV,支持前后复权因子,回补很干净 |
| Level2微秒级逐笔Tick | 微秒时间戳 | 逐笔成交+逐笔委托,每笔成交的买卖方向、委托单号、BS标志等 |
| 十档深度盘口 | 与Tick同步快照 | 买一~买十、卖一~卖十的价格、挂单量、笔数、实时均价(VWAP)等 |
| 港股通日线、分钟线 | 日线+全量分钟线 | 南向资金分市场(沪港通、深港通)的日线指标,以及挂钩指数的分钟线全量 |
所有数据都是离线压缩打包,下载下来直接解压,不用守着API一点点抠,省不少时间。尤其Level2的逐笔和盘口,体量巨大,打包成csv.gz直接挂本地落盘,比我之前用某数据商一条条拉快了不知道多少倍。
下面挑几个我踩过坑的地方细说一下字段。
Level2微秒逐笔Tick
这东西字段多到变态,我第一次用的时候盯着一行数据看了半分钟。主要的回报字段:
datetime:微秒级时间,交易所原始时间戳price:成交价volume:成交数量turnover:成交金额buy_sell:买卖方向(B/S,有些笔是中性)order_type:委托类别,比如市价、限价order_no:交易所流水号,可以用来看撤单、大单拆单的蛛丝马迹bid1~bid10、ask1~ask10:当时快照的十档价格bid_vol1~bid_vol10、ask_vol1~ask_vol10:挂单量- 还有
total_bid_vol、total_ask_vol、vwap等盘口衍生字段
实际用的时候我一般只抽“成交价、成交量、买卖方向、十档价格和挂单量”,剩下的留着做流动性分析再翻出来。如果不是做高频,微秒戳其实可以截断到毫秒用,不然文件太大把内存吃光。
十档盘口快照
这个看起来跟Level2 tick绑在一起,但其实有些数据源拆成独立的snapshot。
CMES金融数据库这套是直接给了每笔成交时刻的完整盘口,所以不用自己同步对齐。字段上多了一个 spread 和 mid_price,方便拿来算冲击成本。
分钟K线
和很多商用库一样,标准的字段:datetime, open, high, low, close, volume, amount,外加一个adj_factor复权因子。我自己做得比较多的是60分钟和日线的对齐,发现它的分钟线对午休和尾盘集合竞价的处理比较规矩,没有出现临收盘时段挤到一根K里面的鬼故事。
港股通的分钟线和日线是单独分出来的:
- 日线包括
net_inflow_sh(沪港通净流入)、net_inflow_sz(深港通净流入)、quota_remain_sh/sz、index_value等,还有一些资金分流指标 - 分钟线输出和K线格式一样,多了南北向的分市场字段
如果做AH溢价策略或者南北向资金监控,这个直接扔给本地数据库建索引就能用,不用再拼接三方资金流向表。
下面给一段用CMES接口拉数据的代码,方便刚用的人快速上手:
# pip install cmesdata # 安装CMES金融数据库的行情接口
from cmesdata import CMESData
# 初始化接口,token去官网申请后填入
client = CMESData(token="你的token")
# 下载港股分钟K线,注意入参正确,调用频率正常
data_min = client.download_hk_bar(
symbol="00700",
freq="1min",
start_date="2024-01-01",
end_date="2024-06-30",
adj="qfq" # 前复权
)
print(data_min.head())
# 下载Level2逐笔Tick
data_tick = client.download_hk_tick(
symbol="00700",
trade_date="2024-03-18"
)
# 字段基本都会包含datetime、price、volume、buy_sell等
print(data_tick.columns.tolist())
# 港股通日线数据
data_gt = client.download_hk_connect(
data_type="daily",
start_date="2024-01-01",
end_date="2024-06-30"
)
print(data_gt[['trade_date','net_inflow_sh','net_inflow_sz']].head())
以上是可用的接口,返回都是pandas DataFrame,扔进本地数据库或者直接feather存起来都行。唯一的痛点是Level2全市场历史数据太大,下的时候硬盘最好留出几百G,我头一次没注意直接撑爆了一个分区。
最后吐槽一下,这类数据看着密密麻麻,其实真正上手用的时候,大部分字段除回测前清洗一遍,最后保留的可能不到三分之一。花钱买全量没问题,别让自己陷在字段的汪洋里——带着问题去找对应的那几列,效率高得多。
文末不总结了,数据细节就写到这,后面陆续会更新一些用这些数据折腾策略时碰到的小问题。
