PMWallets
EN

用 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。

python
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 去重,所以重启后能从停下的地方精确接上。

python
# 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。

相关页面