Alphanume

Insights

How to Build a Daily Movers Screener

Alphanume Team · June 5, 2026

From raw moves to a ranked, tradeable list.

Every trading day produces a list of stocks that moved the most. Brokerage platforms surface them, financial sites publish them, and retail traders chase them — but the raw biggest-percentage-gainers list is almost entirely noise. Illiquid microcaps, halted securities, bad prints, and stocks that moved on zero volume dominate the top of that list on most days. Building a useful daily movers screener means solving a different problem: not finding what moved the most, but finding what moved most meaningfully, with enough liquidity to act on and enough context to evaluate. The methodology for finding the biggest stock movers each day starts well before the sort step.

This post walks through the full construction pipeline — universe definition, move calculation, volatility normalization, catalyst attribution, ranking, and output — and flags the look-ahead and survivorship traps that corrupt backtests of any movers-based strategy. The output of a well-built screener is a research watchlist, not a trading signal. Keeping that distinction clear is half the work.

Why the naive biggest-gainers list is uninvestable

The simplest daily movers screener is a sort: rank every listed security by percentage change and read off the top twenty. The problem is that the inputs to that sort are mostly garbage by any institutional standard.

Microcap stocks with $50,000 in daily dollar volume will regularly post 40–80% gains on a few hundred shares changing hands. These moves are real in the sense that the last print is higher than the prior close — but they are uninvestable at any meaningful size and often reverse within hours. Halted stocks re-open at wide spreads that reflect stale arbitrage rather than fundamental news. Bad prints — erroneous trades that exchanges report before they are busted — appear in the intraday data until the correction propagates. Stocks with no options market, high short-locate costs, and no institutional presence trade in a vacuum that makes the move essentially unobservable for most market participants.

A screener that surfaces these names consumes research time on situations that cannot be acted on. The fix is not a better sort — it is a better universe, computed before any ranking takes place.

Step one — define the universe with point-in-time filters

The universe filter is the most important decision in the entire pipeline. Apply it before computing any moves. The standard inputs are:

  • Minimum average daily dollar volume. Use a trailing 20- or 30-day average, not the current day's volume. A floor of $5 million ADV is a reasonable starting point for liquid small-caps; $25 million or higher for anything that needs to absorb institutional flow. Dollar volume captures both price and shares — a stock at $0.50 trading 10 million shares has $5 million ADV, which is marginal; a stock at $20 trading 1 million shares has $20 million, which is workable.
  • Minimum price. Stocks below $1 are exchange-listed but frequently behave like OTC issues — wide spreads, low institutional presence, volatility dominated by retail flow. A $2 or $5 floor eliminates most of this noise.
  • Minimum market capitalization. A $100 million or $300 million market-cap floor removes the bulk of the uninvestable microcap tail.
  • Exchange listing. Restricting to NYSE and NASDAQ primary listings, and explicitly excluding OTC markets, removes most problematic names without meaningful loss of universe coverage for most strategies.
  • Point-in-time membership. This is where most implementations fail. The universe must reflect which securities were listed and passing filters on the date in question — not today. Survivorship bias from using a current-day universe to backtest a historical screener artificially inflates returns because delisted stocks (frequently the worst performers) are excluded from the historical sort. A daily snapshot of index or exchange membership, lagged by the reporting delay, is the correct input.

Universe definition is not a one-time decision. Filters should be applied to a historical point-in-time database so that backtests reflect the actual investable set on each date. The Alphanume Next-Day Movers dataset is built on exactly this structure — the universe is defined forward-looking from the prior day's close, not backward from today's survivors.

Step two — compute the move correctly

Once the universe is defined, the move calculation needs to be precise. Three dimensions matter:

Corporate-action adjustment. Raw price changes must be adjusted for splits, dividends, and spin-offs. An unadjusted stock that pays a $1.00 special dividend will show a fake decline equal to the dividend amount. A forward-split will create a fake multi-hundred-percent gain. Adjust all prices to a consistent split- and dividend-adjusted series before computing returns. For intraday work, use the prior close adjusted for actions that occurred between the prior close and today's open.

Gap vs. intraday vs. close-to-close. These are three distinct moves and conflating them produces mixed signals. The gap is the return from the prior adjusted close to the current day's open — this captures overnight news and pre-market price discovery. The intraday move is the return from open to close — this reflects what happened during the session. The close-to-close return is the sum of both. Understanding what causes a stock to gap is essential for attributing the source of the move. A stock that gapped 8% at the open and gave back 3% intraday is a very different situation from one that opened flat and ran 5% through the session.

Dollar-volume confirmation. A percentage move on abnormally high dollar volume is more significant than the same move on low volume. Compute the ratio of today's dollar volume to the 20-day average — a ratio above 2× or 3× indicates that the move is attracting real participation. Discard or discount moves that occur on below-average volume.

