Your AI agent just became a Polymarket trader.
Install → your agent gets $10,000 paper money → trades real Polymarket order books → tracks P&L → competes on a public leaderboard. Zero risk. Real prices.
"My AI agent hit +18% ROI on Polymarket in one week. Zero risk, real order books."
Part of agent-next — open research lab for self-evolving autonomous agents.
npx clawhub install polymarket-paper-trader # install via ClawHub
pm-trader init --balance 10000 # $10k paper money
pm-trader markets search "bitcoin" # find markets
pm-trader buy will-bitcoin-hit-100k yes 500 # buy $500 of YES
pm-trader stats --card # shareable stats cardThat's it. Your AI agent is now trading Polymarket with zero risk.
# via pip
pip install polymarket-paper-trader
# via ClawHub (for OpenClaw agents)
npx clawhub install polymarket-paper-trader
# from source (development)
uv pip install -e ".[dev]"Requires Python 3.10+.
Other tools mock prices or use random numbers. We simulate the actual exchange:
- Level-by-level order book execution — your order walks the real Polymarket ask/bid book, consuming liquidity at each price level, just like a real trade
- Exact fee model —
bps/10000 × min(price, 1-price) × shares— the same formula Polymarket uses - Slippage tracking — every trade records how much worse your fill was vs the midpoint, in basis points
- Limit order state machine — GTC (good-til-cancelled) and GTD (good-til-date) with full lifecycle
- Strategy backtesting — replay your strategy against historical price snapshots
- Multi-outcome markets — not just YES/NO binary, supports any number of outcomes
Your paper P&L would match real P&L within the spread. That's the point.
# Initialize with $10k paper balance
pm-trader init --balance 10000
# Browse markets
pm-trader markets list --sort liquidity
pm-trader markets search "bitcoin"
# Trade
pm-trader buy will-bitcoin-hit-100k yes 100 # buy $100 of YES
pm-trader sell will-bitcoin-hit-100k yes 50 # sell 50 shares
# Check portfolio and P&L
pm-trader portfolio
pm-trader stats| Command | Description |
|---|---|
init [--balance N] |
Create paper trading account |
balance |
Show cash, positions value, total P&L |
reset --confirm |
Wipe all data |
markets list [--limit N] [--sort volume|liquidity] |
Browse active markets |
markets search QUERY |
Full-text market search |
markets get SLUG |
Market details |
price SLUG |
YES/NO midpoints and spread |
book SLUG [--depth N] |
Order book snapshot |
watch SLUG [SLUG...] [--outcome yes|no] |
Monitor live prices |
buy SLUG OUTCOME AMOUNT [--type fok|fak] |
Buy at market price |
sell SLUG OUTCOME SHARES [--type fok|fak] |
Sell at market price |
portfolio |
Open positions with live prices |
history [--limit N] |
Trade history |
orders place SLUG OUTCOME SIDE AMOUNT PRICE |
Limit order |
orders list |
Pending limit orders |
orders cancel ID |
Cancel a limit order |
orders check |
Fill limit orders if price crosses |
stats [--card|--tweet|--plain] |
Win rate, ROI, profit, max drawdown |
leaderboard |
Local account rankings |
pk ACCOUNT_A ACCOUNT_B |
Battle: who's the better trader? |
export trades [--format csv|json] |
Export trade history |
export positions [--format csv|json] |
Export positions |
benchmark run MODULE.FUNC |
Run a trading strategy |
benchmark compare ACCT1 ACCT2 |
Compare account performance |
benchmark pk STRAT_A STRAT_B |
Battle: who's the better trader? |
accounts list |
List named accounts |
accounts create NAME |
Create account for A/B testing |
mcp |
Start MCP server (stdio transport) |
Global flags: --data-dir PATH, --account NAME (or env vars PM_TRADER_DATA_DIR, PM_TRADER_ACCOUNT).
Your agent gets 26 tools via the Model Context Protocol:
pm-trader-mcp # starts on stdioAdd to your Claude Code config:
{
"mcpServers": {
"polymarket-paper-trader": {
"command": "pm-trader-mcp"
}
}
}| Tool | What it does |
|---|---|
init_account |
Create paper account with starting balance |
get_balance |
Cash, positions value, total P&L |
reset_account |
Wipe all data and start fresh |
search_markets |
Find markets by keyword |
list_markets |
Browse markets sorted by volume/liquidity |
get_market |
Market details with outcomes and prices |
get_order_book |
Live order book snapshot (bids + asks) |
watch_prices |
Monitor prices for multiple markets |
buy |
Buy shares at best available prices |
sell |
Sell shares at best available prices |
portfolio |
Open positions with live valuations and P&L |
history |
Recent trade log with execution details |
place_limit_order |
Limit order — stays open until filled or cancelled/expired |
list_orders |
Pending limit orders |
cancel_order |
Cancel a pending order |
check_orders |
Execute pending orders against live prices |
stats |
Win rate, ROI, profit, max drawdown |
resolve |
Resolve a closed market (winners get $1/share) |
resolve_all |
Resolve all closed markets |
backtest |
Backtest a strategy against historical snapshots |
stats_card |
Shareable stats card (tweet/markdown/plain) |
share_content |
Platform-specific content (twitter/telegram/discord) |
leaderboard_entry |
Generate verifiable leaderboard submission |
leaderboard_card |
Top 10 ranking card from all local accounts |
pk_card |
Head-to-head comparison between two accounts |
pk_battle |
Run two strategies head-to-head, auto-compare |
Three ready-to-use strategies in examples/:
Buys when YES price crosses above 0.55, takes profit at 0.70, stops loss at 0.35.
pm-trader benchmark run examples.momentum.runBuys when YES price drops 12+ cents below 0.50 fair value, sells when it reverts.
pm-trader benchmark run examples.mean_reversion.runPlaces a grid of limit buy orders below current price with take-profit sells above.
pm-trader benchmark run examples.limit_grid.run# my_strategy.py
from pm_trader.engine import Engine
def run(engine: Engine) -> None:
"""Your strategy receives a fully initialized Engine."""
markets = engine.api.search_markets("crypto")
for market in markets:
if market.closed or market.yes_price < 0.3:
continue
engine.buy(market.slug, "yes", 100.0)pm-trader benchmark run my_strategy.runFor backtesting with historical data:
def backtest_strategy(engine, snapshot, prices):
"""Called once per historical price snapshot."""
if snapshot.midpoint > 0.6:
engine.buy(snapshot.market_slug, snapshot.outcome, 50.0)Run parallel strategies with isolated accounts:
pm-trader --account aggressive init --balance 5000
pm-trader --account conservative init --balance 5000
pm-trader --account aggressive buy some-market yes 500
pm-trader --account conservative buy some-market yes 100
pm-trader benchmark compare aggressive conservativeGenerate a shareable stats card and post to X/Twitter:
pm-trader stats --tweet # X/Twitter optimized
pm-trader stats --card # markdown for Telegram/Discord
pm-trader stats --plain # plain textAI agents can use the stats_card MCP tool to generate and share cards automatically.
Available on ClawHub as polymarket-paper-trader:
npx clawhub install polymarket-paper-traderpytest -m "not live" # unit + integration (skips live API tests)
pytest # full test suite (requires network)
pytest tests/test_e2e_live.py # live API integration tests onlyMIT