Pred-Data 取得賠率數據

實作教學

如何用 Python 取得即時運動賠率

逐步 Python 教學:列出運動、找賽事、取得多家博彩公司賠率、計算隱含機率與抽水、用 /odds/multi 批次查詢,並透過 WebSocket 串流即時價格。

最後更新: · 撰寫與審閱: Ken Lin

合作連結 合作連結 — 我們可能因此獲得佣金,詳見聯盟行銷揭露。

快速解答

只要一把 Odds-API.io 金鑰和約 40 行 Python,就能列出賽事、取得多家博彩公司的價格、換算成隱含機率並串流即時更新。REST 基礎網址為 https://api.odds-api.io/v3,金鑰放在 apiKey 查詢參數 [1] [2]。

你需要準備

你需要準備: Python 3.9 以上、requests 與 websockets 套件,以及 API 金鑰。新的免費金鑰已暫停發放;方案從每月 £49 起,含 2 家博彩公司與每小時 5,000 次請求 [1] [3]。

取得金鑰: Odds-API.io 合作連結

合作連結 — 我們可能因此獲得佣金,詳見聯盟行銷揭露。

程式碼測試狀態: 本教學的 Python 程式碼是以 Odds-API.io 文件中公布的範例回應執行測試(2026 年 11 月 3 日查核),並未使用真實 API 金鑰。實際回應可能有更多欄位;程式只讀取文件中列出的欄位。

1. 安裝套件並保存金鑰

把金鑰放在環境變數中,不要寫進程式碼 [1]。

python -m pip install requests websockets
export ODDS_API_KEY="your-api-key"   # Windows PowerShell: $env:ODDS_API_KEY="your-api-key"

2. 列出運動與即將開賽的賽事

/sports 不需要金鑰。/events 需要運動參數,並可加上 league、status(例如 pending、live)、日期區間與 limit [4]。

import os
import requests

BASE = "https://api.odds-api.io/v3"
API_KEY = os.environ["ODDS_API_KEY"]   # never hard-code or commit your key
BOOKMAKERS = "Bet365,Unibet"           # use bookmakers selected on your plan

def get(path, **params):
    """GET an Odds-API.io v3 endpoint and return parsed JSON."""
    params["apiKey"] = API_KEY
    r = requests.get(BASE + path, params=params, timeout=20)
    if r.status_code == 429:
        raise RuntimeError("Rate limit reached - wait before retrying")
    r.raise_for_status()
    return r.json()

sports = requests.get(BASE + "/sports", timeout=20).json()   # no key needed
print([s["slug"] for s in sports][:10])

events = get("/events", sport="football", league="england-premier-league",
             status="pending", limit=10)
for e in events:
    print(e["id"], e["date"], e["home"], "v", e["away"])

3. 取得賠率並計算隱含機率

/odds 接受一個 eventId、最多 30 家 bookmakers,以及可選的 markets 篩選;價格為小數字串 [4] [1]。程式把它們換成隱含機率、按比例去除超額機率,並找出每個結果的最佳價格,數學與隱含機率與去抽水計算機相同。

def ml_prices(event_odds):
    """{bookmaker: {"home": 2.1, "draw": 3.4, "away": 3.2}} from one /odds response."""
    out = {}
    for book, markets in event_odds.get("bookmakers", {}).items():
        for m in markets:
            if m["name"] == "ML" and m.get("odds"):
                row = m["odds"][0]
                out[book] = {k: float(row[k]) for k in ("home", "draw", "away") if k in row}
    return out

event_id = events[0]["id"]
prices = ml_prices(get("/odds", eventId=event_id, bookmakers=BOOKMAKERS, markets="ML"))

for book, p in prices.items():
    booksum = sum(1 / o for o in p.values())                 # implied probabilities
    fair = {side: (1 / o) / booksum for side, o in p.items()}  # proportional no-vig
    print(f"{book}: overround {booksum - 1:.2%}",
          {side: f"{q:.1%}" for side, q in fair.items()})

best = {}
for book, p in prices.items():
    for side, o in p.items():
        if o > best.get(side, (0, ""))[0]:
            best[side] = (o, book)
print("Best price per outcome:", best)

