Last updated 28 October 2026
How backtests are run
A backtest is only as honest as its assumptions. This page lists every assumption our engine makes, including the ones that flatter or hurt a result.
Data
Daily bars (open, high, low, close, volume) come from Yahoo Finance and are fetched by our server, not by your browser. Prices are adjusted for splits and dividends. The backtester uses up to ten years of history where it exists. The data is unofficial and may contain gaps or errors. Adjustment factors are calculated with later information, so adjusted history carries a small amount of hindsight.
Signals and fills: no look-ahead
A signal is computed from the close of one day, using only that day and earlier. The resulting order is filled at the next day's open, never on the same bar. Indicators use only past data.
- Moving-average cross: enter when the fast average crosses above the slow one; exit when it falls back below.
- RSI oversold: Wilder's RSI; enter below the entry level, exit above the exit level.
- N-day high breakout: enter when the close is above the prior N-day high; exit when it closes below the prior M-day low.
- Bollinger Bands: breakout mode enters above the upper band and exits under the middle band; reversion mode enters below the lower band and exits above the middle band.
Position rules
Long only, one position at a time, fully invested, no leverage and no shorting. Stops and targets are checked against each day's low and high after entry. If price gaps through a stop, the fill is at the open, not at the stop level. If a single day touches both stop and target, the stop is assumed to hit first, which is the pessimistic choice.
Costs
Every trade is charged 5 basis points in fees plus 5 basis points of slippage on each side (0.20% for a round trip). These are approximations. Real brokerage schedules, taxes and levies (such as STT), bid-ask spreads and market impact are not modelled, so real costs can be higher.
Train and test
The history is split by time: the first 70% is the training period and the last 30% is the test period. Results are shown for each and for the whole. The backtester does not optimise any parameters, so the split shows whether an idea held up on data it was not described against, not whether a tuned version would.
Metrics
- Return and buy and hold over the same period.
- Max drawdown: the largest fall from a previous equity high.
- Win rate and profit factor (gross winning trades divided by gross losing trades).
- Sharpe ratio: daily returns, annualised over 252 days, with no risk-free rate.
What is driving the result
We re-compute the return without the best one and best three trades, and show how much gross profit the best trade supplies. We also split the gain made while holding into overnight gaps (previous close to the next open) and intraday moves (open to close), before costs. A result that vanishes without a few trades, or that comes mostly from overnight gaps, deserves extra suspicion.
The written findings
The findings under each result come from fixed rules, not from an AI model. They flag, for example, fewer than 30 trades, weaker out-of-sample results, long drawdowns, losing to buy and hold, thin profit factor, and dependence on a few trades or on gaps.
Supported markets
- US large caps: AAPL, MSFT, NVDA, AMZN, GOOGL, META, TSLA, JPM, V, WMT, XOM, JNJ.
- ETFs: SPY, QQQ, IWM, DIA, GLD, TLT.
- India (NSE): Nifty 50, Bank Nifty, RELIANCE, TCS, INFY, HDFCBANK, ICICIBANK.
Daily prices only. Options, futures, crypto and forex are not supported.
The paper account
The paper account does not trade real money. It runs in your browser, stores its state on your device, uses delayed quotes that refresh about every 30 seconds, and evaluates stops and targets only while the page is open. No orders are ever sent to a broker.