{"slug":"52-week-highs-and-lows","qid":"breadth_trend","label":"New 52-week highs against new lows, daily, over the past six weeks","post_title":"Stocks at 52-Week Highs and Lows","post_url":"/blog/52-week-highs-and-lows#q-breadth_trend","columns":["date","at_52w_high","at_52w_low","net_highs"],"rows":[{"date":"Jul 13, 2026","at_52w_high":32,"at_52w_low":8,"net_highs":24},{"date":"Jul 14, 2026","at_52w_high":29,"at_52w_low":5,"net_highs":24},{"date":"Jul 15, 2026","at_52w_high":26,"at_52w_low":9,"net_highs":17},{"date":"Jul 16, 2026","at_52w_high":37,"at_52w_low":6,"net_highs":31},{"date":"Jul 17, 2026","at_52w_high":32,"at_52w_low":8,"net_highs":24},{"date":"Jul 20, 2026","at_52w_high":18,"at_52w_low":10,"net_highs":8},{"date":"Jul 21, 2026","at_52w_high":23,"at_52w_low":7,"net_highs":16},{"date":"Jul 22, 2026","at_52w_high":22,"at_52w_low":11,"net_highs":11},{"date":"Jul 23, 2026","at_52w_high":21,"at_52w_low":20,"net_highs":1},{"date":"Jul 24, 2026","at_52w_high":32,"at_52w_low":12,"net_highs":20},{"date":"Jul 27, 2026","at_52w_high":34,"at_52w_low":1,"net_highs":33},{"date":"Jul 28, 2026","at_52w_high":45,"at_52w_low":2,"net_highs":43},{"date":"Jul 29, 2026","at_52w_high":30,"at_52w_low":14,"net_highs":16},{"date":"Jul 30, 2026","at_52w_high":23,"at_52w_low":5,"net_highs":18},{"date":"Jul 31, 2026","at_52w_high":17,"at_52w_low":5,"net_highs":12},{"date":"Aug 3, 2026","at_52w_high":20,"at_52w_low":1,"net_highs":19},{"date":"Aug 4, 2026","at_52w_high":41,"at_52w_low":1,"net_highs":40},{"date":"Aug 5, 2026","at_52w_high":44,"at_52w_low":3,"net_highs":41},{"date":"Aug 6, 2026","at_52w_high":33,"at_52w_low":4,"net_highs":29},{"date":"Aug 7, 2026","at_52w_high":37,"at_52w_low":3,"net_highs":34},{"date":"Aug 10, 2026","at_52w_high":47,"at_52w_low":5,"net_highs":42},{"date":"Aug 11, 2026","at_52w_high":42,"at_52w_low":4,"net_highs":38},{"date":"Aug 12, 2026","at_52w_high":45,"at_52w_low":8,"net_highs":37},{"date":"Aug 13, 2026","at_52w_high":46,"at_52w_low":2,"net_highs":44},{"date":"Aug 14, 2026","at_52w_high":37,"at_52w_low":3,"net_highs":34},{"date":"Aug 17, 2026","at_52w_high":28,"at_52w_low":5,"net_highs":23},{"date":"Aug 18, 2026","at_52w_high":30,"at_52w_low":7,"net_highs":23},{"date":"Aug 19, 2026","at_52w_high":29,"at_52w_low":0,"net_highs":29},{"date":"Aug 20, 2026","at_52w_high":17,"at_52w_low":8,"net_highs":9},{"date":"Aug 21, 2026","at_52w_high":33,"at_52w_low":5,"net_highs":28},{"date":"Aug 24, 2026","at_52w_high":29,"at_52w_low":9,"net_highs":20}],"shape":"series","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)\n      AND date >= (SELECT d FROM last_session) - 425\n),\nrolled AS (\n    SELECT ticker, dt, c,\n           max(c) OVER w AS hi,\n           min(c) OVER w AS lo,\n           count() OVER w AS n_sessions,\n           min(dt) OVER (PARTITION BY ticker) AS first_dt\n    FROM daily\n    WINDOW w AS (PARTITION BY ticker ORDER BY dt RANGE BETWEEN 364 PRECEDING AND CURRENT ROW)\n)\nSELECT formatDateTime(dt, '%b %e, %Y') AS date,\n       countIf(c >= hi * 0.99) AS at_52w_high,\n       countIf(c <= lo * 1.01) AS at_52w_low,\n       countIf(c >= hi * 0.99) - countIf(c <= lo * 1.01) AS net_highs\nFROM rolled\nWHERE n_sessions >= 200\n  AND first_dt <= dt - 350\n  AND dt > (SELECT d FROM last_session) - 43\nGROUP BY dt\nORDER BY dt","computed_at":"2026-08-25T13:16:16.791305+00:00","elapsed":7.939285866}