Skip to content

hellozim22/tick-data-pipeline

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tick Data Pipeline

Binance Futures 实时 Tick 数据采集、存储与分析管道。

通过 WebSocket 直连 Binance Futures,采集 10 个示例币种的 orderbook depth (50档) + trade 数据,每秒批量写入本地 Parquet 文件(VPS 部署)。

Python 3.11+ License: Personal Non-Commercial Data Format: Parquet

架构

┌─────────────────┐      WebSocket       ┌──────────────────────┐
│  Binance Futures │─────────────────────▶│   collect_tick.py    │
│  (depth@100ms +  │                      │                      │
│   trade streams) │     REST Snapshot    │  LocalOrderBook      │
│                  │◀─────────────────────│  TradeAccumulator    │
└─────────────────┘                      │  TickBuffer          │
                                          │                      │
                                          │  每秒 flush ────────▶│
                                          └──────────────────────┘
                                                   │
                                                   ▼
                                          ┌─────────────────┐
                                          │  本地 Parquet    │
                                          │  (VPS 存储)      │
                                          │                  │
                                          │  ticks/{sym}/    │
                                          │  YYYY-MM-DD/     │
                                          │  HH-MM.pq        │
                                          └─────────────────┘

数据管线: Binance WS → collector → 本地 Parquet 文件 (VPS)

数据流

  1. WebSocket 连接: 直连 wss://fstream.binance.com/ws,每连接 ≤512 对 stream (depth + trade)
  2. 订单簿维护: LocalOrderBook 先通过 REST snapshot 初始化,再用 WebSocket diff 增量更新
  3. 成交累加: TradeAccumulator 按 taker side (buy/sell) 分别聚合成交统计
  4. 每秒 flush: 将当前 orderbook top-50 + 一秒内成交统计打包为一行
  5. 写入存储: 本地 Parquet 文件 (按分钟分文件,VPS 本地磁盘)

关键技术特性

  • 自动重同步: 每 30 分钟自动 REST snapshot 重同步,防止 orderbook 漂移
  • 限流保护: 遇 418/429 自动降速,指数退避重试
  • 数据验证: 每 60 批本地验证数据完整性

运行数据

采集器状态 (2026-06-23)

指标 数值
币种数量 10 个示例币种
采集频率 每秒 1 行 / symbol
数据写入速率 ~10 rows/s
2 小时行数 ~72,000 行
2 小时文件数 ~1,200 个 Parquet 文件
2 小时磁盘占用 ~72 MB (zstd compressed)

数据点修复前后对比

币种 修复前数据点 修复后数据点 说明
BTCUSDT 7,200 7,200 高频币种,不受影响
DOTUSDT 0 7,200 GAP-FIX 修复后正常采集

修复说明: GAP-FIX 解决了中低频币种 orderbook init → gap → resync 死循环导致的永久空数据问题。基于测试期间的 10 个示例币种。 可使用 --symbols 参数配置任意 USDT 交易对,不受限于这 10 个示例。

快速开始

1. 环境要求

  • Python 3.11+
  • pip

2. 安装

git clone https://github.com/hellozim22/tick-data-pipeline.git
cd tick-data-pipeline
pip install -r collector/requirements.txt

3. 运行

# 采集所有 10 个示例币种,存储为本地 Parquet
python3 collector/collect_tick.py --local --data-dir ../data

# 只采集特定币种
python3 collector/collect_tick.py --local --symbols BTCUSDT,ETHUSDT,SOLUSDT

# 本地 Parquet 模式 (默认)
python3 collector/collect_tick.py --storage local --symbols BTCUSDT

4. 数据质量检查

# 检查所有示例数据
python3 scripts/check_data_quality.py examples/

# 检查具体文件
python3 scripts/check_data_quality.py examples/btcusdt_sample.parquet

5. 运行测试

pip install pytest pytest-asyncio
pytest tests/ -v

数据格式

每个 tick 包含 39 个字段,覆盖 orderbook depth 和 trade 统计。

详见 完整 Schema 文档

快速参考

类别 字段 说明
标识 id, symbol_id, ts 自增 ID, 币种 ID, 毫秒时间戳
订单簿 bp[50], ap[50], bv[50], av[50] 买卖价量, 各 50 档
Long 成交 ln, lv, lq, lmax, lmin, lfirst, llast 买方主动成交统计
Short 成交 sn, sv, sq, smax, smin, sfirst, slast 卖方主动成交统计
BTC 订单簿 btc_bp[50], btc_ap[50], btc_bv[50], btc_av[50] BTC/USDT 参考订单簿
BTC 成交 btc_ln~btc_slast (14 字段) BTC/USDT 成交统计

文件命名

{data_dir}/ticks/{SYMBOL}/{YYYY-MM-DD}/{HH-MM}.parquet

例如: data/ticks/BTCUSDT/2026-06-23/06-45.parquet

🔮 优化方向

  1. 增量压缩: 当前每分钟一个 Parquet 文件,可合并为每小时文件减少 inode 开销
  2. 水平扩展: 支持按币种分组多进程/多机器采集
  3. 实时告警: 接入 Prometheus metrics,异常时推送告警
  4. 回填工具: 自动补齐因重启/网络中断造成的数据缺失
  5. ClickHouse 后端: 为高频查询场景提供列存分析引擎

项目结构

tick-data-pipeline/
├── README.md
├── LICENSE
├── .env.example
├── .gitignore
├── collector/                  # 核心采集器
│   ├── __init__.py
│   ├── collect_tick.py        # 主采集器 (WS + REST snapshot)
│   ├── local_storage.py       # 本地 Parquet 存储后端
│   └── requirements.txt
├── tests/                      # 测试
│   ├── __init__.py
│   ├── test_orderbook.py      # 订单簿 gap 容忍逻辑测试
│   └── test_data_quality.py   # 数据完整性测试
├── scripts/                    # 运维脚本
│   ├── check_data_quality.py  # 数据质量检查
│   └── sample_data.py         # 数据抽样工具
├── docs/                       # 文档
│   ├── DATA_SCHEMA.md         # 完整 39 字段说明

└── examples/                   # 示例
    └── sample_analysis.py     # 样本数据读取演示

部署 (VPS)

本地开发运行即可,生产环境可通过 cron 调度:

# 每 10 小时重启采集器(防止内存累积)
0 */10 * * * /opt/tick-collector/run_10h.sh

数据量估算 (以 10 个示例币种为例)

  • 每秒采集 1 行 / symbol
  • 10 symbols × 1 row/s × 3600s/h = ~36,000 rows/h
  • 每行 ~1KB (zstd compressed) → ~36 MB/h
  • 每日 ~864 MB

数据质量

最新质量评估 (基于 10 个示例币种): 96/100

指标 结果
字段完整性 100% (39/39 字段,无 missing values)
订单簿排序 ✅ 全部正确 (bids 降序, asks 升序)
时间戳单调性 ✅ 单调递增
跨币种一致性 ✅ BTC 参考列一致

License

个人非商业使用许可 — 详见 LICENSE

  • ✅ 个人学习、研究、私下传播
  • ❌ 任何形式的商业用途需授权

About

Binance Futures Tick Data Collector - 本地 Parquet 存储

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages