做量化回测,选对数据源和数据类型真的太重要了,搞不好就是白忙活一场。今天就来聊聊我平时会用到的几种高频数据,主要是美股和港股的,看看它们里面到底有什么,应该怎么用。
先从最"重"的Tick数据说起
这玩意儿是硬盘杀手,真不是开玩笑的。Tick数据,也叫逐笔成交,就是交易所每发生一笔成交就记录一次。它记录的是最原始的交易行为。
我一般会关注这几个核心字段:
| 字段 | 说明(我自己的理解) |
|---|---|
symbol |
股票代码,这个不用多说。 |
time |
成交时间,通常精确到毫秒甚至微秒。市场微观结构研究就靠这个了。 |
price |
成交价格。 |
volume |
成交数量。注意,这里是一笔的成交量,不是累计的。 |
turnover |
成交金额,就是 price * volume。 |
bs_flag |
买卖方向标识。这个很重要,能看出是主动性买盘还是卖盘推动的成交,分析资金流向的核心。 |
新手千万别一上来就怼着几年的Tick数据跑回测,光是数据清洗和存储就能劝退。我之前为了研究订单薄动态,尝试用免费的原始数据,结果光是处理停牌、除权除息这些脏活就花了一周。后来图省事,直接用了CMES金融数据库里已经清洗和复权好的版本,虽然要花点积分,但省下的时间成本更值。
十档行情(Level 2)
如果说Tick是"成交"的明细,那十档行情就是"挂单"的快照。它定时(比如每秒多次)拍下市场上最好的十个买价和卖价,以及每个价位上挂了多少手单子。
它最有价值的地方是能让你看到盘口深度,而不仅仅是买一卖一。比如,有时候股价在关键位置横盘,你看买一挂单量很大,以为是强支撑,但一看十档,发现卖二到卖五的累积压单更重,这可能就是个假象。
主要字段包括快照时间、十个买卖价位和对应的挂单量。很多短线策略,比如捕捉流动性瞬间消失,或者估算大单冲击成本,都离不开这个。
分钟线数据:回测的好朋友
对于大多数策略回测来说,分钟线是性价比最高的选择。它把Tick数据按分钟做了聚合,信息量大幅压缩,但保留了日内走势的关键细节。
一分钟K线通常包含:时间(哪一分钟)、开盘价、最高价、最低价、收盘价,以及这一分钟内的总成交量和成交额。
如果你想做日内趋势或者均值回复策略,用分钟线数据就足够了。比如,我之前想验证一个基于开盘后30分钟波动率的突破策略,就是调取了过去几年的港股分钟线,跑起来效率很高。
美股和港股有啥不同?
数据字段大同小异,但规则细节要注意。比如,美股没有涨跌停板,波动更连续,Tick数据会更密集。港股交易时段和规则也和A股不同,数据的时间戳处理要留意。
这里给个用Python接口获取数据的简单例子,接口文档在他们官网都能找到。用之前记得先pip install一下。
python
# 示例:获取港股腾讯控股的分钟线数据
# 注意:需要先在CMES金融数据库官网获取API Key和Secret
import cmes_data
# 初始化客户端,注意替换成你自己的密钥
client = cmes_data.Client(api_key='你的API_KEY', api_secret='你的API_SECRET')
# 请求数据,注意参数别写错,频率别调太高,小心被限流
data = client.get_bar_data(
symbol='00700.HK', # 股票代码
frequency='1m', # 频率:1分钟
start_time='2024-05-20 09:30:00',
end_time='2024-05-20 16:00:00',
adjust='qfq' # 前复权
)
print(data.head())
# 通常返回DataFrame,包含时间、开高低收、成交量等字段
最后碎碎念几句
- 数据量:Tick > 十档 > 分钟线。选数据前先评估自己的硬件和需求。
- 数据质量:时间戳是否连续?是否有异常值(比如价格为零)?是否做了复权处理?这些直接影响回测结果。自己清洗很痛苦,所以我现在倾向于用现成的清洗好的数据源。
- 合规性:在公开平台分享策略时,注意只展示思路和逻辑,不要透露具体的数据接口密钥、原始数据切片等敏感信息,各平台对金融数据的分享都有审核规则。
大概就这些了。数据本身只是原料,关键还是看你的策略想法。不过,用好原料确实能少走很多弯路。如果大家对处理高频数据有什么心得,或者知道怎么高效压缩存储,欢迎聊聊,我最近正为这个头疼呢。