Step three — normalize by volatility

A 4% move in a stock that typically moves 1% per day is a large signal. A 4% move in a stock that regularly swings 5% per day is unremarkable. Raw percentage moves are not comparable across securities with different volatility profiles. Normalization is required.

Two standard approaches:

Standard-deviation normalization. Divide the daily return by the trailing 20-day realized daily standard deviation of returns. The result is expressed in sigma terms — a move of 2σ or above is unusual for that specific stock. This allows direct comparison across securities. A 3% move in a low-volatility utility and a 3% move in a high-volatility biotech score very differently after normalization, which is the correct behavior.

ATR normalization. Average true range, typically computed over 14 days, captures high-low range rather than close-to-close volatility. Dividing the day's range or close-to-close move by the ATR provides a similar normalization in range terms. ATR is somewhat more robust to overnight gaps because it incorporates the high-low spread of each day.

The screener rank should be built on the normalized move, not the raw percentage. Sort by sigma-adjusted return or ATR-adjusted range. Names that rank highly on a normalized basis but would not appear on a raw-percentage sort are frequently the most actionable situations.

Step four — attach context and catalyst

A normalized move with high volume is a statistical event. It becomes a research opportunity only when context is attached. The relevant context inputs are:

Input What it provides Why it matters
News/earnings catalyst flag Binary: was there a press release, earnings report, or SEC filing today? Moves with an identifiable catalyst are more likely to be persistent than moves on no news
Filing type 8-K item number, earnings flag, guidance change Allows classification of the catalyst as fundamental vs. technical
Sector and industry GICS sector and sub-industry Identifies whether a move is company-specific or part of a sector rotation
Short interest Most recent short interest as percentage of float High short interest combined with a large up-move signals potential short squeeze dynamics
Options availability Whether listed options exist; open interest level Options presence enables hedged positioning and provides an implied volatility reference
Relative strength vs. sector Stock move minus sector ETF move on the same day Isolates idiosyncratic move from broad sector beta
Institutional ownership 13F ownership as percentage of shares outstanding Higher institutional presence generally implies tighter spreads and more reliable price discovery

Context does not change the rank — but it determines which ranked names warrant further research. A top-ranked normalized mover with an earnings catalyst, high short interest, and active options is a different research situation from a top-ranked mover with no news, low short interest, and no options market.

Step five — rank, threshold, and output

With universe filtering, move calculation, volatility normalization, and context in place, the ranking step is mechanical. The screener produces an ordered list by normalized move, filtered to the universe, with context fields attached. A practical threshold: names above 2σ normalized move, with dollar-volume ratio above 2×, and above the liquidity floor. Most days this produces 15–40 names on the long side and a comparable set on the short side.

The output is a research watchlist, not a trading signal. The distinction is important. A watchlist is a prioritized set of situations worth examining further — reading the catalyst, checking the chart structure, assessing the sector backdrop, reviewing short interest dynamics. A trading signal would carry an expected edge estimate derived from a validated backtest. The screener output is input to that next stage, not a substitute for it.

A model-ranked next-day movers feed inverts the logic: instead of scanning today's movers as a backward-looking exercise, it uses the inputs described above — normalized moves, volume ratios, catalyst flags, short interest — as features in a predictive model that ranks securities by expected continuation or reversal the following day. That is a materially different product from a daily scan, and it requires a labeled historical outcome dataset and out-of-sample validation to be credible.

Survivorship and look-ahead pitfalls

Two biases corrupt nearly every backtested implementation of a movers screener, and both are worth naming explicitly.

Survivorship bias. If the universe is constructed from today's list of listed securities and then applied to historical dates, every delisted stock is excluded from the historical universe. Delistings are disproportionately companies that went bankrupt, were acquired at distressed prices, or experienced sustained declines — exactly the kind of downside movers that would appear on a short-side screener. Excluding them makes the historical short-side results look better than they were. The universe must be built from point-in-time membership data: which securities were listed and passing filters on each specific date in the backtest.

Look-ahead bias. Two forms are common. First, using end-of-day adjusted prices that have been retroactively corrected for corporate actions — if the adjustment factor for a split is applied before the split was announced, the pre-split prices are artificially transformed. The adjusted price series must only incorporate adjustments that were known on the date in question. Second, using financial data that was not yet available on the date being tested — quarterly earnings filed sixty days after the quarter ends cannot be used as a feature for a screener running the day after the quarter closes. Point-in-time data discipline eliminates both forms, but it requires a database that stores original-as-reported figures with filing dates rather than restated current values.

A screener built without these disciplines will produce backtested results that look compelling and live results that disappoint. The gap between backtest and live performance is usually not model failure — it is data contamination that was never corrected.