pmxt 研究筆記¶
資料來源¶
| 項目 | 連結 |
|---|---|
| GitHub | pmxt-dev/pmxt |
| 官網 | pmxt.dev |
| 歷史資料庫 | archive.pmxt.dev |
| 作者 DEV.to 介紹文 | CCXT for Prediction Markets: Introducing PMXT |
| 跨平台套利 Bot 教學 | How I Built a "Risk-Free" Arbitrage Bot |
| Show HN | HN #46575615 |
| NPM (core) | pmxt-core |
| PyPI | pmxt |
| Zenodo DOI | 每個 release 自動發布,可學術引用 |
專案概述¶
pmxt 自稱為「The CCXT for Prediction Markets」—— 一個統一 API 函式庫,讓開發者透過單一介面同時存取多個預測市場交易所的資料與交易功能。正如 CCXT 標準化了加密貨幣交易所 API,pmxt 對預測市場做了同樣的事。
核心作者是 Samuel EF. Tinnerholm(realfishsam),新加坡國立大學(NUS)與瑞典烏普薩拉大學(Uppsala)的量化開發者。本質上是單人主力專案(439/533 commits),有約 12 名社群貢獻者。
截至 2026-03-29,擁有 1,205 stars、123 forks。從 2026-01-08 建立至今僅 2.5 個月,已從 v0.x 發展到 v2.22.1,幾乎每天更新,開發速度極快。
核心功能¶
支援的交易所(7 個)¶
| 交易所 | 類型 | 備註 |
|---|---|---|
| Polymarket | 鏈上 CLOB(Polygon/EVM) | 最完整整合,3 個 API spec |
| Kalshi | 美國受監管 CFTC,傳統 REST | 最乾淨的參考實作 |
| Limitless | EIP-712 簽名 | |
| Probable | ||
| Baozi | Solana pari-mutuel | |
| Myriad | ||
| Opinion | 最新加入(2026-03-21) |
另有 kalshi-demo 用於測試環境。
Compliance Matrix(功能覆蓋)¶
| 類別 | 功能 | 覆蓋率 |
|---|---|---|
| 市場資料 | fetchMarkets, fetchEvents, fetchMarket, fetchEvent |
7/7 |
| 公開資料 | fetchOHLCV, fetchOrderBook |
7/7 |
fetchTrades |
6/7 | |
| 私有資料 | fetchBalance, fetchPositions, fetchMyTrades |
6-7/7 |
| 交易 | createOrder, cancelOrder, fetchOrder, fetchOpenOrders |
6-7/7 |
| 計算 | getExecutionPrice, getExecutionPriceDetailed |
7/7 |
| 即時 | watchOrderBook(WebSocket) |
7/7 |
watchTrades |
5/7 |
其他特色:
- buildOrder / submitOrder:兩步驟訂單工作流,允許建立但不送出(用於 Smart Order Router)
- watchAddress / unwatchAddress:鏈上地址活動監控(GoldSky GraphQL 訂閱)
- filterMarkets:客戶端市場篩選
- Raw Mode:保留原始交易所格式不轉換
- 14 種 Typed Error Classes:Python/TypeScript 共用
技術架構¶
Sidecar Pattern(最關鍵的設計決定)¶
- 交易所整合只在 TypeScript
core/實作一次 - SDK 是「瘦 HTTP 包裝器」,自動在背景啟動/管理 sidecar server
- 新增交易所 = 自動在所有 SDK 可用
- Server 使用
~/.pmxt/server.lock管理生命週期與 access token - 代價:Python 使用者必須安裝 Node.js >= 18
OpenAPI 驅動的 SDK 生成¶
BaseExchange.ts (JSDoc)
│ AST parsing
▼
core/src/server/openapi.yaml ← source of truth
│ openapi-generator-cli
▼
sdks/python/generated/ sdks/typescript/generated/
CI 有 drift guard 確保 SDK 與 core 同步。
Implicit API Pattern(二層 API 系統)¶
- Unified API — 公開介面(
fetchMarkets,createOrder等),跨交易所統一 - Implicit API — 從交易所自身 OpenAPI spec 自動生成的方法,為每個
operationId建立可呼叫方法
統一方法內部透過 callApi('OperationId', params) 調用 implicit 方法。
目錄結構¶
core/
specs/ 交易所 OpenAPI YAML specs
src/
exchanges/ 交易所實作(每個一個目錄)
polymarket/ (3 個 api: CLOB, data, gamma)
kalshi/
limitless/
probable/
baozi/
myriad/
opinion/
server/ Express sidecar server
utils/ 共用工具
BaseExchange.ts 抽象基底類
types.ts 統一資料型別
errors.ts 錯誤類別層級
sdks/
python/ pip install pmxt
typescript/ npm install pmxtjs
tools/
dome-to-pmxt/ Dome API 遷移工具(npx dome-to-pmxt ./src)
主要依賴¶
expressv5,axios,cors,ethersv5(Polymarket 簽名)@polymarket/clob-client,@limitless-exchange/sdk,@prob/clob@opinion-labs/opinion-clob-sdk,@solana/web3.js(Baozi)ws(WebSocket),esbuild(bundling)
統一資料模型¶
階層:Event > Market > Outcome
interface UnifiedEvent {
id, title, description, slug,
markets: UnifiedMarket[],
volume24h, volume?, url, image?, category?, tags[]
}
interface UnifiedMarket {
marketId, eventId?, title, description, slug?,
outcomes: MarketOutcome[],
resolutionDate, volume24h, volume?, liquidity, openInterest?,
url, image?, category?, tags[], tickSize?,
yes?, no?, up?, down? // 便利 getters
}
interface MarketOutcome {
outcomeId, marketId?, label, price, priceChange24h?, metadata?
}
interface Order {
id, marketId, outcomeId, side, type, price?, amount,
status: 'pending' | 'open' | 'filled' | 'cancelled' | 'rejected',
filled, remaining, timestamp, fee?
}
interface Position {
marketId, outcomeId, outcomeLabel, size,
entryPrice, currentPrice, unrealizedPnL, realizedPnL?
}
使用範例¶
Python — 查詢市場資料¶
pip install pmxt
import pmxt
api = pmxt.Exchange()
events = api.fetch_events(query='Fed Chair')
market = events[0].markets.match('Kevin Warsh')
print(f"Price: {market.yes.price}")
TypeScript — 查詢市場資料¶
npm install pmxtjs
import pmxt from 'pmxtjs';
const api = new pmxt.Exchange();
const events = await api.fetchEvents({ query: 'Fed Chair' });
const market = events[0].markets.match('Kevin Warsh');
console.log(`Price: ${market.yes?.price}`);
Python — 交易¶
exchange = pmxt.Polymarket(
private_key=os.getenv('POLYMARKET_PRIVATE_KEY'),
proxy_address=os.getenv('POLYMARKET_PROXY_ADDRESS')
)
balance = exchange.fetch_balance()
order = exchange.create_order(
outcome=markets[0].yes,
side='buy', type='limit', price=0.33, amount=100
)
附帶資源¶
pmxt Data Archive¶
- 網址:archive.pmxt.dev
- 免費提供每小時預測市場 orderbook/trade 快照
- 格式:Parquet
- 覆蓋所有支援的交易所
跨平台套利 Bot 教學¶
作者在 DEV.to 示範用 pmxt 建構 Polymarket ↔ Kalshi 跨平台套利機器人: - 捕獲 1.5%-4.5% 的價差 - 核心邏輯:比較同一事件在兩個平台的 Yes 價格,低買高賣
版本演進¶
| 版本 | 時間 | 重點 |
|---|---|---|
| v0.x | 2026-01 | 初始架構,Polymarket + Kalshi 整合 |
| v1.0 | 2026-01~02 | Sidecar 架構、Python/TS SDK、OpenAPI pipeline |
| v1.5-1.7 | 2026-02 | Hybrid ID、統一過濾、CCXT-style unified API |
| v2.0 | 2026-02 | Breaking changes,移除 deprecated methods |
| v2.17-2.22 | 2026-03 | 7 個交易所、WebSocket、typed errors、address watcher |
| v3.0(計畫) | 2027+ | Rust native bindings,零 Node.js 依賴,超低延遲 |
與替代方案比較¶
| 特性 | pmxt | dr-manhattan | predmarket | Dome API |
|---|---|---|---|---|
| Stars | 1,205 | 180 | ~70 | 商業服務 |
| 語言 | TS core + Python SDK | Python | Python | 商業 |
| 定位 | Library(統一 API) | Framework(Strategy 基底類) | Library | 付費 API |
| 交易所數 | 7 | ~5 | 較少 | 多 |
| SDK | Python + TypeScript | Python only | Python only | REST |
| WebSocket | 支援 | ? | 無 | 有 |
| 文件品質 | 完整 | 較弱 | 無 | 商業級 |
| 最後更新 | 2026-03-25 | 2026-02-25 | 不再維護 | 持續 |
| 授權 | MIT | MIT | — | 商業 |
pmxt 另提供 npx dome-to-pmxt ./src 自動遷移工具,定位自己為 Dome API 的開源替代。
外部討論¶
- Show HN(2026-01-25):僅 2 points、2 comments,反響冷淡
- 有人質疑 battle-tested 程度和速度
- 作者回覆宣佈 WebSocket 與高測試覆蓋率
- DEV.to:作者自寫的兩篇介紹/教學文章
- Medium:作者自寫的比較文(pmxt vs dr-manhattan vs predmarket)
- 被列入 Awesome Prediction Market Tools
- Interexy 指南稱 pmxt 為「最有能力的預測市場聚合器」
- 贊助商:ondb.ai
- 未來計畫:Smart Order Router(private alpha 開發中)
風險與觀察¶
優勢:
- 架構設計成熟 — sidecar + OpenAPI 生成的工程水準很高
- 開發速度驚人 — 2.5 個月從零到 v2.22,7 個交易所
- 雙語言 SDK 降低使用門檻
- MIT 授權、Zenodo DOI 可學術引用
- 免費歷史資料庫(archive.pmxt.dev)
風險:
- Bus factor = 1:439/533 commits 來自同一人
- Sidecar 摩擦:Python 使用者必須安裝 Node.js >= 18,這是非自明的依賴
- 極短歷史:僅 2.5 個月,生產環境穩定性未知
- 自我推銷為主:比較文章、blog posts 全是作者自己寫的
- 商業模式不明:Smart Order Router 似乎是未來付費產品
- v3 Rust rewrite 遠期:計畫 2027+ 才能移除 Node.js 依賴
與 Prediction Market Analysis 的互補性¶
本專案與先前研究的 Prediction Market Analysis(Jon Becker)形成互補:
| pmxt | Prediction Market Analysis | |
|---|---|---|
| 定位 | 即時交易 SDK | 歷史研究數據集 |
| 強項 | 統一下單、即時報價、多交易所 | 2.92 億筆歷史交易、學術論文 |
| 數據格式 | API 回傳 JSON | Parquet 離線分析 |
| 適用場景 | 建造交易機器人、套利系統 | 回測策略、學術研究、市場微結構分析 |
兩者結合可覆蓋「歷史回測 → 即時執行」的完整工作流。