เมื่อวันจันทร์ที่ผ่านมา ผมเปิด notebook เพื่อดึงข้อมูล tick Binance BTCUSDT ช่วง 1 มกราคม 2024 ถึง 30 มิถุนายน 2024 แล้วเจอ error นี้เข้าให้:
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='csv.tardis.dev', port=443):
Max retries exceeded with url: /binance-futures/book_snapshot_25/BTCUSDT/2024-01-01.csv.gz
(Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object>,
'Connection to csv.tardis.dev timed out after 60 seconds'))
ปัญหานี้เกิดขึ้นบ่อยครั้งเวลาโหลด CSV ของ Tardis ขนาดใหญ่ เพราะ Tardis เป็น data provider ที่ให้ historical tick data (orderbook snapshot, trades, derivatives) ของ crypto exchange หลายสิบเจ้า ไฟล์ต่อวันบางชุดมีขนาด 30–50 GB และต้องโหลดผ่าน HTTP GET ธรรมดา พอไฟล์ใหญ่หรือ network สะดุดจึง timeout กลางทาง แล้ว partial file ที่ download ได้จะเสียหายทั้งหมด ต้องเริ่มใหม่ตั้งแต่ต้น ผมใช้เวลา 3 ชั่วโมงเต๊อะกว่าจะออกแบบ incremental sync ที่รองรับการ resume ได้อย่างแท้จริง ในบทความนี้ผมจะแชร์ pipeline ที่ทำงานได้จริง พร้อมเปรียบเทียบแนวทางต่าง ๆ และทำไมผมถึงใช้ LLM ของ HolySheep AI ช่วยสร้าง schema migration และ unit test ให้เร็วขึ้น 10 เท่า
ทำไม Tardis CSV ถึงต้องใช้ Incremental Sync
Tardis มีคลังข้อมูล tick-level ของ crypto exchange มากกว่า 20 เจ้า (Binance, OKX, Bybit, Deribit, FTX archives) มี endpoint หลัก 3 รูปแบบ:
https://csv.tardis.dev/{exchange}-{type}/{symbol}/YYYY-MM-DD.csv.gz— ไฟล์ CSV.gz รายวันต่อ symbolhttps://tardis.dev/v1/data/<type>?...— REST API แบบ ranged downloadwss://tardis.dev/v1/data-replay— WebSocket replay สำหรับ simulate feed
ถ้าคุณ backtest multi-asset strategy เช่น cross-exchange arbitrage หรือ perp funding rate modeling ปกติต้องโหลดข้อมูลหลายร้อยถึงหลายพัน symbol-years การโหลดครั้งเดียว (bulk download) ไม่เวิร์ค เพราะ:
- Resumability: ไฟล์ใหญ่มีโอกาส timeout สูง
- Deduplication: ต้องรู้ว่าวันไหนโหลดไปแล้ว
- Schema evolution: Tardis มีการเพิ่ม field ใหม่ (เช่น
local_timestamp) ต้องเขียน migration - Storage cost: CSV.gz ขนาด 50 GB/วันต้องบีบอัดเป็น Parquet/Arrow เพื่อ query เร็วใน DuckDB หรือ ClickHouse
สถาปัตยกรรม Incremental Sync Pipeline
ผมออกแบบ pipeline แบบ idempotent 4 ขั้นตอน:
- Manifest Sync: ดึง daily manifest จาก Tardis เก็บ checksum และ size ใน SQLite
- Download Worker: โหลด CSV.gz ด้วย ranged HTTP + resume capability
- Decompress & Validate: ตรวจ checksum และ row count
- Transform & Load: convert เป็น Parquet แล้ว upsert เข้า ClickHouse partitioned by date/symbol
"""
tardis_sync
แหล่งข้อมูลที่เกี่ยวข้อง