用 Python 获取 Polymarket 数据:市场、钱包成交与实时推送
从 Python 拿到 Polymarket 数据最快的可行路线:用 Polymarket 公开的 Gamma 和 Data API 查市场和钱包历史,用 CLOB 客户端下单,用 PMWallets SDK 获取排过名的交易者及其实时成交。
哪个接口回答什么
Polymarket 的 Gamma API 描述市场和事件 —— slug、问题、条件 ID、token ID、各种标记。Data API 返回一个钱包的成交、活动和持仓。CLOB API 是订单簿,下单用它;Polymarket 为它发布了官方 Python 客户端 py-clob-client。这三个都不给交易者排名,也不在别人钱包成交时推送 —— 这是 PMWallets API 补上的部分。
市场与钱包历史,不需要 key
Gamma 和 Data API 都是公开的。查询 Data API 要用个人主页上的地址 —— 智能合约钱包,不是签名者。两个细节能省时间:outcomes 和 clobTokenIds 返回的是 JSON 编码的字符串;每笔成交的 asset 字段就是 token ID。
import json, requests # markets and events — Gamma API m = requests.get("https://gamma-api.polymarket.com/markets", params={"slug": "<market-slug>"}).json()[0] token_ids = json.loads(m["clobTokenIds"]) # a JSON string; same order as json.loads(m["outcomes"]) # a wallet's trades, activity and positions — Data API (use the profile / proxy wallet address) W = "0x..." trades = requests.get("https://data-api.polymarket.com/trades", params={"user": W, "limit": 100}).json() activity = requests.get("https://data-api.polymarket.com/activity", params={"user": W, "limit": 100}).json() positions = requests.get("https://data-api.polymarket.com/positions", params={"user": W}).json() for t in trades[:5]: print(t["timestamp"], t["side"], t["outcome"], t["price"], t["size"], t["title"])
轮询的局限
Data API 只能拉取:想盯一个钱包,就得一遍遍地问,每次轮询每个地址一个请求。它一次只回答一个地址,用好几个钱包的交易者得把每个都查到;它的成交接口每个钱包最多返回 10,000 笔历史成交。盯几个钱包、延迟几分钟没问题;机器人必须看到所跟交易者的每一笔成交,就不行了。
排过名的交易者与实时成交:pmwallets SDK
开源的 pmwallets SDK(pip install pmwallets,MIT)读取 PMWallets 榜单 —— 交易者已跨钱包聚合、胜率带置信区间 —— 并通过 WebSocket 推送你订阅的实体的成交,通常在出块后一秒内。它按 session 和序号检测缺口、补发,并按 event ID 去重,所以重启后能从停下的地方精确接上。
# pip install pmwallets import asyncio from pmwallets import AsyncClient, Client, FillStream, FileStateStore with Client(api_key="pmw_...") as pmw: board = pmw.leaderboard(minWinLo=0.55, minEligible=30, style="taker", status="active", limit=50) pmw.subscribe(board["rows"][0]["entityId"], channels=["ws"]) async def main(): async with AsyncClient(api_key="pmw_...") as pmw: stream = FillStream(client=pmw, store=FileStateStore("stream.json"), on_fill=lambda fill, meta: print(fill["side"], fill["price"], fill["tokenId"])) await stream.run() asyncio.run(main())
常见问题
Polymarket 有官方的 Python 库吗?
交易方面有:py-clob-client,Polymarket 的 CLOB 订单簿客户端。市场数据和钱包历史来自公开的 Gamma 与 Data API,用普通 HTTP 请求就能查。
怎样用 Python 获取一个 Polymarket 钱包的成交?
调用 https://data-api.polymarket.com/trades,user 填该钱包的主页(代理)地址。要在成交发生时拿到,用 pmwallets SDK 订阅这个交易者,通过 WebSocket 接收每一笔成交。
获取 Polymarket 数据需要 API key 吗?
Gamma 和 Data API 是公开的,不需要。下单需要由你的钱包派生的 CLOB 凭证。PMWallets SDK 需要一个 PMWallets API key。