Academy/How Algorithms Pick Stocks & Options/Stock Screening: From Universe to Watchlist
How Algorithms Pick Stocks & OptionsLesson 1

Stock Screening: From Universe to Watchlist

Learn how algorithms filter thousands of stocks down to a high-quality shortlist using fundamental and technical criteria.

10 minute read
4 key takeaways

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.

FilterTypical ThresholdWhat It Removes
Revenue growth YoY> 5%Shrinking businesses
EPS growth YoY> 0%Companies losing money
Debt / Equity< 2.0Over-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.

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

Key Takeaways
  • 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

Try the ML Screener

Run a live multi-factor screen against the full S&P 500 universe.