Paper Trading Guide

Paper trading lets you run any strategy with virtual money β no broker connection required, no real risk, no real fills. Signals execute automatically against live market data, positions are tracked, P&L flows through the same dashboard as real portfolios, and you can reset anytime.
This guide goes deeper than the quickstart. It covers the fill model, the differences from live trading, the reset semantics, and when paper is (and isn't) a faithful proxy for live performance.
What paper trading is for
Three main use cases:
- Onboarding without commitment. New users can experience the full product loop without connecting a broker. This is the SaaS funnel β try it free, decide if it's worth wiring up real money.
- Strategy validation in real time. Backtests are historical. Paper portfolios run forward β they exercise the strategy on tomorrow's data, which the backtest never saw. A strategy that backtests well and runs cleanly in paper for a few weeks is more trustworthy than one that just backtests well.
- Live A/B testing. Run two paper portfolios with two strategy variants on the same days. Compare the live results directly. This catches bugs and biases that backtests miss.
What paper trading is not for:
- Production P&L estimation. Paper assumes zero brokerage, zero STT, zero exchange fees, zero impact, infinite liquidity. Real P&L will be 0.1β0.5% lower per round trip after costs.
- Stop loss validation. Paper portfolios don't place stop GTTs. If your strategy depends on intraday stops, paper won't model that risk.
- Order quality testing. Paper fills happen at the daily close. Real GTT triggers can fill anywhere intraday and may experience slippage on volatile bars.
How paper portfolios run
A paper ModelPortfolio is structurally identical to a live one. Same model_type (or strategy_id), same starting_capital, same position size, same capital constraints. The only difference is paper_mode = True.
That single flag changes the behaviour of two code paths:
-
Auto-execute is forced on. Paper portfolios skip the manual approval queue. Every signal generated by the scanner immediately moves to in-cart and gets filled. There's no point in approving virtual trades β the whole value of paper is friction-free experimentation.
-
The execution leaf is the paper executor. Instead of placing a Kite GTT, the system calls
paper_executor.paper_fill_signal()which:- Computes the fill price as
signal.close_price Γ (1 + 5/10000)for buys,Γ (1 - 5/10000)for sells - Creates a
ModelPositionwith statusopen(notpending_entry) - Updates
current_capitalanddeployed_capital - Marks the signal
executedand tags the audit event withpaper_*
- Computes the fill price as
The rest of the system β scanner, exit logic, add-on logic, conviction scoring, dashboard, P&L computation, audit log, family group consolidation β is identical. There's no separate "paper mode" code path for any of these.
Fill model
Paper fills use the daily close price with 5 basis points of slippage per side:
buy fill = signal.close_price Γ 1.0005 # paying slightly above close
sell fill = signal.close_price Γ 0.9995 # selling slightly below close
This matches the realistic backtest model. The intent is calibration, not pessimism: a strategy that's profitable in paper at 5 bps is also profitable in the realistic backtest at 5 bps.
There's no slippage variance, no fail/partial fill, no impact modeling. Every paper signal fills at exactly its close price Β± 5 bps.
The fill is synchronous and immediate. When the scanner generates a signal, the paper executor fills it in the same database transaction. There's no pending_entry state for paper positions β they go straight to open.
Capital flow
Paper capital lives in the same fields as live capital:
portfolio.starting_capitalβ what you set at deploy timeportfolio.current_capitalβ free cash, decremented on each entryportfolio.deployed_capitalβ value of open positions at entry cost, incremented on entryportfolio.committed_capitalβ always 0 for paper (no GTT queue)
On entry: current_capital -= position_value, deployed_capital += position_value.
On exit: current_capital += exit_value, deployed_capital -= invested.
The dashboard's portfolio total = current_capital + deployed_capital. At any point this equals starting_capital + total_realized_pnl + total_unrealized_pnl_at_entry_price. Add unrealized at current LTP for the live mark-to-market value.
Stop losses in paper
Paper portfolios do not place ATR stop GTTs. There's no broker to place them on, and modeling intraday stops in a daily-bar simulator is approximate at best.
This means: risk control in paper portfolios is entirely from the strategy's exit rules. If your strategy has atr_stop_mult = 2.0, the live portfolio will close positions when intraday lows hit entry - 2ΓATR. The paper portfolio won't β it relies on the daily exit rules to fire.
For most strategies this is fine because daily exit rules (RSI break, SMA cross, max hold) capture the risk. But for strategies that depend on tight intraday stops, paper will look more profitable than live because the worst trades β the ones a stop would have closed early β run their full course in paper.
If you're testing a strategy that uses tight stops, the most faithful paper test is to also disable the stop in your live strategy and rely on daily exits. If the strategy needs intraday stops to work, paper isn't a faithful proxy and you should rely on the realistic backtest instead.
Reset semantics
The Reset button on a paper portfolio:
- Closes every open position at its entry price (not at current LTP, not at last close β at the original entry price). This produces zero realized P&L for the reset event itself.
- Cancels all pending signals (
pending_approval,in_cart,no_capital). - Restores
current_capitaltostarting_capital. - Sets
deployed_capital = 0,committed_capital = 0. - Records a
paper_portfolio_resetaudit event with the count of closed positions and expired signals.
What's preserved:
- The full audit log
- All previously closed positions (with their original P&L)
- The portfolio's settings, strategy assignment, and deploy date
What's wiped:
- Open positions (closed at entry, P&L = 0)
- Pending signals (expired)
- Capital state (back to starting)
Reset is idempotent β calling it twice has no extra effect. It's also safe β no broker calls, no orders to cancel, no race conditions with live data.
The intended use is "I want to start over with a new experiment". Don't use reset as a way to wipe your historical P&L β closed positions stay in the audit log forever (which is correct: paper trading is supposed to teach you, including from your mistakes).
When paper is faithful (and when it isn't)
Faithful
- Trend-following strategies with daily entries and exits. Paper closely models the entry/exit timing because both happen on close.
- Long holding periods (>20 days). The cost of skipping intraday detail is small relative to the trade duration.
- Liquid universe (NIFTY 100). Paper's "no impact" assumption is closest to reality on liquid stocks.
- Strategies without ATR stops. The whole risk story lives in the DSL, which paper executes faithfully.
- A/B comparisons. Even if paper isn't perfectly accurate to live, it's equally inaccurate to two paper portfolios, so the comparison is valid.
Not faithful
- Short holding periods (<5 days). Paper misses intraday volatility that would change real fills.
- Mid- and small-caps. Real slippage on illiquid stocks is much higher than 5 bps.
- Strategies with tight ATR stops. Paper doesn't fire stops, so worst trades run their full course.
- High-leverage strategies. Paper has no margin model. Real margin requirements will block trades that paper happily fills.
- Strategies that fire many signals on the same day. Paper fills them all instantly; live would queue them across multiple days as capital frees up.
For strategies in the "not faithful" category, run a realistic backtest instead and trust the backtest numbers more than the paper numbers.
Multiple paper portfolios
You can have as many paper portfolios as you want. Each has its own starting capital, strategy, and history. Common pattern:
- One per strategy variant for comparison testing
- One per universe to see how a strategy generalizes
- One per parameter to isolate the effect of one knob
Paper portfolios don't count toward any tier limits. Run as many as you want.
Family groups and paper
Family group consolidation includes paper portfolios in the totals if they're flagged as "include in family view". By default they're excluded β you usually don't want a paper portfolio's virtual capital inflating your family net worth display.
You can override this per-portfolio in the portfolio settings (forthcoming UI; currently a database flag).
What lives where
| Field | Paper | Live |
|---|---|---|
portfolio.paper_mode | true | false |
portfolio.auto_place_signals | implicitly true | as configured |
portfolio.atr_stop_multiplier | ignored (no stops placed) | enforces stops |
signal.gtt_trigger_id | always null | broker GTT ID |
signal.gtt_status | paper_filled | created / triggered / etc. |
position.entry_order_id | paper:N | broker order ID |
position.status | jumps to open immediately | pending_entry β open |
| Fill monitor | doesn't apply | runs every 60s |
| Audit events | paper_entry_filled, paper_exit_filled, etc. | gtt_placed, order_filled, etc. |
Migrating paper to live
There's no formal "promote paper to live" function. The recommended workflow:
- Confirm the paper portfolio's metrics are consistent with the backtest
- Create a new live portfolio with the same strategy and config
- (Optional) Reset the paper portfolio to keep using it as a sandbox
The paper portfolio remains independent. Don't try to "convert" it β the audit history of virtual fills would mix with real fills and confuse the Compliance tab.
Operational notes
- Paper portfolios respect tier limits the same as live portfolios. A free-tier user with a 2-portfolio limit can have 2 portfolios total, paper or live.
- The scanner runs paper portfolios every day alongside live portfolios. There's no opt-out. If you don't want a paper portfolio to keep generating signals, pause it (
status = paused). - The Telegram bot reports paper signals with a clear
[PAPER]tag in the message. You can mute paper notifications globally in Settings if you don't want them. - Reconciliation does not run on paper portfolios. Since there's no broker, there's nothing to reconcile against.
Limitations and roadmap
Current paper trading is intentionally minimal β the goal was a faithful proxy for the live execution path with the smallest possible code footprint. Things that would make it better:
- Brokerage / STT / GST cost model β toggle to subtract real costs from paper P&L
- Intraday fill simulation β for short-hold strategies, model fills against intraday OHLC instead of just close
- Stop GTT simulation β apply ATR stops on intraday lows in paper, mirroring the realistic backtest
- Variance in fill price β randomize slippage instead of always using exactly 5 bps
- "Rewind" functionality β paper-rerun the strategy from a past date with a different parameter set
None of these are blocking, and the current design is good enough for the primary use cases. If you need any of them now, run a realistic backtest instead β the backtester models all of the above.
Next
- Try Paper Trading β quickstart
- Model Trading Guide β full lifecycle
- Backtesting Guide β when to backtest vs paper
- Built-in Models β what to try first