Operations
Shadow mode: paper trading without the risk
How polybot's shadow mode lets you validate strategies end-to-end against real market data, with zero capital at risk — and why it's the default.
Published Apr 14, 2026
Every strategy in polybot boots in shadow mode. That’s not a soft default — it’s a discipline. This guide explains what shadow mode does, what it doesn’t, and how to use it to decide when a strategy is ready for live capital.
What shadow mode is
In shadow mode, the strategy runs the full pipeline:
- Subscribes to real market data.
- Generates real
Signalobjects. - Submits to the executor.
- The executor reconciles the signal against a virtual order book built from the real quote snapshot at submission time.
- Virtual fills are recorded in the same analytics tables as live fills, with
mode = 'shadow'.
Everything except the final venue API call is identical to live. The result is a P&L record that reflects your strategy’s performance as if it had been live — minus the market impact of your own orders.
What shadow mode is not
- Not a backtest. Backtests run over historical data; shadow runs forward against live quotes. Shadow gives you honest latency, real-time market conditions, and your actual infrastructure in the loop.
- Not a measure of market impact. Your orders in shadow don’t move the book. A strategy that works at $100/trade in shadow may fail at $5,000/trade live because its own orders clear the best ask. Size-scale carefully.
- Not resolution-realistic for slow markets. Markets that take weeks to resolve won’t give you many data points in a 2-week shadow window. Run longer.
The promotion criteria
polybot doesn’t auto-promote a strategy from shadow to live. You do. Suggested criteria:
- N trades ≥ 50 — enough data to distinguish signal from noise.
- Sharpe > 1.0 — after fees, after latency.
- Drawdown < 15% of notional — your loss tolerance, not a universal number.
- Fill rate ≥ 60% — if 80% of shadow signals can’t find liquidity, live will be worse.
- No regime-sensitivity you can’t explain — if performance flipped on a specific day, understand why before scaling.
Run:
polybot strategy report arbitrage --mode shadow --window 30d
polybot strategy report arbitrage --calibration
When satisfied:
polybot strategy shadow arbitrage --disable # moves to live
polybot strategy config arbitrage --max-size-usd 100 # start small
Scale size up in increments; monitor drift between shadow and live P&L.
Under the hood
The virtual order book simulates fills conservatively:
- Market orders fill at the worst top-N asks/bids sized to your order.
- Limit orders fill only if the market trades through your price in subsequent ticks, with a fill probability model that accounts for queue position.
- Fees are applied identically to live — no hidden subsidies.
This is deliberately conservative. If your strategy works in shadow, it has a realistic chance of working live. If it barely works in shadow, it will lose money live.
Hybrid mode
Some strategies are safe enough to go live while others stay in shadow. polybot scopes shadow per strategy:
polybot strategy shadow arbitrage --disable # live
polybot strategy shadow momentum --enable # still paper
polybot strategy shadow ai_model --enable # still paper
The MCP server also honours this: agent-invoked place_order inherits the strategy’s mode if invoked with strategy=<name>, otherwise falls back to the global MCP mode.
What to watch for in shadow
- Clean P&L curve, but zero real fills. Your limit orders aren’t realistic. Move closer to inside the spread.
- High fill rate, low edge. You’re trading adverse flow. Tighten entry criteria.
- Looks great Monday, awful by Friday. Weekly regime sensitivity. Run longer.
Shadow mode is the single highest-value feature polybot ships. It’s also the one most operators skip because it feels slow. Don’t skip it.
Need an agent system built like this?
Cryptuon builds production AI agents, MCP integrations, and trading systems. polybot is our open-source showcase.