Polymarket Bot Tutorial · Chương 17 trong 32
Dùng order book imbalance của Polymarket như một tín hiệu giá ngắn hạn: tỷ lệ khối lượng bid-ask, tính toán microprice, signal half-life, và khi nào imbalance bots đánh bại random execution.
Chương này bao gồm gì
Order-book imbalance là tỷ lệ giữa độ sâu phía mua và độ sâu phía bán trên limit order book. Trên Polymarket, nó có một lợi thế dự báo có thật nhưng tồn tại rất ngắn - thường là 5-30 giây trước khi mid di chuyển. Chương này trình bày pattern tính toán và các điều kiện mà dưới đó tín hiệu sẽ sai.
- Order book imbalance là gì
- Tính toán microprice
- Imbalance như một tín hiệu direction
- Signal half-life trên Polymarket
- Khi tín hiệu imbalance sai
- Code: tính imbalance mỗi WS tick
Order book imbalance là gì
Order book imbalance là tỷ lệ giữa tổng độ sâu phía mua và tổng độ sâu phía bán trên limit order book. Khi được tính ở top-N level (thường N=5), nó phản ánh áp lực trader tổng hợp mà mid-price vẫn chưa thể hiện.
Công thức: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). Phạm vi từ -1 đến +1; giá trị dương nghĩa là áp lực mua lớn hơn, âm nghĩa là áp lực bán lớn hơn.
Tín hiệu này thực sự tồn tại trên Polymarket nhưng rất nhiễu. Một whale duy nhất có thể tạo imbalance giả trong 30-60 giây trước khi bị arb loại bỏ. Nó hữu ích như một feature trong nhiều feature, nhưng nguy hiểm nếu dùng làm trigger duy nhất.
Tính toán microprice
Microprice là một phiên bản tinh chỉnh của mid đơn giản: một weighted average của best bid và best ask, được weight theo kích thước tương ứng của chúng.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
Khi hàng đợi phía bid lớn hơn rất nhiều so với phía ask, microprice sẽ nằm gần ask hơn. Logic là: có nhiều người mua đang chờ nghĩa là giao dịch tiếp theo có nhiều khả năng đẩy lên ask, nên fair value sẽ gần ask hơn.
Microprice là một chỉ báo leading 5-30 giây cho việc mid thực sự di chuyển. Các production bots dùng nó làm reference price cho quyết định take-profit thay vì mid ngây thơ.
Imbalance như một tín hiệu direction
Từ quan sát production: khi imbalance đảo từ -0.3 sang +0.5 trong 10 giây mà không có sự kiện tin tức đi kèm, mid tăng 1-2 cent trong 30-60 giây tiếp theo khoảng 65% thời gian.
Đó là một edge thực sự nhưng sẽ tan biến ở position size nhỏ sau khi trừ fee. Để kiếm tiền, bot phải size đủ lớn để bắt được biến động trừ fee, nhưng vẫn đủ nhỏ để không tự làm dịch chuyển order book. Order book của Polymarket thường mỏng đến mức bất kỳ lệnh nào trên 50 shares đều có thể làm thị trường di chuyển.
Kết hợp imbalance với các feature khác: trade velocity (nhiều trades hơn = tín hiệu thật), best-bid thực sự đang tăng lên (không chỉ là depth thay đổi), thị trường không ở chế độ bị tin tức chi phối.
Signal half-life trên Polymarket
Tín hiệu imbalance sẽ suy giảm. Dữ liệu production từ trader của chúng tôi: imbalance > 0.6 → expected mid move 1.2c trong vòng 60s, half-life khoảng ~30s. Sau 90 giây, giá trị dự báo gần như về 0.
Hệ quả cho thiết kế bot: phản ứng nhanh hoặc bỏ qua. Một bot mất 15 giây để quyết định sẽ tiêu hao mất một nửa edge trước khi đặt lệnh. Latency budget cho chiến lược imbalance nên dưới 5 giây từ lúc có signal đến lúc FOK được kích hoạt.
Các chiến lược giữ position lâu hơn half-life (1-2 phút) là đang cược vào tín hiệu tiếp theo, không phải tín hiệu hiện tại. Hãy nói rõ điều này; đừng vô tình giữ các position dựa trên imbalance đến tận lúc resolution.
Khi tín hiệu imbalance sai
Tín hiệu sẽ gây hiểu lầm khi một trong ba điều kiện sau xảy ra.
- News-driven move: imbalance là hệ quả của một tin tức mà bạn chưa thấy. Trade ngược lại sẽ thua; trade theo nó là news arbitrage, một chiến lược khác.
- Whale spoofing: một lệnh lớn được đặt và hủy rất nhanh tạo ra imbalance giả trong suốt thời gian tồn tại. Hãy lọc bằng cách kiểm tra rằng imbalance duy trì 10+ giây trước khi kích hoạt.
- End-of-period rebalancing: market makers rút quote vì lý do inventory chứ không phải reason về thông tin. Imbalance sẽ đảo chiều vài phút sau khi MM re-quote.
Bộ lọc kết hợp là: imbalance > threshold AND trade velocity > baseline AND không có sự kiện tin tức trong 5 phút gần nhất. Mỗi bộ lọc riêng lẻ đều có quá nhiều false positives.
Code: tính imbalance mỗi WS tick
Reference: subscribe vào WebSocket book updates, tính lại imbalance trên mỗi tick.
def on_book_message(msg):
bids = msg.get("bids", [])[:5]
asks = msg.get("asks", [])[:5]
bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
total = bid_usd + ask_usd
if total < 100: return # illiquid
imb = (bid_usd - ask_usd) / total
state[msg["asset_id"]] = {
"imb": imb,
"best_bid": float(bids[0]["price"]) if bids else 0,
"best_ask": float(asks[0]["price"]) if asks else 1,
"ts": time.time()
}
# decision logic with cooldown + filters
if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
check_filters_and_maybe_fire(msg["asset_id"])
State là theo từng token. Cooldown ngăn việc bắn lệnh quá nhiều trên cùng một tín hiệu. Filters (news check, trade velocity) sẽ gate giao dịch thực tế.





