Screener Filters: Composable Queries Over the Full Universe

Fixed-form screeners answer the most common queries and nothing else. A composable filter stack, fundamentals + technicals + sentiment + regime, with…

Marcus ChenMarcus Chen6 min read

The screener query I run most often doesn't exist in any fixed-form screener I've ever used. It's: "P/E < 20, revenue growth last quarter > revenue growth trailing-12-month, relative strength vs. sector > 60th percentile, insider MSPR positive, not in a high-vol correction regime." Five predicates, mixing fundamentals, technicals, sentiment, and regime. Every one matters for the setup I'm looking for, decent-value names that are accelerating, outperforming their peers, have insider confidence, and aren't just bouncing in a broken market. Take any single filter out and I get a different list with a lot of noise. Fixed-form screeners (Finviz, Yahoo, broker screeners) let me express maybe three of the five; for the other two I have to eyeball the list manually, which defeats the purpose of a screen. The composable filter approach is built around the observation that non-trivial queries almost always mix filter families, and the useful ones use 4-7 predicates, not 2, and not 15. The saved-search feature lets me re-run this query every morning in under 30 seconds and see which 15-25 names clear all five bars that day. Over two years of running that screen daily, the hit rate on names that actually worked out over 3 months has been around 40%, not every name, but enough above random to make it the most productive 30 seconds of my morning.

This post is about the Screener Filters card, why composable beats fixed-form, and the three principles that separate focused queries from kitchen-sink lists.

TL;DR

  • Composable filters mix families: fundamentals, technicals, sentiment, regime, meta, with explicit AND/OR logic.
  • Start from the thesis, not the filters. Reverse-engineer the predicates from "what am I looking for?"
  • 5-7 filters is the useful range. Fewer = too broad; more = over-specified to zero or noise.
  • Always sanity-check against regime. Cheap names in a correction regime are often cheap for a reason.
  • Save and schedule. Daily re-run of well-designed screens is where the compounding benefit lives.

Why fixed-form screeners fall short

Most screeners treat filters as a list of form fields: pick a P/E range, a market-cap range, a sector, hit go. This works for the most common queries ("cheap large-cap tech") but fails the moment you want something nuanced.

Specific examples of queries fixed-form screeners can't express:

  • "Quality-at-reasonable-price in a trending regime", can't express the regime condition
  • "Accelerating revenue growth", requires comparing quarter vs. trailing-12, which fixed forms don't support
  • "Not crowded with retail", requires sentiment-family filters most screeners don't have
  • "Strong relative strength vs. its own sector", requires a dynamic per-row benchmark
  • "Insider MSPR positive or dark-pool accumulation signal", requires OR logic

The composable approach treats filters as a free-form query language. Any predicate from any family, combined with any logical operator, stacked in any order. The query surface is larger and the learning curve is steeper, but the expressive power is much greater.

What the Screener Filters card shows

The Screener Filters card exposes filters across five families:

  • Fundamentals: P/E, EV/Revenue, PEG, FCF yield, margins, growth rates (rolling and YoY), debt ratios
  • Technicals: RSI, ADX, distance from 52w high/low, relative strength vs. SPY or sector, moving-average positioning, volatility regime
  • Sentiment: news sentiment percentile, insider MSPR, options IV rank, unusual activity flags, WSB mentions, analyst revisions
  • Regime: current regime filter (trend/chop/correction), regime-confidence threshold, regime-age
  • Meta: sector, market cap, exchange, ADV, earnings-proximity

Key capabilities:

  • Explicit AND / OR / NOT logic between predicates (not just implicit AND)
  • Nested grouping for complex queries: (A AND B) OR (C AND D)
  • Saved searches persist per user; run history preserved
  • Scheduled emails: daily or weekly digest of matches
  • Preset library: pre-built queries for common setups (quality-value, high-RS breakout, post-earnings-drift candidates)
  • Export to CSV/XLSX or push to a watchlist directly
Screener filters card on alphactor.ai
Screener filters card on alphactor.ai

Three principles for good queries

