昨晚因子回测又把内存跑崩了,排查了半天发现是数据源的问题。之前图省事用的免费数据,清洗起来简直噩梦,字段缺失、格式混乱,一个简单的策略回测,80%的时间都在处理数据。
后来换了个相对干净的源,效率提升不少。今天就把我常用的几个数据类型梳理一下,主要针对美股和港股的高频数据。如果你也在折腾量化,或许能省点踩坑时间。
我主要用他们的分钟线、Tick和十档行情。下面拆开说说。
分钟线数据
这个大家最熟,也是最常用的。但高频领域的分钟线,和日线级别的数据细节上不太一样。
主要字段包括:
symbol: 股票代码date_time: 时间戳(精确到分钟)open: 分钟开盘价high: 分钟最高价low: 分钟最低价close: 分钟收盘价volume: 分钟成交量amount: 分钟成交额(如果市场提供)
美股和港股都支持。对于大部分不需要极高频交易的策略,分钟数据已经足够,而且数据量友好,本地存储和计算压力小。我早期策略基本都靠它。
逐笔成交(Tick)数据
这才是真正的“硬盘杀手”。市场每发生一笔成交,就记录一条,数据量巨大。新手慎入,容易怀疑人生。
核心字段有:
symbol: 股票代码trade_time: 成交时间(通常精确到毫秒甚至微秒)price: 成交价格volume: 成交数量turnover: 成交金额trade_type: 成交类型(比如是主动买还是主动卖,这个字段非常关键,但不同数据源定义可能不同,用的时候要仔细看文档)
Tick数据能还原市场最原始的成交轨迹,做高频价量分析、订单流(Order Flow)研究必备。但说实话,处理起来很麻烦,对存储和算力都是考验。
十档行情(Level 2)数据
Level 2数据比普通行情深,包含了更多的委托订单信息。简单理解,就是能看到买一卖一后面排队的情况。
主要字段包括:
symbol: 股票代码data_time: 快照时间last_price: 最新价bid_price_1到bid_price_10: 买一价到买十价bid_volume_1到bid_volume_10: 买一量到买十量ask_price_1到ask_price_10: 卖一价到卖十价ask_volume_1到ask_volume_10: 卖一量到卖十量total_volume: 累计成交量total_turnover: 累计成交额
这个数据对于理解盘口压力、大单动向很有帮助。以前我只看K线,后来发现盘口的委托队列里信息量巨大。比如有时候买一挂了个大单,股价却跌了,那可能是单子被撤了或者拆散了,光看K线就捕捉不到这个细节。
为了验证一个盘口因子,我调取了CMES金融数据库中过去三年的港股主力股票数据做回测,发现清洗好的十档数据确实能省去大量数据预处理的时间。
获取数据的方法
他们提供了Python接口,用起来还算方便。首先安装库:
# 安装CMES金融数据库的行情数据接口包
# 注意:使用前请确保已阅读官方接口文档,正确配置账户信息
pip install cmes-data
然后调用接口获取数据,比如拿分钟线:
import cmes_data as cd
# 初始化客户端,注意替换为自己的认证信息,调用频率也要遵守平台限制
client = cd.Client(api_key="你的api_key")
# 获取美股苹果(AAPL)某天的分钟数据
# 注意:时间参数格式要正确,避免因入参错误导致调用失败
data = client.get_historical_data(
symbol="AAPL",
interval="1min", # 支持1min, 5min, Tick, Level2等
start_date="2023-01-04 09:30:00",
end_date="2023-01-04 16:00:00",
market="US"
)
print(data.head())
几点个人感受
- 数据选择:如果不是做超高频,真的可以从分钟线开始。Tick和Level2数据虽好,但学习和处理成本很高。
- 数据质量:干净、结构一致的数据源太重要了,能极大提升研究效率。自己从原始日志清洗,是个苦力活。
- 存储问题:尤其是Tick数据,几个月的数据就能轻松上百GB,规划好存储方案很重要,不然硬盘哗哗地买。
大概就这些。其实每个数据类型都能展开讲很多,比如怎么用Tick数据构建订单簿、怎么从Level2里提取情绪因子。不过那都是后话了,先搞清楚手头有什么“食材”更重要。
如果有也在用类似数据的朋友,欢迎交流怎么压缩存储或者高效处理,最近正在为这个头疼。

