{"slug":"biggest-stock-movers-2026","qid":"breadth","label":"Year-to-date breadth: how the screened universe is distributed across return buckets","post_title":"Biggest Stock Gainers & Losers of 2026","post_url":"/blog/biggest-stock-movers-2026#q-breadth","columns":["bucket","names","side_share_pct"],"rows":[{"bucket":"Down 40%+","names":18,"side_share_pct":31.2},{"bucket":"Down 20-40%","names":68,"side_share_pct":31.2},{"bucket":"Down 10-20%","names":73,"side_share_pct":31.2},{"bucket":"Down 0-10%","names":144,"side_share_pct":31.2},{"bucket":"Up 0-10%","names":165,"side_share_pct":68.8},{"bucket":"Up 10-25%","names":237,"side_share_pct":68.8},{"bucket":"Up 25-50%","names":140,"side_share_pct":68.8},{"bucket":"Up 50%+","names":127,"side_share_pct":68.8}],"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           sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv\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 adv >= 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      AND ticker NOT IN ('SPCX')\n      AND ticker NOT IN ('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')\n      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                         WHERE execution_date BETWEEN toDate('2026-01-01') AND today())\n    GROUP BY ticker\n    HAVING bars_open >= 100 AND bars_close >= 100\n),\nrets AS (\n    SELECT e.ticker AS ticker, (e.latest_close / e.year_open - 1) * 100 AS ret\n    FROM edges AS e\n    INNER JOIN universe AS u ON e.ticker = u.ticker\n    WHERE e.year_open >= 10\n)\nSELECT bucket,\n       names,\n       round(100 * sum(names) OVER (PARTITION BY side) / sum(names) OVER (), 1) AS side_share_pct\nFROM (\n    SELECT tup.1 AS bucket, tup.2 AS names, tup.3 AS ord, tup.4 AS side\n    FROM (\n        SELECT arrayJoin([\n            ('Down 40%+',   countIf(ret < -40),               1, 'down'),\n            ('Down 20-40%', countIf(ret >= -40 AND ret < -20), 2, 'down'),\n            ('Down 10-20%', countIf(ret >= -20 AND ret < -10), 3, 'down'),\n            ('Down 0-10%',  countIf(ret >= -10 AND ret < 0),   4, 'down'),\n            ('Up 0-10%',    countIf(ret >= 0 AND ret < 10),    5, 'up'),\n            ('Up 10-25%',   countIf(ret >= 10 AND ret < 25),   6, 'up'),\n            ('Up 25-50%',   countIf(ret >= 25 AND ret < 50),   7, 'up'),\n            ('Up 50%+',     countIf(ret >= 50),                8, 'up')\n        ]) AS tup\n        FROM rets\n    )\n)\nORDER BY ord","computed_at":"2026-08-25T13:02:43.726909+00:00","elapsed":11.725248062}