Start from the thesis, not the filters. Good screens begin with a clear statement of what you're looking for, "names with accelerating top-line growth that aren't priced for perfection", and then reverse-engineer the predicates. In that example: PEG < 1.5 AND last-quarter revenue-growth > trailing-12-month revenue-growth. That's two filters that directly express the thesis. Starting from "let me add a P/E filter and see what happens" produces kitchen-sink lists that match nothing in particular.

Use 5-7 filters as the target, not more. More than 7 predicates almost always over-specifies. The universe of 8000+ names shrinks to zero or near-zero, and you've optimized on noise. The useful queries have just enough predicates to encode the thesis, typically one fundamental, one technical, one sentiment, one regime, maybe one meta. Queries with 10+ filters are usually a sign the user is layering in every preference they've ever had rather than focusing on the current thesis.

Always include a regime sanity-check. Cheap names in a correction regime are often cheap for a reason (the market is punishing them for cause, and the trend is against you). High-relative-strength names in a trending regime are different from the same names in a chop regime (follow-through rates differ substantially). Without a regime filter, every screen is running blindfolded across different market conditions; adding a "trending regime only" or "relative strength top quartile" filter corrects for this.

Example: my daily quality-value screen

The exact filter composition:

FilterValueFamily
P/E (TTM)< 20fundamentals
Revenue growth (last Q)> Revenue growth (TTM)fundamentals
Relative strength vs. sector (60d)> 60th percentiletechnicals
Insider MSPR> 0sentiment
Regimenot "correction-high-vol"regime
Market cap> $1Bmeta

Six filters. On a typical session the screen returns 15-25 names; on a strong market day, 30-40; on a weak day, fewer. I run it every morning, scan the list in 2-3 minutes, and flag any name I haven't seen recently for deeper review. Over two years the hit rate on the flagged names (> +5% over the next 3 months) has been about 40%, not every name, but well above random, and the losers haven't been disasters because the insider-buying filter tends to catch companies with skin in the game.

What composable screeners can miss

  • Quality of the underlying data. Screeners are only as good as their input data; quarterly fundamentals lag, sentiment data is noisy on small caps.
  • Correlated predicates. P/E and PEG aren't independent; using both is redundant unless you understand why.
  • Survivor bias in back-testing. Screens run on the current universe miss names that were delisted or acquired, hit rates in back-testing can be inflated.
  • Regime transitions. A screen that works in a trending regime may not work in a choppy one; monitor hit rates across regimes.
  • Preset-library rot. Preset queries designed 2 years ago may no longer match current market conditions.

Common mistakes

  • Too many filters. Over-specification collapses the universe to noise.
  • Too few filters. Under-specification returns 300 names; you can't act on 300.
  • No regime check. Running the same screen in every regime is a common source of bad results.
  • Not saving. Re-typing the same 6 filters every morning is wasted time; save and schedule.
  • Reading only the top of the list. Ranking may sort on a noisy metric; scan the full list before concluding.

Where it fits

Pair with Screener Results which renders the ranked matches, with the Universe Browser for ad-hoc exploration, and with the Universe Heatmap for a visual snapshot of where winners/losers are clustering. For recurring workflows, save the screen and schedule a daily email.

FAQ

How often is underlying data refreshed?

Fundamentals on filing (10-Q/10-K). Technicals intraday. Sentiment hourly. Regime intraday.

Can I share saved searches?

Yes, share a read-only link with a teammate; edits remain private.

What's the filter count limit?

No hard limit, but performance degrades past ~15 filters. The card warns when you're over-specifying.

Can I filter by dollar-weighted exposure in my portfolio?

Yes, the "portfolio-aware" toggle weights matches by your current position size, useful for "rebalance candidates" queries.

Does the preset library get updated?

Periodically, presets get refreshed when market regimes shift or when new filter capabilities launch.

Related reading

Open the Screener Filters → /app/screener

See it in the app

Live dashboard views that match this post. Each tile deep-links to the exact card.

Related reading

Ready to try alphactor.ai?

Validate your trading strategies with statistical credibility testing. Start free.

Get Started Free
For informational and educational purposes only. Not financial advice. Learn more