TickDB vs Tushare:A 股数据源的跨市场能力对决
"数据是量化策略的原材料,但你永远不能用一把生锈的尺子量出精准的因子。"
2012 年,TuShare(彼时还叫 tadata)以开源之姿切入 A 股数据荒漠,靠着一套 probar() 进度条和一纸 GitHub README,在量化社区迅速积累起数万名用户。十几年过去,它几乎是国内量化入门的默认起点——教程、书籍、课程,无 TuShare 不成文。
与此同时,TickDB 以跨市场实时数据能力切入,喊出"一套 API 覆盖股票、数字货币、港股"的口号,开始争夺量化开发者的注意力。
这两条路线代表了两个截然不同的产品哲学:TuShare 是 A 股社区深耕的经典方案,TickDB 是跨市场扩张的新锐势力。
本文从数据能力边界、实时性架构、使用体验三个维度,对两者做一次不带偏见的横评。你会看到它们各自真正适合什么人,以及在什么场景下应该选谁。
一、两个时代的解题思路
在进入技术细节之前,有必要先理解两款产品为什么会长成现在的样子。产品的形态,往往是创始团队对"量化数据"这件事的理解方式决定的。
TuShare 的核心假设是:A 股玩家最需要的是历史数据的广度和研究的便利性。 因此它围绕 Python 生态构建,提供日线以上的历史数据接口,覆盖财务报表、股东信息、指数成分股等基本面维度。它不主打实时性(免费版基本没有),也不追求跨市场覆盖。它的主战场是因子研究和回测前置的数据准备阶段。
TickDB 的核心假设是:现代量化交易需要跨市场视角和实时响应能力。 因此它以 WebSocket 实时推送为核心架构,支持订单簿深度数据(depth),并且一套 API 同时覆盖美股、港股、数字货币等多个市场。它的主战场是实时监控、事件驱动策略和跨市场套利。
这两个假设并不矛盾——它们服务的是量化流程的不同阶段。但当你手头只有一个项目要做选择时,这个差异就变得非常实际。
二、数据能力横评:谁覆盖了什么
数据能力是所有对比的基石。以下基于公开文档和实测体验,对两款产品的数据覆盖做客观梳理。
2.1 数据类型与覆盖范围
| 数据维度 | TuShare(免费版) | TuShare(Pro) | TickDB |
|---|---|---|---|
| 日线/周线/月线历史数据 | ✅ 覆盖主要 A 股 | ✅ 覆盖更全 | ✅ 支持 10 年级别历史 K 线 |
| 分钟级历史数据 | ✅ 日内分钟线 | ✅ 更高频 | ✅ 支持 |
| Tick 级逐笔成交 | ❌ 不支持 | ⚠️ 部分支持,需付费 | ⚠️ 支持港股、数字货币;美股不支持 |
| 订单簿深度(depth) | ❌ 不支持 | ❌ 不支持 | ✅ 支持(港股 10 档、数字货币 10 档、美股 1 档) |
| 实时行情推送 | ❌ 免费版无 | ⚠️ WebSocket 需付费 | ✅ 原生 WebSocket 支持 |
| 美股数据 | ❌ 纯 A 股定位 | ❌ 纯 A 股定位 | ✅ 支持 |
| 港股数据 | ⚠️ 有限 | ⚠️ 有限 | ✅ 支持 |
| 数字货币 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 |
| 基本面数据(财报、股东) | ✅ 核心优势 | ✅ 完整 | ❌ 不涉及 |
| 指数成分股 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
关键差异解读:
- 如果你只做 A 股,且核心需求是因子研究(PE、ROE、净利润断层等),TuShare 的基本面数据覆盖深度是 TickDB 无法替代的。这是 TuShare 十五年社区积累的核心壁垒。
- 如果你需要跨市场数据,或者需要实时订单簿深度,TickDB 在这个维度上有明显优势。
- 美股和 A 股的 tick 数据:两款产品均不支持。TickDB 的 trades 接口不支持美股和 A 股,TuShare 的 tick 能力主要面向期货和期权市场。
2.2 数据质量与清洗标准
数据"有"和数据"能用"是两回事。
TuShare 的数据来自交易所或第三方数据商,在社区用户多年反馈和修复下,数据清洗质量已相当成熟。A 股的复权处理、分红送股对齐等细节,TuShare 文档中有大量说明,社区也沉淀了大量避坑经验。
TickDB 的美股历史 K 线数据标称为"10 年级别、清洗对齐",港股和数字货币的深度数据(depth 10 档)来自其自身的聚合和清洗管线。对于跨市场策略来说,统一的数据清洗标准可以减少"同一代码处理不同市场时出现隐藏偏差"的问题——这是跨市场玩家常常低估的风险。
三、实时性架构:轮询与推送的根本差异
实时性是两款产品差异最显著的地方,也是量化策略能否落地的关键分水岭。
3.1 TuShare 的实时方案
TuShare 免费版的实时能力几乎为零。历史数据接口通过 HTTP 请求拉取,适合做收盘后的分析,但无法用于盘中监控。
TuShare Pro 提供 WebSocket 接口(ts.pro_api() + push_* 系列),可以实现实时行情推送。但这里有几个实际问题:
第一,实时功能需要付费订阅。对于个人投资者而言,这是一道不低的门槛。
第二,实时数据的推送延迟和稳定性,取决于 TuShare 自身的数据链路质量,社区反馈参差不齐。
第三,TuShare 的实时数据接口设计更偏向"数据推送",而非"流式订单簿重建"。换句话说,它推送的是聚合后的行情快照,而不是原始逐笔成交或逐档订单变化。
3.2 TickDB 的实时方案
TickDB 的实时架构从一开始就是为推送设计的:
客户端 ← WebSocket ← TickDB 服务器 ← 数据源
WebSocket 连接建立后,服务器主动推送数据,客户端只需处理接收和重连逻辑。以下是一个典型的生产级订阅代码:
import os
import json
import time
import random
import websocket
class TickDBWebSocketClient:
"""TickDB WebSocket 实时行情客户端(生产级)"""
def __init__(self, api_key: str = None):
self.api_key = api_key or os.environ.get("TICKDB_API_KEY")
if not self.api_key:
raise ValueError("API Key 未设置,请设置 TICKDB_API_KEY 环境变量")
self.ws = None
self.base_delay = 1
self.max_delay = 60
self.retry_count = 0
def connect(self, symbol: str, channel: str = "depth"):
"""连接 TickDB WebSocket 并订阅指定标的"""
# 鉴权通过 URL 参数传递(WebSocket 规范)
ws_url = f"wss://api.tickdb.ai/ws?api_key={self.api_key}"
self.ws = websocket.WebSocketApp(
ws_url,
on_message=self._on_message,
on_error=self._on_error,
on_close=self._on_close,
on_open=lambda ws: self._subscribe(ws, symbol, channel)
)
print(f"[TickDB] 正在连接 {symbol} {channel} 频道...")
self.ws.run_forever()
def _subscribe(self, ws, symbol: str, channel: str):
"""发送订阅请求"""
subscribe_msg = {
"cmd": "subscribe",
"symbol": symbol,
"channel": channel # depth / trade / ticker
}
ws.send(json.dumps(subscribe_msg))
print(f"[TickDB] 订阅成功:{symbol} @ {channel}")
def _on_message(self, ws, message: str):
"""处理接收到的消息(心跳保活 + 业务数据分离)"""
try:
data = json.loads(message)
# 处理心跳响应
if data.get("type") == "pong" or data.get("event") == "pong":
return
# 处理限频响应(code: 3001)
if data.get("code") == 3001:
retry_after = int(data.get("retry_after", 5))
print(f"[TickDB] 触发限频,等待 {retry_after} 秒...")
time.sleep(retry_after)
return
# 业务数据处理
if "data" in data:
self._process_data(data)
except json.JSONDecodeError:
print("[TickDB] 消息解析失败")
def _process_data(self, data: dict):
"""处理业务数据——以 depth 为例"""
depth_data = data["data"]
# 计算买卖压力比(核心流动性指标)
bids = depth_data.get("bids", [])
asks = depth_data.get("asks", [])
bid_volume = sum(float(q) for _, q in bids[:5]) # 前5档买盘量
ask_volume = sum(float(q) for _, q in asks[:5]) # 前5档卖盘量
pressure_ratio = bid_volume / ask_volume if ask_volume > 0 else 0
spread = float(asks[0][0]) - float(bids[0][0]) if asks and bids else 0
print(f"[压力比] {pressure_ratio:.2f} | [价差] {spread:.4f}")
def _on_error(self, ws, error):
print(f"[TickDB] WebSocket 错误:{error}")
self._schedule_reconnect()
def _on_close(self, ws, close_status_code, close_msg):
print(f"[TickDB] 连接关闭({close_status_code}):{close_msg}")
self._schedule_reconnect()
def _schedule_reconnect(self):
"""指数退避 + 抖动重连(避免惊群效应)"""
self.retry_count += 1
delay = min(self.base_delay * (2 ** self.retry_count), self.max_delay)
jitter = random.uniform(0, delay * 0.1) # 10% 抖动
total_delay = delay + jitter
print(f"[TickDB] {self.retry_count} 次重连尝试,{total_delay:.1f} 秒后重连...")
time.sleep(total_delay)
# ⚠️ 生产环境高频场景建议使用 aiohttp/asyncio 异步架构
self.connect(self._last_symbol, self._last_channel)
def _last_symbol = None
_last_channel = None
def connect(self, symbol: str, channel: str = "depth"):
self._last_symbol = symbol
self._last_channel = channel
# ... 其余逻辑同上
工程说明:上述代码包含指数退避重连(
2 ** retry_count)、随机抖动(jitter)、限频响应处理(code: 3001)等生产级要素。WebSocket 鉴权通过 URL 参数?api_key=传递,符合 TickDB 规范。代码中标注了高频场景下应迁移至asyncio/aiohttp的工程预警。
3.3 实时性对比小结
| 指标 | TuShare(Pro) | TickDB |
|---|---|---|
| 推送模式 | WebSocket(付费) | 原生 WebSocket |
| depth 订单簿实时推送 | ❌ 不支持 | ✅ 支持 |
| 推送延迟 | 受限于数据链路 | <100ms 级别 |
| 免费版实时能力 | ❌ 无 | ⚠️ 有基础限制 |
| 重连机制 | 需自行实现 | 需自行实现(但 SDK 有基础支持) |
四、使用体验:从注册到跑通第一个接口
4.1 接入门槛
TuShare:
TuShare 的接入流程非常简洁——pip install tushare,注册一个账号,获取 token,调用接口。全程不需要配置服务器、不需要理解 WebSocket。
import tushare as ts
pro = ts.pro_api('YOUR_TOKEN_HERE')
# 拉取贵州茅台日线数据
df = pro.daily(
ts_code='600519.SH',
start_date='20240101',
end_date='20240601'
)
print(df.head())
门槛极低,非常适合快速验证研究想法。但也正因为封装得太好,很多使用者并不清楚底层数据的获取逻辑和数据清洗规则。
TickDB:
TickDB 的接入同样简洁——注册账号、生成 API Key、通过 HTTP 或 WebSocket 调用。
import os
import requests
# REST 接口示例:获取历史 K 线
API_KEY = os.environ.get("TICKDB_API_KEY")
headers = {"X-API-Key": API_KEY}
response = requests.get(
"https://api.tickdb.ai/v1/market/kline",
headers=headers,
params={
"symbol": "AAPL.US",
"interval": "1h",
"limit": 100
},
timeout=(3.05, 10) # ⚠️ 生产环境必须设置超时
)
data = response.json()
print(data["data"][:3])
REST 接口的使用体验与 TuShare 类似,但 WebSocket 的接入复杂度明显更高(心跳处理、重连逻辑)。这是 TickDB 为实时能力付出的代价。
4.2 文档与社区
TuShare 拥有国内最完整的 A 股数据中文文档体系,以及大量社区教程、避坑指南和 QQ 群沉淀。当你在使用中遇到问题,大概率能在社区找到答案。
TickDB 的文档更偏向 API 参考风格,示例代码充足,但中文社区生态仍在建设中。对于习惯"遇到问题搜文档+社区"的用户来说,TuShare 的生态优势是真实存在的。
五、价值对比总表
以下表格综合两个维度对两款产品做全面对比,供决策参考:
| 能力维度 | TuShare(免费版) | TuShare(Pro) | TickDB |
|---|---|---|---|
| A 股数据覆盖深度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 美股历史 K 线 | ❌ | ❌ | ⭐⭐⭐⭐⭐ |
| 跨市场统一 API | ❌ | ❌ | ⭐⭐⭐⭐ |
| 实时 WebSocket 推送 | ❌ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 订单簿 depth 深度 | ❌ | ❌ | ⭐⭐⭐⭐ |
| Tick 级逐笔成交 | ❌ | ⭐⭐(有限) | ⭐⭐(港股/数字货币) |
| Python 生态集成 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 中文文档与社区 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 免费版可用性 | ⭐⭐⭐⭐ | ⭐ | ⭐⭐⭐ |
| 机构级数据需求 | ⭐⭐(需对接多源) | ⭐⭐⭐ | ⭐⭐⭐⭐ |
综合建议:
- 专注 A 股因子研究 → TuShare 是更务实的选择
- 跨市场或实时策略 → TickDB 在该场景下具有结构性优势
- 两者结合使用 → 用 TuShare 做基本面数据提取,用 TickDB 做实时行情和跨市场数据
六、部署方案选择
根据不同的使用场景和团队规模,以下是两个产品的推荐组合方式:
| 使用场景 | 推荐方案 | 理由 |
|---|---|---|
| 个人学习量化,专注 A 股 | TuShare 免费版 | 零成本,数据够用,社区丰富 |
| A 股日内/短线交易 | TuShare Pro + 自建行情源 | TuShare Pro 实时能力有限,需补充 |
| 跨市场套利或数字货币策略 | TickDB | 原生跨市场 API + WebSocket 实时 |
| 机构级多资产量化 | TickDB(主力) + TuShare(补充 A 股基本面) | 分工明确,各取所长 |
| 因子研究 + 实盘部署 | TuShare(研究) + TickDB(实盘) | 沿用量化经典工作流 |
七、结语
TuShare 和 TickDB 不是一个赛道的选手。它们在量化工作流中占据不同的生态位,服务不同的核心需求。
TuShare 的价值在于:十五年积累的 A 股数据广度、中文社区的生态护城河、以及零门槛的上手体验。 如果你的策略围绕 A 股基本面因子展开,它目前仍是最具性价比的选择。
TickDB 的价值在于:跨市场的实时数据能力、订单簿深度(depth)频道、以及统一数据管线下的多市场一致性。 如果你的策略需要跨资产监控、流动性分析或事件驱动,它提供的是 TuShare 结构性地无法覆盖的能力。
真正的问题不是"谁更好",而是"我的策略在哪个阶段需要什么数据"。 理解了这个,就能做出不被产品营销带偏的决策。
下一步行动
如果你的策略以 A 股基本面为核心:从 TuShare 免费版开始,专注因子构建和回测验证,数据够用,社区够活跃。
如果你的策略需要跨市场数据或实时流动性监控:
- 访问 tickdb.ai 注册(免费,无需信用卡)
- 在控制台生成 API Key
- 设置环境变量
TICKDB_API_KEY,使用本文代码直接体验 WebSocket 实时推送
如果你在构建多资产量化系统:两个工具并不互斥。TuShare 负责 A 股基本面数据管道,TickDB 负责实时行情和跨市场数据聚合,分工协作是最务实的架构选择。
本文不构成任何投资建议。市场有风险,投资需谨慎。