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 / LeagueTag IDTag slugGhi chú
NBA745nbahighest volume Oct-Jun
NFL450nflpeak Sun/Mon Sep-Feb
Tennis (all)864tennisyear-round, tournament cadence
Soccer (general)1059soccercombine with sub-tags below
EPL739epl
UCL2186uefa-champions-league
Esports (all)702esportsLoL+CS2+Valorant+Dota
MLB1245mlbpeak Apr-Oct
NHL823nhlpeak 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).

Câu hỏi thường gặp

Tag sports nào hoạt động mạnh nhất trên Polymarket?
NBA (tag_id 745), Tennis (tag_id 864), và soccer (thay đổi theo giải đấu) dẫn đầu 24h volume trong mùa của họ. NFL tăng mạnh hàng tuần trong regular season và playoffs. Chúng tôi đã xác minh tag ID NBA và Tennis trong production - các tag khác nên được kiểm tra qua gamma /tags endpoint trước khi dựa vào chúng.
Tôi có thể bot in-game sports markets để có lợi nhuận không?
Có thể - nhưng rất khó. Edge là có thật (live scoreline thường bị định giá sai trong 30-90 giây) nhưng các bot khác cũng đang theo dõi. Kết quả tốt nhất mà chúng tôi thấy đến từ việc kết hợp nguồn live-score nhanh với rule đơn giản (“đội đối phương vừa ghi điểm, market chưa kịp chạy, mua vào”). Pure stat-arb không có data source sẽ thua các đối thủ nhanh hơn.
Tôi lấy live sports data ở đâu?
ESPN.com có các unofficial JSON endpoints trả về live scores - đủ tốt cho nhiều chiến lược. Official APIs (NBA Stats API, NFL public endpoints) đáng tin cậy hơn nhưng chậm hơn. Các tài khoản Twitter của beat reporters cung cấp text nhưng cần LLM parsing. Không có cái nào đạt chuẩn HFT; tất cả đều là “đủ nhanh” cho retail.
Cái bẫy 0.99 / 0.01 là gì?
Khi một sports market ở mức 99 cents YES (gần như chắc chắn thắng), hầu như không còn upside nào đáng kể và một biến động 1 cent có thể xóa sạch kỳ vọng lợi nhuận cả tháng. Nhiều bot bị mắc kẹt khi mua ở 0.99 để đuổi theo cent cuối cùng và bị đánh mạnh khi một sự kiện bất ngờ kéo giá xuống 0.85. Quy tắc cứng: không mua trên khoảng 0.95 trừ khi math expected value của bạn là tuyệt đối chắc chắn.
Polymarket sports so với traditional sportsbooks khác nhau thế nào?
Không có house edge trên spread (so với vig khoảng 5-10% ở FanDuel/DraftKings), nhưng liquidity mỏng hơn và spread có thể rộng hơn. Polymarket rất mạnh với các sự kiện mà traditional books định giá thấp - giải quốc tế, esports, các market ngách. Với NFL/NBA phổ thông, traditional books có liquidity tốt hơn nhưng chi phí vig cao hơn.
Bot của tôi có thể trade đồng thời nhiều sports markets không?
Có - và bạn nên làm vậy. Sports microstructure hoạt động tốt nhất như một portfolio gồm 5-20 trận đồng thời. Hạn mức position mỗi trận (ví dụ 50 USD), hạn mức portfolio (ví dụ 500 USD), và mức exposure không tương quan giữa các trận. Tập trung vào một trận sẽ làm variance tăng tối đa.