Polymarket Bot Tutorial · Chương 15 trên 32
Sports microstructure bots trên Polymarket: edge trong lúc trận đang diễn ra, mispricing do diễn biến tỷ số, tag NBA (745) và Tennis tag (864), live data sources, và execution patterns cho high-frequency sports markets.
Chương này bao gồm những gì
Sports markets là phân khúc non-political hoạt động nhất một cách nhất quán trên Polymarket. Những bot hiệu quả rơi vào hai nhóm rõ ràng: pre-game line-catchers, giao dịch sau khi line đã được thiết lập, và in-game microstructure bots, phản ứng với biến động order book trong lúc trận đấu diễn ra. Chương này bao quát cả hai với các tag ID cụ thể, data sources, và latency budgets áp dụng cho từng loại.
Sports markets là phân khúc non-political bận rộn nhất trên Polymarket. Execution pattern hiệu quả kết hợp live-score feed (ESPN, PandaScore) với order-book microstructure signals. Chương này trình bày cụ thể những gì hiệu quả cho NFL, NBA, soccer, và tennis, và esports khác ở điểm nào.
- Tại sao sports markets có thể giao dịch
- Pre-game vs in-game (hai bot khác nhau)
- Verified tag IDs (745 NBA, 864 Tennis)
- Data sources: ESPN, official APIs, on-screen
- Latency budget cho in-game
- Cái bẫy 0.99 / 0.01
- Code: subscribe vào games book và phản ứng
Tại sao sports markets có thể giao dịch
Sports markets khép lại trong khung thời gian xác định (từ vài giờ đến vài ngày), có public live data, và thu hút continuous order flow trong suốt trận đấu. Cả ba điều này đều cần thiết để một market có thể giao dịch - political markets thiếu “khung thời gian xác định,” weather markets thiếu “continuous flow,” còn các tournament ít người biết thiếu “public live data.”
Nhóm trader trên sports markets cũng đa dạng hơn so với, chẳng hạn, election markets. Người chơi cá cược thể thao thông thường định giá theo cảm xúc; trader hiểu biết sẽ điều chỉnh về fair value trong suốt trận đấu. Khoảng cách giữa hai nhóm chính là bot edge.
Phân bổ volume rất không đồng đều: một Chủ nhật NFL có thể xoay chuyển hàng trăm triệu USD trên các Polymarket sports markets; một trận Saudi Pro League tối thứ Ba có thể chỉ dưới 50k USD. Hãy điều chỉnh chiến lược theo nơi thực sự có dòng tiền.
Pre-game vs in-game (hai bot khác nhau)
Hai thiết kế bot hoàn toàn khác nhau về bản chất.
Pre-game line-catcher: quét các market vừa mở, xác định các line bị định giá sai so với model của bạn hoặc so với một venue sắc hơn, đặt một FOK buy. Giữ đến in-play, đôi khi đến khi có kết quả. Tốc độ: tính bằng phút, không phải giây. Edge: model + line-shopping.
In-game microstructure: subscribe vào WebSocket order book của một trận đang diễn ra, phản ứng với imbalance signals + score events trong vòng vài giây. Tốc độ: tính bằng giây, không phải phút. Edge: latency + đọc order flow.
Hai loại này gần như không dùng chung code. Chúng có risk profiles khác nhau, data sources khác nhau, và exit strategies khác nhau. Một bot cố làm cả hai thường sẽ không làm tốt cái nào; hãy chọn một.
Verified tag IDs (745 NBA, 864 Tennis)
Tag ID production đã được xác minh vào tháng 5 năm 2026 cho các danh mục sports chính. Dùng các tag này để lọc các lệnh gọi /events một cách hiệu quả.
| Sport / League | Tag ID | Tag slug | Ghi chú |
|---|---|---|---|
| NBA | 745 | nba | highest volume Oct-Jun |
| NFL | 450 | nfl | peak Sun/Mon Sep-Feb |
| Tennis (all) | 864 | tennis | year-round, tournament cadence |
| Soccer (general) | 1059 | soccer | combine with sub-tags below |
| EPL | 739 | epl | |
| UCL | 2186 | uefa-champions-league | |
| Esports (all) | 702 | esports | LoL+CS2+Valorant+Dota |
| MLB | 1245 | mlb | peak Apr-Oct |
| NHL | 823 | nhl | peak Oct-Jun |
Tag ID ổn định qua các năm. Tag mới vẫn được thêm vào (Saudi Pro League, IPL) nhưng tag cũ không bị đổi số.
Data sources: ESPN, official APIs, on-screen
Với traditional sports, free ESPN scoreboard API bao phủ mọi thứ bạn cần: scores, period/clock, win-probability, đôi khi cả shot location. Không cần key; chỉ bị rate-limit ở cấp IP. Mẫu endpoint: https://site.api.espn.com/apis/site/v2/sports/<sport>/<league>/scoreboard.
Với esports, ESPN không có coverage. Các lựa chọn: PandaScore (30-60 USD/tháng, tiêu chuẩn ngành), HLTV (chỉ CS2, có thể scrape, không có API), Liquipedia (do cộng đồng duy trì, có thể scrape, cadence cập nhật chậm hơn).
On-screen feeds (trả tiền cho TV stream và dùng OCR đọc scorebug) có thể hoạt động nhưng vận hành rất nặng. Chỉ nên dùng nếu bạn có chiến lược cần cập nhật dưới 3 giây cho một môn mà không có API nào cung cấp real time.
Latency budget cho in-game
Latency budget end-to-end cho một bot phản ứng trong lúc trận diễn ra.
- Score event xảy ra: t=0
- Source feed phản ánh: t+3-15s (ESPN: ~10s; PandaScore: ~3s)
- Bot của bạn đọc feed: t+10-16s
- Bot quyết định hành động: +50ms
- Đặt FOK order: +200-500ms
- Khớp tại CLOB: +300-1000ms (network + matching)
Tổng cộng: 11-17 giây. Các firm chuyên nghiệp nhanh nhất đạt 3-5 giây end-to-end với paid premium feeds và VPS colocated. Retail bots chạy trên host tiêu chuẩn và free ESPN sẽ nằm ở phía chậm hơn.
Các chiến lược cần dưới 5 giây không khả thi cho retail. Những chiến lược có thể hoạt động trong khung 10-17 giây là: line-catching sau một bàn/thành công, fade các phản ứng quá mức, các cược certainty ở cuối trận.
Cái bẫy 0.99 / 0.01
Lỗi bot sports in-play phổ biến nhất: mua heavy favorite ở mức 0.99 khi còn một phút, kỳ vọng dễ kiếm +1¢. Có ba lý do khiến nó thất bại.
Thứ nhất, xác suất 1% của underdog không phải là zero - các cú lội ngược dòng muộn vẫn xảy ra với tần suất không nhỏ. Một kèo thắng 99.5% nếu chơi 200 lần sẽ tạo ra một lần thua với toàn bộ position size.
Thứ hai, spread ở mức 0.99/0.01 có nghĩa là bạn trả 99c mỗi share, chỉ thắng 1c khi thành công, và mất 99c trong trường hợp đảo chiều hiếm hoi. Risk-reward rất tệ.
Thứ ba, bot dùng GTC sell ở 0.999 sẽ hiếm khi được khớp - không có người mua ở mức giá đó. Position sẽ bị giữ đến khi có kết quả. Nếu thắng, bạn kiếm được 1c. Nếu có đảo chiều, bạn mất 99c.
Cái bẫy này là tiền thật bị mất bởi những builder không tính kỹ. Hãy tránh xa các market có giá 0.95+ trừ khi chiến lược của bạn được thiết kế riêng cho redemption-arbitrage profile.
Code: subscribe vào games book và phản ứng
Tham khảo: subscribe vào WebSocket của một trận NBA cụ thể, ghi log book updates, bắn FOK khi có tín hiệu imbalance.
import websocket, json
THRESHOLD = 0.5 # imbalance level to trigger
def on_message(ws, message):
msg = json.loads(message)
if msg.get("event_type") != "book": return
bids = msg.get("bids", [])
asks = msg.get("asks", [])
bid_depth = sum(float(b["price"]) * float(b["size"]) for b in bids[:5])
ask_depth = sum(float(a["price"]) * float(a["size"]) for a in asks[:5])
total = bid_depth + ask_depth
if total < 100: return # too illiquid
imb = (bid_depth - ask_depth) / total
if abs(imb) > THRESHOLD:
print(f"signal imb={imb:.2f} bid={bid_depth:.0f} ask={ask_depth:.0f}")
# fire FOK here
ws = websocket.WebSocketApp(
"wss://ws-subscriptions-clob.polymarket.com/ws/market",
on_open=lambda ws: ws.send(json.dumps({"type":"Market","markets":["<CONDITION_ID>"]})),
on_message=on_message
)
ws.run_forever()
Phần bổ sung production: cooldown giữa các lệnh bắn, per-token inventory cap, kill khi book stale (không có message trong 30s).





