{"slug":"52-week-highs-and-lows","qid":"range_position","label":"How far the whole screen sits below its 52-week high","post_title":"Stocks at 52-Week Highs and Lows","post_url":"/blog/52-week-highs-and-lows#q-range_position","columns":["bucket","stocks","share_pct","median_ytd_pct"],"rows":[{"bucket":"At the high (under 1%)","stocks":29,"share_pct":6.2,"median_ytd_pct":31.9},{"bucket":"1% to 5% below","stocks":61,"share_pct":13.1,"median_ytd_pct":27.8},{"bucket":"5% to 10% below","stocks":78,"share_pct":16.8,"median_ytd_pct":15.3},{"bucket":"10% to 20% below","stocks":105,"share_pct":22.6,"median_ytd_pct":5.4},{"bucket":"20% to 35% below","stocks":95,"share_pct":20.5,"median_ytd_pct":-2.7},{"bucket":"More than 35% below","stocks":96,"share_pct":20.7,"median_ytd_pct":-9.3}],"shape":"ranking","sql":"WITH universe AS (\n    SELECT ticker\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE window_start >= now() - INTERVAL 20 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 IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements\n                     WHERE period_end >= today() - 400)\n      AND ticker NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')\n      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                         WHERE execution_date BETWEEN today() - 460 AND today())\n    GROUP BY ticker\n    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000\n),\nlast_session AS (\n    SELECT max(date) AS d FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY' AND date >= today() - 12 AND date < today()\n),\ndaily AS (\n    SELECT ticker, date AS dt, toFloat64(close) AS c\n    FROM global_markets.stocks_daily_aggs\n    WHERE date < today()\n      AND ticker IN (SELECT ticker FROM universe)\n      AND date > (SELECT d FROM last_session) - 365\n),\nranged AS (\n    SELECT ticker,\n           argMax(c, dt) AS last_close,\n           max(c) AS hi,\n           min(c) AS lo,\n           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,\n           count() AS n_sessions,\n           min(dt) AS first_dt,\n           max(dt) AS last_dt\n    FROM daily\n    GROUP BY ticker\n    HAVING n_sessions >= 200\n       AND countIf(dt <= toDate('2025-12-31')) > 0\n       AND last_dt = (SELECT d FROM last_session)\n       AND first_dt <= (SELECT d FROM last_session) - 350\n)\nSELECT multiIf(p < 1, 'At the high (under 1%)',\n               p < 5, '1% to 5% below',\n               p < 10, '5% to 10% below',\n               p < 20, '10% to 20% below',\n               p < 35, '20% to 35% below',\n               'More than 35% below') AS bucket,\n       count() AS stocks,\n       round(100.0 * count() / sum(count()) OVER (), 1) AS share_pct,\n       round(quantileExact(0.5)(ytd), 1) AS median_ytd_pct\nFROM (\n    SELECT (1 - last_close / hi) * 100 AS p,\n           (last_close / base_close - 1) * 100 AS ytd,\n           multiIf(p < 1, 0, p < 5, 1, p < 10, 2, p < 20, 3, p < 35, 4, 5) AS ord\n    FROM ranged\n)\nGROUP BY bucket, ord\nORDER BY ord","computed_at":"2026-08-25T13:16:23.258446+00:00","elapsed":6.365584286}