2、Tick数据获取:常见数据源介绍与Python接口实战
做量化交易的朋友都知道,Tick数据是最高频的市场数据。每一笔成交、每一次报价变动,都记录在Tick里。我刚开始接触高频策略时,最大的痛点就是——数据从哪来?
今天我就把这块内容掰开揉碎了讲清楚。咱们先看数据源,再看怎么用Python拿到数据。
2.1 常见数据源:交易所 vs 第三方
数据源说白了就两大类:官方渠道和第三方渠道。各有各的脾气,我一个个说。
2.1.1 交易所直连
上交所、深交所、中金所,这些是数据的源头。交易所提供Level-1和Level-2两种行情。
| 行情类型 | 频率 | 内容 | 费用 |
|---|---|---|---|
| Level-1 | 3秒快照 | 五档行情、成交价、成交量 | 免费(需申请) |
| Level-2 | 逐笔成交 | 十档行情、逐笔委托、逐笔成交 | 数万/年 |
我个人习惯是,做日内策略至少用Level-2。Level-1的3秒快照,说实话做高频有点不够用。我在项目中遇到过用Level-1数据回测表现很好,实盘却一塌糊涂的情况——后来发现就是数据颗粒度的问题。
2.1.2 第三方数据商
这才是我们普通玩家的主战场。国内主流的第三方数据商有这些:
- Tushare:开源免费,社区活跃,适合学习和研究
- Wind:机构标配,贵但稳定,适合基金公司
- 聚宽/米筐:自带回测平台,数据+策略一体化
- 恒生/万得:专业级,主要服务券商
你想想看,如果只是个人研究,Tushare基本够用。我自己的第一个Tick级策略就是用Tushare的数据跑通的。
2.2 Python接口获取Tick数据:以Tushare为例
好,理论说完了,咱们直接上代码。Tushare获取Tick数据,核心就三步:注册、安装、调用。
2.2.1 准备工作
首先你得有个Tushare账号。去官网注册,然后申请token。这个token就是你的通行证。
# 安装Tushare
pip install tushare
# 初始化
import tushare as ts
ts.set_token('你的token')
pro = ts.pro_api()
2.2.2 获取Tick数据
Tushare获取Tick数据主要用两个接口:trade_cal获取交易日历,stk_mins获取分钟级数据。但Tick级数据,我们需要用stk_ticks接口。
# 获取某只股票某一天的Tick数据
df = pro.stk_ticks(
ts_code='000001.SZ', # 平安银行
trade_date='20240115', # 日期
start_time='093000', # 开始时间
end_time='150000', # 结束时间
fields='ts_code,trade_time,price,vol,amount,buy,sell'
)
print(df.head())
返回的数据长这样:
| ts_code | trade_time | price | vol | amount | buy | sell |
|---|---|---|---|---|---|---|
| 000001.SZ | 09:30:00.123 | 10.25 | 1000 | 10250 | 10.24 | 10.26 |
| 000001.SZ | 09:30:00.456 | 10.26 | 500 | 5130 | 10.25 | 10.27 |
嗯,这里要注意:Tushare的Tick数据是逐笔成交,不是快照。每一行就是一笔真实的成交。这个精度做高频策略完全够用。
2.2.3 批量获取与存储
单日数据好拿,但做研究往往需要几个月甚至几年的数据。我建议写个循环批量拉取:
import pandas as pd
from datetime import datetime, timedelta
def fetch_ticks_batch(ts_code, start_date, end_date):
"""
批量获取Tick数据
"""
all_data = []
current = datetime.strptime(start_date, '%Y%m%d')
end = datetime.strptime(end_date, '%Y%m%d')
while current <= end:
date_str = current.strftime('%Y%m%d')
try:
df = pro.stk_ticks(ts_code=ts_code, trade_date=date_str)
if not df.empty:
all_data.append(df)
print(f'{date_str} 获取成功,共{len(df)}条')
except Exception as e:
print(f'{date_str} 获取失败:{e}')
current += timedelta(days=1)
return pd.concat(all_data, ignore_index=True)
# 使用示例
data = fetch_ticks_batch('000001.SZ', '20240101', '20240131')
data.to_parquet('tick_data.parquet') # 推荐用parquet格式存储
2.3 数据源对比与选择建议
说了这么多,到底选哪个?我直接给结论:
- 个人学习/研究:Tushare免费版就够了,每天几万条Tick数据,够你折腾的
- 小团队/创业:可以考虑Tushare Pro或者聚宽的数据服务,一个月几百块
- 机构/高频交易:别犹豫,直接上交易所Level-2或者Wind,数据质量是第一位的
为什么会这样?说白了就是成本和收益的平衡。我见过太多人一上来就买几万块的Level-2数据,结果策略还没跑通,数据费先亏进去了。
2.4 本章知识体系
最后,我用一张图把本章的核心逻辑串起来。你一看就明白Tick数据获取的全貌了。
这张图把整个流程串起来了。从数据源到Python接口,再到数据存储,每一步都有坑,但也都有解法。你按照这个路径走,基本不会迷路。