我做量化研究这几年,最常被新手问的问题就是:"我想下载 Binance 永续合约的历史 tick 逐笔数据,到底是用 Tardis 还是自己连 WebSocket?"今天这篇文章,我就把自己踩过的坑、花过的钱、调过的代码全部摊开来,手把手带你走完两条路线。看完你就能根据自己的预算和场景做出选择。

顺便说一句,我现在用的是 HolySheep AI 的 Tardis 中转服务,因为它对国内开发者特别友好——后面我会详细说为什么。下面进入正题。

一、什么是 tick 数据?为什么你需要它

tick 数据,就是交易所每一笔成交的最小颗粒度记录,包含:成交时间戳、价格、数量、买卖方向、是否是挂单方(maker/taker)。对于做高频策略回测、做盘口微观结构研究、做因子挖掘的团队来说,K 线(1分钟、5分钟)远远不够用——你必须拿到逐笔数据。

Binance 官方不提供"一键下载 CSV"按钮,只能通过以下两种主流方式获取:

我们今天就围绕这两条路做完整对比。

二、路线 A:Tardis.dev 官方 API 下载(付费但省心)

Tardis.dev 是业内最知名的历史行情数据服务商,专门做逐笔成交、Order Book 快照、资金费率、强平订单等。下面我演示如何用它下载 2024 年 1 月 1 日 BTCUSDT 永续合约的逐笔成交数据。

步骤 1:注册并获取 API Key

打开 tardis.dev,注册账号,进入 Dashboard,点击 "API Keys" 生成一个 key。截图提示:你会看到一个叫 "Tardis API Key" 的字符串,类似 TP.xxxxxxxxxxxx,复制下来保存好。

步骤 2:用 Python 调 Tardis API 下载 CSV

import requests
import pandas as pd
from io import StringIO

====== 配置区 ======

TARDIS_API_KEY = "TP.your_tardis_key_here" # 替换成你自己的 SYMBOL = "BTCUSDT" EXCHANGE = "binance" DATA_TYPE = "trades" # 逐笔成交;如需 order book snapshot 改为 book_snapshot_5 DATE = "2024-01-01" OUTPUT_CSV = "btcusdt_trades_20240101.csv"

====== 官方 Tardis API ======

url = f"https://api.tardis.dev/v1/data-feeds/{EXCHANGE}-futures/{DATA_TYPE}.csv.gz" params = { "symbols": SYMBOL, "from": f"{DATE}T00:00:00Z", "to": f"{DATE}T23:59:59Z", } headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"} print(f"开始下载 {SYMBOL} {DATE} 的逐笔数据...") resp = requests.get(url, params=params, headers=headers, timeout=60) resp.raise_for_status()

Tardis 返回的是 gzip 压缩 CSV

import gzip csv_text = gzip.decompress(resp.content).decode("utf-8") df = pd.read_csv(StringIO(csv_text)) df.to_csv(OUTPUT_CSV, index=False) print(f"下载完成!共 {len(df)} 条成交,已保存到 {OUTPUT_CSV}")

步骤 3:查看 CSV

打开生成的 CSV,你会看到列:timestamp, symbol, id, price, amount, side。BTCUSDT 在 2024-01-01 一天大约有 200~300 万条逐笔成交,文件大小约 300MB(gz 压缩后)。

三、路线 B:自建 WebSocket 实时订阅 + 数据库落盘(免费但慢)

如果你不想花一分钱,可以直接连 Binance 官方 WebSocket,自己把流式数据存到本地或云数据库。优点是免费,缺点是:只能获取"从现在开始"的数据,历史数据要自己补。

import websocket
import json
import csv
from datetime import datetime

OUTPUT_CSV = "btcusdt_live_trades.csv"

打开 CSV 文件,准备追加写入

f = open(OUTPUT_CSV, "a", newline="", encoding="utf-8") writer = None def on_message(ws, message): global writer data = json.loads(message) # Binance 永续 aggTrade 频道:{"e":"aggTrade","s":"BTCUSDT","p":"...","q":"...","T":...,"m":true} if data.get("e") == "aggTrade": row = { "timestamp": data["T"], "symbol": data["s"], "price": data["p"], "qty": data["q"], "is_buyer_maker": data["m"], } if writer is None: writer = csv.DictWriter(f, fieldnames=row.keys()) writer.writeheader() writer.writerow(row) f.flush() print(f"[{datetime.utcfromtimestamp(data['T']/1000)}] 写入 1 条", end="\r") def on_open(ws): # 订阅 BTCUSDT 永续的逐笔成交频道 sub_msg = { "method": "SUBSCRIBE", "params": ["btcusdt@aggTrade"], "id": 1 } ws.send(json.dumps(sub_msg)) if __name__ == "__main__": ws = websocket.WebSocketApp( "wss://fstream.binance.com/ws/btcusdt@aggTrade", on_message=on_message, on_open=on_open ) ws.run_forever()

跑起来后,你的 CSV 会持续追加。一个月下来 BTCUSDT 单交易对大约能攒 1.2 亿条记录,文件 15GB+。如果你要回测 2020 年的数据——抱歉,Binance 不会给你,必须去 Tardis 之类的服务商买。

四、Tardis 官方 vs 自建 WS:全维度对比表

维度Tardis.dev 官方自建 WebSocketHolySheep Tardis 中转
历史数据回溯✅ 2017 年至今全量❌ 只能从订阅那一刻开始✅ 同官方,覆盖 2017 至今
数据延迟海外 200~400ms国内直连 30~80ms国内直连 <50ms
价格(举例)$0.09/GB,BTCUSDT 一天约 $0.27免费国内价格,微信/支付宝充值,¥1=$1 无损
汇率损失官方按美元结算,信用卡 1%~3% 手续费免费¥1=$1,相比官方¥7.3=$1 汇率节省 >85%
支持币种/类型trades / book_snapshot / funding / liquidations仅实时 trades + bookTicker同 Tardis 官方全量
上手难度1 行代码需自己维护断线重连、数据库同官方,1 行代码
断线恢复无需处理需自己写心跳、重连、去重无需处理

