在量化交易圈,逐笔成交数据(Tick-by-tick trades)是策略回测与微观结构研究的金矿。我每天要从 Binance、Bybit、OKX、Deribit 四家交易所拉数 TB 的原始成交记录,写过 ETL 脚本的同行都知道痛点:每家 schema 不一样、时间戳精度不一致、字段命名混乱、消息顺序错位。本文就用我过去三个月踩过的坑,整理出一套从 Tardis 拉数据 → 多交易所归一化 → 列式存储 → 查询优化的完整流水线。
不过先把题外话讲完:做策略离不开 LLM 辅助(因子挖掘、研报总结、代码生成)。我自己每月大概要烧 100 万 token 的 output。我把国内外几家主流模型的官方价拉出来算了一笔账(按 2026 年最新 output 价格):
- GPT-4.1:$8 / MTok
- Claude Sonnet 4.5:$15 / MTok
- Gemini 2.5 Flash:$2.50 / MTok
- DeepSeek V3.2:$0.42 / MTok
100 万 token 月度支出对比(官方渠道按 ¥7.3=$1 信用卡结算):
- GPT-4.1:$8 × 7.3 = ¥58.40
- Claude Sonnet 4.5:$15 × 7.3 = ¥109.50
- Gemini 2.5 Flash:$2.50 × 7.3 = ¥18.25
- DeepSeek V3.2:$0.42 × 7.3 = ¥3.07
走 HolySheep AI(¥1=$1 无损汇率、微信/支付宝直充、国内直连延迟 <50ms、新用户免费额度):
- GPT-4.1:¥8.00
- Claude Sonnet 4.5:¥15.00
- Gemini 2.5 Flash:¥2.50
- DeepSeek V3.2:¥0.42
单 Claude 一项就省 ¥94.50/月,整体节省 85%+。这是我后来把所有 LLM 调用都迁到 HolySheep 的核心理由——同样能稳定拉到模型,价格直接打 1.4 折。
回到正题。下面进入 Tardis ETL 主线。
一、为什么必须做归一化 ETL
Tardis.dev 把各交易所的原始 WebSocket 消息 dump 成 CSV/JSON 提供下载,但同一笔 trade 在不同平台的字段长这样:
| 字段 | Binance | Bybit | OKX | Deribit |
|---|---|---|---|---|
| 成交价 | price | price | px | price |
| 成交量 | qty | size | sz | amount |
| 时间戳 | trade_time(ms) | timestamp(ms) | ts(ms) | timestamp(ns) |
| 方向 | is_buyer_maker | side | side | direction |
| 交易对 | symbol | symbol | instId | instrument_name |
直接进数仓会导致:SQL 要写 4 套 JOIN 条件、回测脚本到处 if exchange == ...、时间戳单位混用引发毫秒/微秒级错位。归一化的目标就是把 4 套异构流压成 1 张宽表。
二、目标归一化 Schema
我定的最终 schema(ClickHouse / Parquet 双兼容):