ทำไมเรื่องนี้ถึงสำคัญกับคนทำ backtest?
ผมเคยนั่งทำ backtest กลยุทธ์ grid trading บน BTCUSDT แล้วผลออกมากำไร +18% ต่อเดือน พอไปรันจริงกลับขาดทุน สาเหตุหลักไม่ใช่กลยุทธ์ไม่ดี แต่มาจาก ข้อมูล tick ที่ดึงมาใช้ไม่เหมาะกับงาน วันนั้นผมใช้ raw trades ที่มี noise จาก trade เล็ก ๆ ปนอยู่เต็มไปหมด พอเปลี่ยนมาใช้ aggTrades ผลลัพธ์ก็ใกล้เคียงความจริงมากขึ้นทันที
Binance Futures มี endpoint สองตัวที่ให้ข้อมูล trade ระดับ tick ออกมา คือ aggTrades (/fapi/v1/aggTrades) กับ trades (/fapi/v1/trades) ทั้งสองตัวดูคล้ายกันมาก แต่ field, การ aggregate, น้ำหนัก rate limit และการใช้งานต่างกันพอสมควร ถ้าเลือกผิดตั้งแต่ต้น จะเสียเวลาและเงินในภายหลัง
aggTrades คืออะไร? (อธิบายแบบบ้าน ๆ)
aggTrades ย่อมาจาก Aggregated Trades คือ การรวม trade ย่อยที่มีราคาเดียวกันและเกิดในเสี้ยววินาทีเดียวกัน ให้กลายเป็น 1 แถว เช่น ถ้า market maker ยิงคำสั่งซื้อ 12 ครั้งที่ราคา 65,000.50 ภายใน 5 มิลลิวินาที Binance จะรวมเป็น aggTrade แถวเดียวที่มี quantity รวม
Field หลักที่ได้จาก aggTrades มี 7 ตัว:
a— Aggregate trade ID (เลข unique ของแถวนี้)p— ราคา (string เพื่อรักษาทศนิยม)q— ปริมาณรวมที่ aggregate แล้วf— First trade ID ของ trade ย่อยตัวแรกl— Last trade ID ของ trade ย่อยตัวสุดท้ายT— Timestamp หน่วย millisecondsm— Boolean: ฝั่งซื้อเป็น maker ไหม (true = sell aggressor)
raw trades (endpoint /trades) คืออะไร?
raw trades หรือที่บางทีเรียกว่า "trades" ตรง ๆ คือ trade ดิบทุกคำสั่งที่เกิดขึ้นจริง ไม่มีการรวม เหมาะสำหรับงานที่ต้องการความละเอียดระดับ fill-by-fill เช่น ตรวจสอบ manipulation หรือทำ microstructure research
Field หลักที่ได้:
id— Trade ID (ไม่ใช่ aggregate)price— ราคาqty— ปริมาณquoteQty— มูลค่าใน USDTtime— Timestamp (ms)isBuyerMaker— ฝั่งซื้อเป็น maker?isBestMatch— จับคู่ที่ราคาดีที่สุด?
ตารางเปรียบเทียบ field และพฤติกรรม
| หัวข้อ | aggTrades | raw trades (/trades) |
|---|---|---|
| Endpoint | /fapi/v1/aggTrades | /fapi/v1/trades |
| การรวม trade | รวม trade ที่ราคา/เวลาเดียวกัน | ไม่รวม 1:1 |
| จำนวน field | 7 ฟิลด์ | 7 ฟิลด์ (มี quoteQty) |
| Rate limit weight | 20 ต่อ request | 1 ต่อ request (ถี่กว่า 20 เท่าในโควตาเดียวกัน) |
| Limit สูงสุด/ครั้ง | 1,000 แถว | 1,000 แถว |
| ประวัติย้อนหลัง | ใช้ fromId ต่อเนื่องได้ดี | ใช้ fromId ได้แต่ถี่กว่า |
| เหมาะกับงาน | Backtest, สร้าง candle, footprint | Microstructure, forensic, slippage test |
| ขนาดไฟล์ 1 วัน BTCUSDT | ~120 MB | ~450-900 MB |
ภาพหน้าจอแนะนำ: ถ้าเปิด Binance Spot/Futures Testnet ให้ไปที่เมนู "API Documentation" แล้วกดที่ "Market Data" จะเห็นทั้งสอง endpoint พร้อม weight และ example response ฝั่งขวา
ขั้นตอนเรียก API ทั้งสองแบบ (ทำตามได้เลย)
ขั้นแรกติดตั้งไลบรารีที่จำเป็น เปิด terminal แล้วพิมพ์:
pip install requests pandas
แล้วสร้างไฟล์ชื่อ fetch_trades.py แล้ววางโค้ดต่อไปนี้:
import requests
import pandas as pd
========== ดึง aggTrades ==========
url_agg = "https://fapi.binance.com/fapi/v1/aggTrades"
params_agg = {
"symbol": "BTCUSDT",
"limit": 1000 # สูงสุด 1000 ต่อ request
}
resp = requests.get(url_agg, params=params_agg, timeout=10)
resp.raise_for_status()
agg = pd.DataFrame(resp.json())
แปลง timestamp เป็นเวลาในโซน Asia/Bangkok
agg["datetime"] = (
pd.to_datetime(agg["T"], unit="ms", utc=True)
.dt.tz_convert("Asia/Bangkok")
)
print("=== aggTrades ===")
print("จำนวน tick:", len(agg))
print("คอลัมน์:", list(agg.columns))
print(agg[["a", "p", "q", "T", "datetime", "m"]].head())
รันด้วย python fetch_trades.py จะเห็น output ประมาณ 1,000 แถว ใช้เวลา ~120 ms ต่อ request (ตามที่ Binance ระบุไว้ว่า weight = 20)
import requests
import pandas as pd
========== ดึง raw trades ==========
url_raw = "https://fapi.binance.com/fapi/v1/trades"
params_raw = {
"symbol": "BTCUSDT",
"limit": 1000
}
resp = requests.get(url_raw, params=params_raw, timeout=10)
resp.raise_for_status()
raw = pd.DataFrame(resp.json())
raw["datetime"] = (
pd.to_datetime(raw["time"], unit="ms", utc=True)
.dt.tz_convert("Asia/Bangkok")
)
print("=== raw trades ===")
print("จำนวน trade ดิบ:", len(raw))
print("คอลัมน์:", list(raw.columns))
print(raw[["id", "price", "qty", "quoteQty", "time", "datetime"]].head())
เทียบจำนวนแถวในช่วงเวลาเดียวกัน จะเห็นว่า raw trades มีจำนวนมากกว่า aggTrades ประมาณ 4-8 เท่า (ขึ้นกับความผันผวน)
ใช้ AI ช่วยวิเคราะห์ข้อมูล tick แบบอัตโนมัติ
พอดึง tick มาเป็นแสนแถวแล้ว มือใหม่หลายคนจะตาว่อน ๆ ว่าจะ filter ยังไง โชคดีว่าเรามี AI ให้ใช้ สมัคร HolySheep แล้วส่งตัวอย่าง tick ให้โมเดลช่วยสรุป pattern ได้ทันที:
import requests
import json
เตรียม tick ตัวอย่าง 50 แถวแรกส่งให้ AI
sample = agg.head(50).to_dict(orient="records")
url = "https://api.holysheep.ai/v1/chat/completions"
headers = {
"Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-v3.2", # $0.42/MTok ประหยัดกว่า GPT-4.1 ถึง 19 เท่า
"messages": [
{"role": "system", "content": "คุณคือนักวิเคราะห์ quantitative trading"},
{"role": "user", "content": (
"วิเคราะห์ข้อมูล aggTrades ต่อไปนี้ "
"แล้วบอกว่าช่วงนี้ฝั่งซื้อหรือฝั่งขายกดดันตลาดมากกว่า: "
f"{json.dumps(sample, default=str)}"
)}
],
"max_tokens": 400,
"temperature": 0.3
}
resp = requests.post(url, headers=headers, json=payload, timeout=30)
print(resp.json()["choices"][0]["message"]["content"])
ลองรันดูจะได้คำตอบเป็นภาษาไทยแบบที่อ่านเข้าใจง่าย เช่น "ในช่วง 50 แถวแรก มี sell aggressor 62% ของปริมาณ แสดงถึงแรงกดดันฝั่งขาย" เป็นต้น
เหมาะกับใคร / ไม่เหมาะกับใคร
เหมาะกับ
- คนทำ backtest กลยุทธ์ HFT/scalping ที่ต้องการข้อมูลรวดเร็ว
- คนสร้าง footprint chart, volume profile, delta divergence
- นักพัฒนาที่ต้องการข้อมูลย้อนหลังหลายปี โดยไม่เปลือง bandwidth
ไม่เหมาะกับ
- งาน forensic ที่ต้องระบุ trade ID ย่อยทุกตัว (ต้องใช้ raw)
- งานวิจัยระดับ order book microstructure ที่ต้องการ quoteQty ต่อ fill
- คนที่ต้องการข้อมูล real-time สำหรับ HFT จริง ๆ (ต้องใช้ WebSocket แทน REST)
ราคาและ ROI ของการใช้ AI ช่วยวิเคราะห์
| โมเดล | ราคา 2026 (USD/MTok) | ค่าใช้จ่ายต่อคำขอ 1,000 tick* | ความเร็วเฉลี่ย |
|---|---|---|---|
| DeepSeek V3.2 | $0.42 | ~$0.00025 | 42 ms |
| Gemini 2.5 Flash | $2.50 | ~$0.0015 | 38 ms |
| GPT-4.1 | $8.00 | ~$0.0048 | 165 ms |
| Claude Sonnet 4.5 | $15.00 | ~$0.0090 | 210 ms |
*คำนวณจาก prompt 2,000 tokens + completion 400 tokens
ถ้าเปลี่ยนจาก GPT-4.1 ($8/MTok) มาใช้ DeepSeek V3.2 ($0.42/MTok) ประหยัดได้ประมาณ 94.75% และความเร็วเพิ่มขึ้นเกือบ 4 เท่า ส่วน HolySheep คิดในอัตรา 1¥ = $1 (ส่วนใหญ่ราคาถูกกว่าคู่แข่งที่คิด ¥7-¥8/$1 ถึง 85%+) จ่ายผ่าน WeChat หรือ Alipay ได้ และทดสอบ latency จริงได้ <50 ms