Measure a Scan's Edge
A scan that returns plausible-looking stocks every day isn't necessarily a good scan. The question is what those stocks did next. scanr.ai answers it for every saved scan: each time a stock enters the result, it's recorded as a simulated trade, and the trades are scored over holding periods from a day to a year.
This guide reads those scores, drills into the trades behind them, and explains how to avoid fooling yourself with them.
You'll need: a Power User or Business token, and a saved scan that has been running for a while.
How the simulation works
- A trade opens when a stock enters the scan's result, at the price when it was recorded.
- It closes after a fixed time horizon:
1d,3d,5d,10d,1M,3M,6M,1y, or at year end (ytd). - A stock that stays in the result doesn't open a new trade every run; there's a cooldown between re-entries.
- These are simulated triggers, not broker fills: no slippage, commissions or position sizing.
Trades are recorded as the scan runs, so the record builds up over time. A new scan reports insufficient_history: true until there's enough of it to judge.
1. Read the scorecard
POST /api/v2/scan/myscans/most-recent-scan-performances returns the latest statistics for your scans, grouped by horizon:
scan_ids: null returns every saved scan you own, which makes it easy to rank them against each other. universe limits the trades to exchange-listed stocks (listed), OTC (otc), or both (all, the default).
Percentages come back as fractions: a win_rate of 0.58 is 58%, an avg_percent_return of 0.0784 is 7.84%. Sharpe, Sortino and Calmar are plain ratios. The fields worth reading first:
2. Look at the trades
Aggregates hide a lot. POST /api/v2/scan/myscans/scans-for-ticker tells you which of your scans have traded a ticker, and POST /api/v2/scan/myscans/ticker-trade-outcomes lists every simulated trade for one ticker in one scan:
Each trade has its entry and exit dates, PercentageReturn (a fraction), DidExit (whether the horizon has elapsed), BarsHeld, and the best and worst points along the way (MaxProfitSinceEntryPercentage, MaxLossSinceEntryPercentage, MaxDrawdown). Entry and exit prices are not included in API responses; use the dates to look them up on a chart.
3. Judge it honestly
- Count the trades. Twenty trades can show a 70% win rate by chance. Treat anything under a hundred trades as a hint, not a result.
- Pick the horizon before you look. Nine horizons give nine chances for one of them to look good. Decide how long you intend to hold, then read that row.
- Compare with doing nothing. A trend-following scan in a rising market will look good at every horizon. Save a deliberately dumb control scan (for example, every stock above $10 with RS above 50) and compare the two.
- Watch the drawdowns. A strong
avg_percent_returnwith a deepavg_max_drawdownis a strategy you probably won't hold through. - Change one thing at a time. Save variants as separate scans (a different RSI threshold, an extra liquidity filter) and let them run side by side. The one with more trades and a similar edge is usually the better choice.
- Expect decay. Edges fade as markets change. Re-check scans you rely on every few months.