以文件中的範例回應(Bet365 2.10/3.40/3.20)執行,會印出超額機率 8.28%。

4. 一次請求批次查詢最多 10 場

/odds/multi 一次回傳最多 10 場賽事的賠率,只算一次請求;在每小時 5,000 次的額度下很重要 [4] [3]。

ids = ",".join(str(e["id"]) for e in events[:10])   # up to 10 events
for ev in get("/odds/multi", eventIds=ids, bookmakers=BOOKMAKERS, markets="ML"):
    print(ev["home"], "v", ev["away"], ml_prices(ev))

5. 用 WebSocket 串流即時價格

比賽中快速變動的價格請用 WebSocket 推送:wss://api.odds-api.io/v3/ws。markets 篩選為必填,連線必須支援 permessage-deflate(Python websockets 支援,websocket-client 會被拒絕),而且每則 updated 訊息都帶完整的市場集合,所以要直接取代已存資料而不是合併 [5]。WebSocket 為付費加購 [3]。

import asyncio, json, os
from urllib.parse import urlencode
import websockets   # needs permessage-deflate; "websocket-client" is refused

STATE = {}   # (event id, bookmaker) -> list of markets

async def stream():
    qs = urlencode({"apiKey": os.environ["ODDS_API_KEY"], "markets": "ML",
                    "sport": "football", "status": "live"})
    async with websockets.connect(f"wss://api.odds-api.io/v3/ws?{qs}",
                                  ping_interval=30, ping_timeout=10) as ws:
        async for raw in ws:
            msg = json.loads(raw)
            if msg["type"] in ("created", "updated"):
                STATE[(msg["id"], msg["bookie"])] = msg["markets"]   # replace, never merge
                for m in msg["markets"]:
                    if m["name"] == "ML" and m.get("odds"):
                        print(msg["id"], msg["bookie"], m["odds"][0])
            elif msg["type"] in ("deleted", "no_markets"):
                STATE.pop((msg["id"], msg["bookie"]), None)

asyncio.run(stream())

6. 下一步

把價格丟進套利計算機或期望值(+EV)計算機,或讓 API 直接計算:見用 Odds-API.io 找套利與 +EV。要與 Polymarket、Kalshi 比較,請看預測市場價格與博彩賠率比較。

常見問題

需要付費方案嗎?

新用戶需要:新的免費金鑰已暫停,方案從每月 £49 起。既有免費金鑰仍可使用,每小時 100 次、每日上限 500 次。

可以查哪些博彩公司?

你方案中選定的博彩公司。查詢其他公司不會有資料回傳。

REST 還是 WebSocket?

快照與單次查詢用 REST;需要持續更新的價格用 WebSocket。官方文件建議即時數據使用 WebSocket。

關於本指南

Pred-Data 發布關於預測市場及相關 AI 工具的獨立解說,所有事實陳述都附上一手或可信的二手來源連結,並於上方日期查核。我們不經營交易平台、不接受投注,也不提供個人化建議。

作者:Ken Lin · 更正:如發現錯誤,我們會審核並標註修正日期。

聯盟行銷揭露

本站部分連結(標示「合作連結」)可能是聯盟行銷連結:若你透過這些連結註冊,我們可能獲得佣金,你無須支付額外費用。合作連結使用 rel="sponsored nofollow",且不會影響我們的評估。比較表中的平台連結均為官方網站的一般連結,並非聯盟連結。

資料來源

  1. Quickstart (get a key, first calls, example responses) — Odds-API.io docs, 2026 年 11 月 2 日查閱
  2. AI & Vibe Coding (llms.txt, OpenAPI, copy-paste context, MCP setup) — Odds-API.io docs, 2026 年 11 月 2 日查閱
  3. Odds API Pricing (plans, WebSocket add-on, extra requests, payment) — Odds-API.io, 2026 年 11 月 2 日查閱
  4. OpenAPI specification (all v3 endpoints and parameters) — Odds-API.io docs, 2026 年 11 月 2 日查閱
  5. WebSocket guide (wss://api.odds-api.io/v3/ws, markets filter, reconnects) — Odds-API.io docs, 2026 年 11 月 2 日查閱