PolyBot ships two bots with very different trading philosophies. Understanding when and why each strategy fires is the key to configuring them effectively — and knowing which levers to pull when market conditions change.
The Copy Bot is a social-signal bot. It watches the on-chain behaviour of top Polymarket wallets, scores them on a rolling performance formula, and mirrors their positions in real time. It does not attempt to predict outcomes — it delegates that prediction work to human experts with skin in the game.
The 15-Minute AI Trader is a quantitative signal bot. It ingests 42+ real-time indicators every 15 minutes, runs an ensemble ML model, reads the Chainlink oracle feed, and looks for structural price inefficiencies in the CLOB order book. It makes its own predictions — independent of any human trader.
Both bots can be run simultaneously. When you use the Bundle plan, they run as separate Docker services sharing a single config file with distinct sections for each bot.
| Strategy | Bot | Est. Accuracy | Risk Level | Best For |
|---|---|---|---|---|
| Leaderboard Copy | Copy Bot | ~65–72% | Low–Med | Beginners, passive traders |
| ML Prediction | 15M Bot | ~61–68% | Medium | Quant-focused, high-volume |
| Snipe Mode | 15M Bot | ~80–90% | Low | Near-expiry alpha, low risk |
| Arb-First | 15M Bot | ~99% | Very Low | Risk-free guaranteed fills |
The foundation of the Copy Bot. On startup, PolyBot queries Polymarket's public GraphQL endpoint to fetch all active large-position wallets. It then scores each wallet using a proprietary weighted formula before deciding which ones to follow.
Each potential leader wallet receives a composite score from 0–100 based on four dimensions:
# config.yml — Copy Bot wallet scoring thresholds copy_bot: min_win_rate: 0.52 # Exclude wallets below 52% win rate min_30d_volume_usdc: 500 # Require at least $500 traded in 30 days max_leaders: 5 # Follow at most 5 wallets simultaneously recency_window_days: 7 # Days to weight for recency score rescan_interval_minutes: 60 # Re-rank leaders every 60 minutes
The bot re-evaluates the leaderboard every rescan_interval_minutes (default: 60 min). If a leader's score drops below the configured threshold — or they haven't placed a trade in 48 hours — they are automatically removed and replaced.
When a tracked wallet sells or reduces a position, the Copy Bot evaluates whether to mirror that exit. It does not blindly exit on every sale — instead it checks:
Follow Exits can be disabled if you want Copy Bot to only mirror entries and manage exits independently. Set follow_exits: false in your config.
Rather than copying the raw USDC amount a leader bets, Copy Bot scales the position relative to the ratio of your bankroll to the leader's estimated bankroll. This prevents a whale with a $500k bankroll from causing you to bet 90% of your portfolio on a single market.
# Proportional sizing example # Leader bankroll: ~$50,000 Leader bet: $2,500 (5% of bankroll) # Your bankroll: $1,000 Your bet: $50 (5% of your bankroll) copy_bot: proportional_sizing: true max_position_pct: 0.08 # Never exceed 8% of your bankroll on one trade min_trade_usdc: 5 # Skip copies that would be smaller than $5
This is the core quantitative signal of the 15-Minute Trader. At the start of every 15-minute window, PolyBot pulls a feature vector of 42+ indicators and passes it through a two-model ensemble — LightGBM and ExtraTrees — that were trained on historical Polymarket resolution data.
Indicators fed into the model include: current YES/NO price spread, order book depth at ±2% levels, recent fill volume, time-to-expiry, implied volatility proxy, Chainlink BTC/ETH price delta over the past 4 windows, market category (politics, sports, crypto), and liquidity skew.
# 15M Bot ML config
fifteenm_bot:
strategy: ml_prediction
model_retrain_interval_minutes: 30 # Retrain ensemble every 30 min
confidence_threshold: 0.62 # Only trade if model confidence ≥ 62%
feature_lookback_windows: 8 # Use last 8 windows of features (2h)
ensemble_weights:
lightgbm: 0.55
extratrees: 0.45
The model retrains every 30 minutes using the most recent resolved outcomes as fresh labels. This keeps the model adapted to intraday volatility shifts. Retraining happens in a background thread and does not block live trading.
A trade fires at window open only if the ensemble's weighted probability exceeds confidence_threshold. The default 0.62 is a reasonable balance — raising it to 0.70+ reduces trade frequency but improves per-trade edge.
Snipe Mode is arguably the most powerful strategy PolyBot offers. It activates approximately 20 seconds before a 15-minute window closes and uses the Chainlink oracle's actual resolution price feed — the same feed Polymarket itself uses to settle contracts — to determine the near-certain outcome.
Because the Chainlink feed publishes the final price before the market officially resolves, there is a brief window where the outcome is essentially known but the CLOB still has open orders. PolyBot reads this feed directly and places a market-side order into the mispriced side.
# Snipe Mode config
fifteenm_bot:
snipe_mode:
enabled: true
trigger_seconds_before_close: 20 # Fire 20s before window end
chainlink_feed: BTC/USD # Oracle feed to read
min_edge_pct: 0.02 # Require at least 2% edge vs CLOB price
max_size_usdc: 200 # Cap snipe trades at $200
slippage_tolerance: 0.015 # Accept up to 1.5% slippage on fill
Before placing any directional trade, PolyBot scans the current YES price and NO price for all active markets. In a perfectly efficient market, YES + NO = $1.00. When the sum is below $1.00 — for example $0.96 YES + $0.97 NO = $0.99 — there is a guaranteed profit opportunity. PolyBot buys both sides simultaneously and collects the $0.01 risk-free spread.
# Arb-First scan example (internal log output) [ARBITRAGE] Market: "BTC above $70k by end of June" YES price: 0.47 NO price: 0.51 Sum: 0.98 Edge: 0.02 ($0.02 per $1 wagered) Action: BUY YES $100 + BUY NO $100 Expected P&L: +$2.04 after fees (0.99% fee both sides)
Arb-First runs as a pre-trade scan every 30 seconds, independent of the 15-minute window cycle. If an arb opportunity is found, it takes priority over all other signals. You can set a minimum edge threshold to skip arbs that are eaten by fees.
fifteenm_bot:
arb_first:
enabled: true
min_arb_edge_pct: 0.015 # Minimum 1.5% edge after fees
max_arb_size_usdc: 500 # Maximum combined arb position size
Delta-First trades on the raw price movement of the Chainlink BTC/USD feed across successive 15-minute windows. It uses a tiered sizing model: a larger delta triggers a proportionally larger position, with a hard cap per tier.
fifteenm_bot:
delta_first:
enabled: false # Disabled by default — enable manually
tiers:
- delta_pct: 0.5 # 0.5% BTC move → $25 trade
size_usdc: 25
- delta_pct: 1.0 # 1.0% BTC move → $50 trade
size_usdc: 50
- delta_pct: 2.0 # 2.0%+ BTC move → $100 trade
size_usdc: 100
Multi-Entry allows PolyBot to place up to 3 separate entries within a single 15-minute window if multiple high-confidence signals fire. Each entry is capped independently. This is useful in volatile windows where the model updates its confidence mid-window as new book data arrives.
fifteenm_bot:
multi_entry:
enabled: true
max_entries_per_window: 3
min_confidence_increment: 0.04 # Subsequent entries need 4% more confidence
daily_loss_limit and max_position_cap are set conservatively when enabling it.
confidence_threshold down to 0.58 during high-volatility market events, up to 0.68+ during quiet periods.Now that you understand how each strategy fires, configure the guardrails that protect your capital when signals go wrong.