Paper Trading Guide

A paper portfolio with the PAPER badge, open positions, and a Reset button

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:

  1. 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.
  2. 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.
  3. 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:

  1. 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.

  2. 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 ModelPosition with status open (not pending_entry)
    • Updates current_capital and deployed_capital
    • Marks the signal executed and tags the audit event with paper_*

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 time
  • portfolio.current_capital β€” free cash, decremented on each entry
  • portfolio.deployed_capital β€” value of open positions at entry cost, incremented on entry
  • portfolio.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:

  1. 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.
  2. Cancels all pending signals (pending_approval, in_cart, no_capital).
  3. Restores current_capital to starting_capital.
  4. Sets deployed_capital = 0, committed_capital = 0.
  5. Records a paper_portfolio_reset audit 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

FieldPaperLive
portfolio.paper_modetruefalse
portfolio.auto_place_signalsimplicitly trueas configured
portfolio.atr_stop_multiplierignored (no stops placed)enforces stops
signal.gtt_trigger_idalways nullbroker GTT ID
signal.gtt_statuspaper_filledcreated / triggered / etc.
position.entry_order_idpaper:Nbroker order ID
position.statusjumps to open immediatelypending_entry β†’ open
Fill monitordoesn't applyruns every 60s
Audit eventspaper_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:

  1. Confirm the paper portfolio's metrics are consistent with the backtest
  2. Create a new live portfolio with the same strategy and config
  3. (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