{"slug":"biggest-stock-movers-2026","qid":"screen_funnel","label":"The screen, stage by stage: how many names survive each filter","post_title":"Biggest Stock Gainers & Losers of 2026","post_url":"/blog/biggest-stock-movers-2026#q-screen_funnel","columns":["screen_step","names"],"rows":[{"screen_step":"Traded the first and the last full session","names":4551},{"screen_step":"Averaging $100m+ a day over the past month","names":1046},{"screen_step":"Opened 2026 above $10 a share","names":1013},{"screen_step":"Not on the excluded-fund list","names":986},{"screen_step":"No split or stock dividend in 2026","names":972}],"shape":"ranking","sql":"WITH complete AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= toDateTime('2026-01-01 00:00:00')\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n    GROUP BY d\n    HAVING count() >= 380\n),\nuniverse AS (\n    SELECT ticker\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE window_start >= now() - INTERVAL 21 DAY\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20\n      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n    GROUP BY ticker\n    HAVING sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) >= 100000000\n),\nedges AS (\n    SELECT ticker,\n        argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,\n        argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,\n        countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,\n        countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))\n        OR (window_start >= now() - INTERVAL 8 DAY))\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n\n    GROUP BY ticker\n    HAVING bars_open >= 100 AND bars_close >= 100\n),\nflagged AS (\n    SELECT ticker,\n        year_open,\n        ticker IN (SELECT ticker FROM universe) AS liquid,\n        ticker NOT IN ('SPCX','KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL') AS not_geared,\n        ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                       WHERE execution_date BETWEEN toDate('2026-01-01') AND today()) AS no_split\n    FROM edges\n)\nSELECT tup.1 AS screen_step, tup.2 AS names\nFROM (\n    SELECT arrayJoin([\n        ('Traded the first and the last full session', count()),\n        ('Averaging $100m+ a day over the past month', countIf(liquid)),\n        ('Opened 2026 above $10 a share', countIf(liquid AND year_open >= 10)),\n        ('Not on the excluded-fund list', countIf(liquid AND year_open >= 10 AND not_geared)),\n        ('No split or stock dividend in 2026', countIf(liquid AND year_open >= 10 AND not_geared AND no_split))\n    ]) AS tup\n    FROM flagged\n)","computed_at":"2026-08-25T13:03:01.343451+00:00","elapsed":10.186148912}