Stock Screening: From Universe to Watchlist
Learn how algorithms filter thousands of stocks down to a high-quality shortlist using fundamental and technical criteria.
Stock Screening: From Universe to Watchlist
Every stock-picking algorithm starts with a universe — typically thousands of tickers. The job of the screener is to kill most of them instantly so the strategy only evaluates a handful of high-quality candidates. Speed and precision matter: a screener that misses bad stocks costs money; one that misses good stocks costs opportunity.
Layer 1 — Liquidity Filters (Always First)
Before anything else, remove stocks the algorithm physically cannot trade. Thin markets mean wide spreads, missed fills, and slippage that eats the entire edge.
- Average daily volume > 500,000 shares (institutional-grade liquidity)
- Price > $5 (eliminates penny stocks and their erratic behavior)
- Market cap > $300M (small-caps can gap violently on thin news)
- Bid-ask spread < 0.1% of price (cost-of-entry check)
Layer 2 — Fundamental Quality Filters
Quality filters keep businesses that are actually growing and financially sound. Algorithms do not want to own broken companies even at cheap prices — mean reversion in a failing business is called bankruptcy.
| Filter | Typical Threshold | What It Removes |
|---|---|---|
| Revenue growth YoY | > 5% | Shrinking businesses |
| EPS growth YoY | > 0% | Companies losing money |
| Debt / Equity | < 2.0 | Over-leveraged balance sheets |
| Return on Equity | > 10% | Capital-inefficient businesses |
| Operating margin | > 5% | Razor-thin or negative margins |
Layer 3 — Technical Condition Filters
Once fundamentals pass, the algorithm checks the price chart for the right technical setup. This is where the strategy type matters: a trend-follower and a mean-reverter use opposite filters.
def passes_technical_screen(ticker, strategy='trend'):
price = get_price(ticker)
sma_50 = sma(ticker, 50)
sma_200 = sma(ticker, 200)
rsi_14 = rsi(ticker, 14)
if strategy == 'trend':
# Golden cross + price above both MAs + RSI has momentum
return (sma_50 > sma_200 and
price > sma_50 and
40 < rsi_14 < 75)
elif strategy == 'mean_reversion':
# Price stretched below MA + RSI oversold
return (price < sma_50 * 0.95 and
rsi_14 < 35)Order of Filters Matters for Speed
Always apply the cheapest (fastest) filters first — liquidity and price checks are single-number comparisons. Fundamental data requires API calls. Technical indicators need array calculations. Apply them in that order to avoid doing expensive work on tickers you would have eliminated anyway.
What the Output Looks Like
After all three layers, a universe of 5,000 stocks typically collapses to 20–80 candidates. This is your watchlist — the only names the algorithm will evaluate for actual entry signals. Smaller is better: it means the filters are doing their job.
Rule of Thumb
If your screener consistently passes more than 5% of the universe, the filters are too loose. Tighten them until only genuinely exceptional setups survive.
- A stock screener is just a sequence of filters applied to every ticker in the universe
- Fundamental filters remove low-quality businesses before any price analysis
- Technical filters then find the right market conditions for entry
- Fewer, stricter filters beat long lists of loose ones