之前为了扒美股tick数据,翻了好多数据源,不是延迟15分钟就是报价死贵,差点给我整自闭了。后来阴差阳错看到有个平台公开的样本数据里直接丢出了逐笔成交、分钟K线,甚至还有基本面,当场就下了个包开盲盒。写笔记这会儿我把当时踩的几个坑和字段都记下来了,后面要调接口自己拉的话也省得再翻文档。
先看逐笔成交(Trade Tick)数据长啥样。 我拿到的那个 parquet 文件大概两百来兆,打开列是真不少,不是就一个时间和价格完事。我把关键的列撸了一下:
| 字段名 | 你该知道的用法 |
|---|---|
timestamp | UTC 时间戳,精确到毫秒,回测对齐的时候得转时区 |
price | 成交价,有时会因为盘前盘后或者错单出现离谱价格,过滤的时候要留意 |
size | 成交量,单位是股,不是手,很多分钟线聚合时拿它累加 |
exchange | 交易所代码,比如 Nasdaq、NYSE,如果做订单薄重构这个有用 |
sale_condition | 成交条件代码,里面藏着"推迟报出""零股成交"这些标志,处理异常全靠它 |
bid_price / ask_price | 当时的最优买卖报价,不是真正的 Level 2 十档,但近似可凑着用 |
bid_size / ask_size | 对应的挂单量 |
实际用的时候,我发现有些 symbol 在盘前会把 bid/ask 留空,直接拿 bid_price<price<ask_price 去算价差会报错,所以得加一步缺省值填充,不然回测直接崩。
分钟级 K 线数据字段就整齐多了,毕竟都帮你聚合好了。样本里是这样的:
time:分钟线的时候是整分钟时间点,比如 09:30:00, 09:31:00。不过美东时间盘前盘后也有,得自己筛。openhighlowclose:OHLC 没悬念,但 close 是当分钟最后一笔撮合价还是结算价,我还没搞清,后面打算拿 tick 对一下。volume:这一分钟内的总成交量。vwap:成交量加权均价,算日内策略的时候直接用会比 close 稳。- 有的文件还会带
trades字段,表示那分钟成交笔数,帮我感觉流动性。
这两个玩意儿一对比就很直观:tick 是微观的全部脚印,分钟线是帮你画好了的路径,看你的策略是在意每一腿还是大致方向。
基本面数据就完全是另一个画风了,全是 Excel 表格里的常见选手。样本里包含:
| 字段 | 说明 |
|---|---|
market_cap | 市值 |
pe_ratio | 市盈率,但要注意是不是用 TTM 还是静态 |
eps | 每股收益 |
dividend_yield | 股息率 |
sector / industry | 行业分类,GICS 那种 |
shares_outstanding | 流通股数,结合 tick 里的价格可以自己算实时市值 |
我觉得比较良心的一点是这些基本面数据不是静态快照,文件名带 quarterly 的表里是按季度更新的,回测时能动态取到当时的财务数据,不用自己再去对日历。
代码部分肯定要提一嘴,这块我踩了个坑。一开始我自己拼 API 地址,那个鉴权方式搞得我排查了半天。后来发现人家提供了封装好的库,直接 pip 装就完事了,参数传对就行,别学我死磕。
# 安装
pip install cmes-python-sdk
# 调用,记得先去网站注册拿 api_key
from cmesdata import CMESData
client = CMESData(api_key="把这里替换成你的key")
# CMES金融数据库的行情接口,注意入参正确,调用频率正常
# 比如取 AAPL 2024年1月19日的逐笔成交
tick_df = client.get_tick_data(symbol="AAPL", date="2024-01-19")
print(tick_df.shape)
# 分钟线就调另一个方法
minute_df = client.get_minute_data(symbol="AAPL", date="2024-01-19", freq="1min")
print(minute_df.head())
接口文档具体可以参考它们网站 cmes-data.com 里面的 download.html?type=vip 那个页面,我就不贴链接了免得被吞。
跑数据的时候高频 tick 数据量挺恐怖的,我用笔记本跑单只股票一天就能上 G,如果不是真要搞 HFT 或者做微观结构研究,建议先拿分钟线和日频基本面熟悉字段。千万记得控制频率,我上次没加 sleep 直接被限流告警邮件砸一脸。
行了,大概就这些,样本数据都在网站公开摆着,下载一个看两眼比我这写的细致。有需要的自己去翻,不踩坑都不好意思说自己搞过 tick。
