ผมเคยเสียเวลากว่า 3 เดือนในการสร้างกลยุทธ์ Mean Reversion บน BTCUSDT Perpetual ก่อนจะพบว่าผล backtest ที่ได้แตกต่างจากผล Paper Trade อย่างมาก ต้นเหตุสำคัญไม่ใช่กลยุทธ์ แต่เป็น คุณภาพของข้อมูล K-line ที่ดึงจาก API — บางแท่งขาดหาย บางช่วงเวลาถูก rate-limit ตัดทอน และบางครั้ง Open/Close กลับด้านจากต้นฉบับ บทความนี้เป็นรีวิวจากการใช้งานจริง โดยดึงข้อมูล K-line ของสัญญา Perpetual จาก 3 แหล่ง ได้แก่ Binance USDⓈ-M Futures, OKX และ Tardis เปรียบเทียบกันแบบเป็นกลาง พร้อมให้คะแนนใน 5 มิติหลัก
เกณฑ์การประเมิน 5 ด้าน (ที่ผมใช้ตัดสินใจเลือกแหล่งข้อมูล)
- ความหน่วง (Latency, ms) — เวลาตอบสนองเฉลี่ยและ p95 ต่อ request ขนาด 1,500 แท่ง
- อัตราสำเร็จ (Success Rate, %) — สัดส่วน request ที่สำเร็จเมื่อยิง 500,000 ครั้งภายใน 7 วัน
- ความครอบคลุมข้อมูลย้อนหลัง (Depth) — ข้อมูลเริ่มตั้งแต่เมื่อใด, ดึงได้สูงสุดกี่แท่ง/ครั้ง
- Rate Limit (req/min) — เพดานการเรียกที่โควต้าฟรีอนุญาต
- ต้นทุนรายเดือน (USD) — ค่าใช้จ่ายรวมเมื่อดึงข้อมูล 1M แท่ง/เดือน
1. Binance USDⓈ-M Futures K-Line API
Endpoint หลักคือ https://fapi.binance.com/fapi/v1/klines รองรับช่วงเวลาตั้งแต่ 1s ถึง 1M และคืนค่าสูงสุด 1,500 แท่งต่อ request ข้อมูล BTCUSDT Perpetual ย้อนหลังได้ถึงปี 2019 โดยไม่ต้องจ่ายค่าสมาชิก ข้อดีคือฟรีและ latency ต่ำ ข้อเสียคือโควต้า Rate Limit และ IP-based quota ที่แชร์กับ endpoint อื่น
import requests, time
BASE = "https://fapi.binance.com"
def fetch_binance_klines(symbol: str, interval: str,
start_ms: int, end_ms: int,
limit: int = 1500):
url = f"{BASE}/fapi/v1/klines"
params = {"symbol": symbol, "interval": interval,
"startTime": start_ms, "endTime": end_ms,
"limit": limit}
r = requests.get(url, params=params, timeout=10)
r.raise_for_status()
return r.json() # คืน list ของ [openTime, o, h, l, c, v, ...]
ดึง BTCUSDT 1h