คำตอบสั้นสำหรับผู้รีบอ่าน: ข้อมูล 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

สถาปัตยกรรมระบบ

โค้ดที่ 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