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()
💡 小技巧: token建议放在环境变量里,别硬编码在代码中。我之前有一次把token传到GitHub上,结果被人盗刷了积分,血的教训。

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格式存储
📌 重要提示: Tushare有积分限制,普通用户每天只能拉取一定量的数据。我建议把数据存到本地数据库或parquet文件里,避免重复拉取。我自己用的是PostgreSQL,查询速度快,还支持时间序列索引。

2.3 数据源对比与选择建议

说了这么多,到底选哪个?我直接给结论:

  • 个人学习/研究:Tushare免费版就够了,每天几万条Tick数据,够你折腾的
  • 小团队/创业:可以考虑Tushare Pro或者聚宽的数据服务,一个月几百块
  • 机构/高频交易:别犹豫,直接上交易所Level-2或者Wind,数据质量是第一位的

为什么会这样?说白了就是成本和收益的平衡。我见过太多人一上来就买几万块的Level-2数据,结果策略还没跑通,数据费先亏进去了。

💡 我的建议: 先用Tushare免费数据把策略逻辑跑通,确认有效后再升级数据源。这样既省钱又高效。

2.4 本章知识体系

最后,我用一张图把本章的核心逻辑串起来。你一看就明白Tick数据获取的全貌了。

Tick数据获取知识体系 数据源层 交易所直连 Level-1 / Level-2 第三方数据商 Tushare / Wind / 聚宽 Python接口层 数据获取与存储 stk_ticks接口 → 批量拉取 → Parquet/数据库存储

这张图把整个流程串起来了。从数据源到Python接口,再到数据存储,每一步都有坑,但也都有解法。你按照这个路径走,基本不会迷路。

专注资料整理