{"slug":"high-low-index-market-breadth","qid":"denominator_effect","label":"How thin the denominator gets: sessions bucketed by names at a 52-week extreme","post_title":"What Is the High-Low Index? Market Breadth","post_url":"/blog/high-low-index-market-breadth#q-denominator_effect","columns":["sample_size_bucket","readings","avg_names_in_denominator","median_record_high_pct","median_distance_from_50"],"rows":[{"sample_size_bucket":"1 to 3 names","readings":39,"avg_names_in_denominator":2,"median_record_high_pct":100,"median_distance_from_50":50},{"sample_size_bucket":"4 to 9 names","readings":37,"avg_names_in_denominator":5.2,"median_record_high_pct":80,"median_distance_from_50":30},{"sample_size_bucket":"10 or more names","readings":1,"avg_names_in_denominator":10,"median_record_high_pct":70,"median_distance_from_50":20}],"shape":"table","sql":"WITH daily_close AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,\n           argMax(close, window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',\n                     'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',\n                     'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',\n                     'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')\n      AND window_start >= toDateTime('2025-03-01 00:00:00')\n      AND window_start < toDateTime('2026-08-01 05:00:00')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker, session_date\n),\nextremes AS (\n    SELECT cur.ticker AS ticker,\n           cur.session_date AS session_date,\n           cur.close_px AS close_px,\n           max(hist.close_px) AS high_52w,\n           min(hist.close_px) AS low_52w\n    FROM daily_close AS cur\n    INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker\n    WHERE cur.session_date >= toDate('2026-04-01')\n      AND hist.session_date <= cur.session_date\n      AND hist.session_date > cur.session_date - 364\n    GROUP BY cur.ticker, cur.session_date, cur.close_px\n),\ndaily AS (\n    SELECT session_date,\n           countIf(close_px >= high_52w) AS new_highs,\n           countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme\n    FROM extremes\n    GROUP BY session_date\n    HAVING names_at_extreme > 0\n)\nSELECT multiIf(names_at_extreme <= 3, '1 to 3 names',\n               names_at_extreme <= 9, '4 to 9 names',\n               '10 or more names') AS sample_size_bucket,\n       count() AS readings,\n       round(avg(names_at_extreme), 1) AS avg_names_in_denominator,\n       round(quantileDeterministic(0.5)(100 * new_highs / names_at_extreme,\n                                        cityHash64(session_date)), 1) AS median_record_high_pct,\n       round(quantileDeterministic(0.5)(abs(100 * new_highs / names_at_extreme - 50),\n                                        cityHash64(session_date)), 1) AS median_distance_from_50\nFROM daily\nGROUP BY sample_size_bucket\nORDER BY avg_names_in_denominator","computed_at":"2026-08-04T15:02:23.181913+00:00","elapsed":0.004706574}