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 日访问