Methodology
Every number on this site comes from one simple, reproducible daily-bar backtest. We deliberately keep it simple so you can check it. The code lives in pipeline/.
Data
- Source: Yahoo Finance via yfinance (adjusted daily OHLCV).
- Universe: 518 tickers — today's S&P 500 and Nasdaq-100 members (from Wikipedia constituent lists).
- Test window: signals from 2021-10-13 to 2026-10-12 (~5 years); about a year of earlier data is used to warm up indicators like the 200-day SMA and 52-week high.
- Liquidity filter on every screen: close > $5 and 20-day average dollar volume > $5M.
Signals
A screen fires for a ticker on day t when its criteria are true using only data available at the close of day t. Screens that are intraday in practice (e.g. gaps) are evaluated on the full daily bar, so they are end-of-day versions of the idea.
Metrics
- Signals: number of (ticker, day) hits.
- Hit rate: share of signals where Close[t+5] / Close[t] − 1 > 0.
- Avg 5-day move: mean of that 5-day forward return (we also show the median and SPY's average 5-day return on the same days, for context).
- Max drawdown: of an equal-weight trade curve. Each signal opens a position at the day-t close and holds it for the next 5 sessions. Each day, portfolio return = average daily return of all open positions (cash/0% if none). Drawdown is the largest peak-to-trough fall of that compounded curve.
Honest caveats
- Survivorship bias: we test today's index members back in time. Companies that were removed, went bankrupt or were acquired are missing, and the stocks that are in there are, by construction, ones that did well enough to be in the index today. This flatters long-side results — especially for dip-buying screens.
- Market regime: 2021–2026 was mostly a rising market for large caps. In such markets nearly any long screen shows a hit rate above 50%. Compare against the SPY figure.
- No commissions, spreads, slippage, taxes or borrow costs. Entry at the exact close is not always achievable.
- Overlapping signals: the same stock can signal on consecutive days, so signals are not independent and the statistics overstate precision.
- Platform settings are best-effort translations; TradingView, Finviz and ThinkorSwim compute indicators slightly differently than our code.
- We did not optimize parameters; we used textbook values. Nothing here is a recommendation.
Reproduce
cd pipeline && python3 universe.py && python3 fetch.py && python3 backtest.py
Results are written to data/results.json (25 screens).