คำตอบสั้นสำหรับผู้รีบอ่าน: ข้อมูล L2 incremental (depth diff) ของ ETH จาก Tardis.dev มาเป็น JSON ต่อ event ระดับ millisecond ครอบคลุม 30+ กระดานเทรด เราสร้าง order book แบบทุกระดับราคา (per-level) ได้ด้วยโครงสร้าง SortedDict แล้วใช้กฎ 3 ข้อในการตรวจจับ tick ผิดปกติ ได้แก่ spread กระโดดเกิน 5%, ปริมาณเป็น 0 ซ้ำผิดปกติ, และราคาออกนอกช่วง ±0.5% จาก mid จากนั้น feed เข้า LLM ของ HolySheep ผ่าน base_url https://api.holysheep.ai/v1 เพื่อสร้างสรุปเชิงกลยุทธ์เป็นภาษาไทย บทความนี้มีโค้ด Python รันได้จริง 4 บล็อก ตารางเปรียบเทียบราคา 4 โมเดล และส่วนแก้ไขข้อผิดพลาด 3 กรณี
ทำไม L2 Incremental สำคัญกว่า Snapshot
Snapshot ของ order book แบบเต็มชั้น (เช่น 20 ระดับ) ให้ภาพรวม แต่ข้อมูล L2 incremental ให้ความแม่นยำระดับ event-by-event ซึ่งจำเป็นสำหรับการ backtest กลยุทธ์ HFT และการคำนวณ VWAP ตาม Tardis.dev (GitHub ~1.5k+ stars, กล่าวถึงบ่อยใน r/algotrading) ระบุว่า depth diff ของพวกเขามีความครบถ้วน 99.97% เมื่อเทียบกับ raw feed ของ Binance
สถาปัตยกรรมระบบ
- ชั้นข้อมูล: Tardis.dev REST + WebSocket ส่ง depth diff ของ ETHUSDT จาก Binance
- ชั้นประมวลผล: Python SortedDict สร้าง order book แบบ per-level
- ชั้นตรวจจับ: กฎ heuristic 3 ข้อกรอง tick ผิดปกติ
- ชั้นวิเคราะห์: เรียก HolySheep API (
https://api.holysheep.ai/v1/chat/completions) สร้างสรุปเชิงกลยุทธ์
โค้ดที่ 1: ดึง depth diff จาก Tardis และสร้าง Order Book แบบ per-level
"""
ดึงข้อมูล L2 incremental ของ ETHUSDT จาก Tardis
และสร้าง order book แบบทุกระดับราคา
รันได้: pip install requests sortedcontainers
"""
import os, json, gzip, requests
from sortedcontainers import SortedDict
TARDIS_KEY = os.environ.get("TARDIS_API_KEY", "YOUR_TARDIS_KEY")
SYMBOL = "ETHUSDT"
EXCHANGE = "binance"
DATE = "2024-01-15"
class OrderBook:
"""Order book แบบ per-level ใช้ SortedDict"""
def __init__(self):
self.bids = SortedDict() # key=price (ลบเพื่อให้ peekitem(-1) ได้ราคาสูงสุด)
self.asks = SortedDict()
self.last_ts = None
def apply(self, delta: dict):
for side_key, book in [("bids", self.bids), ("asks", self.asks)]:
for lvl in delta.get(side_key, []):
px = float(lvl["price"])
qty = float(lvl["amount"])
if qty == 0:
book.pop(px, None)
else:
book[px] = qty
self.last_ts = delta.get("timestamp")
def top(self):
bb = self.bids.peekitem(-1) if self.bids else None # (price, qty)
ba = self.asks.peekitem(0) if self.asks else None
if bb and ba:
return {"best_bid": bb[0], "best_ask": ba[0],
"spread": round(ba[0] - bb[0], 4)}
return None
1) ดึง manifest ของไฟล์ snapshot
manifest = requests.get(
f"https://api.tardis.dev/v1/markets/{EXCHANGE}/{SYMBOL}.json",
headers={"Authorization": f"Bearer {TARDIS_KEY}"},
timeout=10
).json()
2) ดาวน์โหลด depth diff ไฟล์แรกของวัน
url = next(f for f in manifest["datasets"]["incremental_book_L2"]
if DATE in f["date"])
raw = requests.get(url["url"], timeout=30).content
lines = gzip.decompress(raw).decode("utf-8").splitlines()
3) ประมวลผล 1,000 events แรก
ob = OrderBook()
for i, line in enumerate(lines[:1000]):
ev = json.loads(line)
if ev["type"] != "book_change":
continue
ob.apply({
"bids": ev["bids"], "asks": ev["asks"],
"timestamp": ev["timestamp"]
})
if i % 200 == 0:
print(f"event {i}: {ob.top()}, depth_bids={len(ob.bids)}")
print("final top:", ob.top())
โค้ดที่ 2: ตรวจจับ tick ผิดปกติ 3 รูปแบบ
"""
กฎตรวจจับ tick ผิดปกติ:
R1: spread_jump - spread เปลี่ยนเกิน 5% ภายใน 1 วินาที
R2: zero_qty_loop - ระดับราคาเดิมถูกอัปเดตเป็น 0 ซ้ำเกิน 3 ครั้ง
R3: out_of_band - mid price เบี่ยงเบนจาก rolling median เกิน 0.5%
"""
from