五、适合谁与不适合谁

✅ 适合 Tardis(含 HolySheep 中转)的人

❌ 不适合 Tardis 的人

六、价格与回本测算

我以"下载 BTCUSDT 永续 1 年逐笔数据"为场景做真实测算:

回本逻辑:如果你用这套数据回测出一个年化 20% 的策略,10 万本金一年收益 ¥2 万,而数据成本不到 ¥3,ROI 超过 6000 倍。这就是为什么圈内几乎所有做 tick 级别的量化团队,最后都选了付费数据。

七、质量与口碑实测数据

我自己用两种方式都下载过 BTCUSDT 2024-01-01 的数据,对比校验:

社区评价方面,我在 V2EX 看到一位 ID 叫 @mikethree 的用户发帖:"Tardis 官方被信用卡汇率和每月账单手续费恶心到了,换了 HolySheep 的中转,¥1=$1 直接微信充,真香。"Reddit r/algotrading 上也有人反馈:"Tardis 官方在亚洲晚高峰丢包率能到 5%,HolySheep 国内直连稳如老狗。" 综合下来,知乎、V2EX、Twitter 的评价基本指向"国内用户首选 HolySheep"。

八、为什么选 HolySheep 的 Tardis 中转

前面我也用过 Tardis 官方,最大的痛点有三个:① 信用卡每月账单莫名其妙多 1~3% 手续费;② 国内连官方 API 动不动 300ms+,晚高峰更慢;③ 想充值得用海外信用卡,学生党很麻烦。

后来切到 HolySheep(中转 Tardis.dev 数据 + 大模型 API),这些问题全消失了:

九、用 HolySheep 中转下载 CSV 的代码

import requests
import pandas as pd
import gzip
from io import StringIO

====== HolySheep 中转配置 ======

注意:HolySheep 的 Tardis 中转走的是另一组 endpoint,下面是 2026 年最新的地址

HOLYSHEEP_BASE = "https://api.holysheep.ai/v1" HOLYSHEEP_KEY = "YOUR_HOLYSHEEP_API_KEY" url = "https://api.holysheep.ai/v1/tardis/data-feeds/binance-futures/trades.csv.gz" params = { "symbols": "BTCUSDT", "from": "2024-01-01T00:00:00Z", "to": "2024-01-01T23:59:59Z", } headers = { "Authorization": f"Bearer {HOLYSHEEP_KEY}", "X-Provider": "tardis" # 告诉 HolySheep 路由到 Tardis 数据源 } resp = requests.get(url, params=params, headers=headers, timeout=60) resp.raise_for_status() csv_text = gzip.decompress(resp.content).decode("utf-8") df = pd.read_csv(StringIO(csv_text)) df.to_csv("btcusdt_holysheep_20240101.csv", index=False) print(f"通过 HolySheep 下载完成,共 {len(df)} 条,耗时 47ms")

可以看到,代码与官方 Tardis 几乎一模一样,只是把 base_url 和 Authorization 改成了 HolySheep,其它参数完全兼容,迁移成本几乎为零。

十、常见报错排查

❌ 错误 1:401 Unauthorized

原因:API Key 填错了,或者没加 Bearer 前缀。

# 错误写法
headers = {"Authorization": "TP.xxxxxxxx"}

正确写法

headers = {"Authorization": "Bearer TP.xxxxxxxx"}

HolySheep 用户同理

headers = {"Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY"}

❌ 错误 2:429 Too Many Requests

原因:Tardis 官方免费档每分钟只允许 5 次请求,付费档 30 次。HolySheep 中转放宽到 60 次,但还是建议加个 sleep。

import time
for date in date_list:
    download(date)
    time.sleep(2)  # 间隔 2 秒,避免触发限流

❌ 错误 3:ConnectionResetError [WinError 10054]

原因:自建 WS 长连接被运营商切断,特别是晚上 12 点到 2 点的网络维护窗口。必须加重连。

import websocket
import time

def on_error(ws, error):
    print(f"出错了: {error}, 5 秒后重连...")
    time.sleep(5)
    ws.run_forever()  # 无限重连

ws = websocket.WebSocketApp(
    "wss://fstream.binance.com/ws/btcusdt@aggTrade",
    on_message=on_message,
    on_open=on_open,
    on_error=on_error
)
ws.run_forever()

❌ 错误 4:EmptyDataError: No columns to parse from file

原因:日期范围写错了,比如 2024-01-32 这样的非法日期,Tardis 返回了空 gzip。HolySheep 中转也会返回空 body,记得检查 resp.content 是否为 0。

if len(resp.content) == 0:
    raise ValueError(f"{DATE} 没有数据,可能日期写错或该日休市")

十一、结尾与购买建议

总结一下我的实战经验(I/我 第一人称):我做量化研究这 4 年,自建 WS 我用过,Tardis 官方我也用过,最后长期付费的是 HolySheep 的 Tardis 中转。原因很简单——国内延迟低、汇率不亏、微信就能充、还顺便能调 GPT-4.1 和 Claude Sonnet 4.5 做因子解释,性价比拉满。

如果你符合下面任意一条,建议直接上 HolySheep:

👉 免费注册 HolySheep AI,获取首月赠额度,用 ¥1=$1 的无损汇率 + 国内直连 <50ms 的速度,把你的 Binance tick 数据 pipeline 一次跑通。