What Is the High-Low Index? Market Breadth
Record High Percent and its 10-day average (the High-Low Index), 40-name basketseries ·
2026-08-04 · 68×4
New 52-week highs and lows each session: 40 large-cap US names, April to July 2026series ·
2026-08-04 · 77×4
How thin the denominator gets: sessions bucketed by names at a 52-week extremetable ·
2026-08-04 · 3×5
Two breadth measures, same basket: 10-day High-Low Index vs 10-day advancing shareseries ·
2026-08-04 · 68×4
Record High Percent and its 10-day average (the High-Low Index), 40-name basket
Record High Percent and its 10-day average (the High-Low Index), 40-name basket
| date | session_label | record_high_pct | high_low_index_pct |
|---|---|---|---|
| 2026-04-15 | Apr 15 | 100 | 52.5 |
| 2026-04-17 | Apr 17 | 100 | 57.5 |
| 2026-04-20 | Apr 20 | 100 | 67.5 |
| 2026-04-21 | Apr 21 | 100 | 72.5 |
| 2026-04-22 | Apr 22 | 100 | 82.5 |
| 2026-04-23 | Apr 23 | 100 | 87.5 |
| 2026-04-24 | Apr 24 | 100 | 92.5 |
| 2026-04-27 | Apr 27 | 100 | 100 |
| 2026-04-29 | Apr 29 | 100 | 100 |
| 2026-04-30 | Apr 30 | 100 | 100 |
| 2026-05-01 | May 1 | 100 | 100 |
| 2026-05-04 | May 4 | 50 | 95 |
| 2026-05-05 | May 5 | 100 | 95 |
| 2026-05-06 | May 6 | 85.7 | 93.6 |
| 2026-05-07 | May 7 | 50 | 88.6 |
| 2026-05-08 | May 8 | 83.3 | 86.9 |
| 2026-05-11 | May 11 | 57.1 | 82.6 |
| 2026-05-12 | May 12 | 62.5 | 78.9 |
| 2026-05-13 | May 13 | 70 | 75.9 |
| 2026-05-14 | May 14 | 80 | 73.9 |
| 2026-05-15 | May 15 | 60 | 69.9 |
| 2026-05-18 | May 18 | 100 | 74.9 |
| 2026-05-19 | May 19 | 100 | 74.9 |
| 2026-05-20 | May 20 | 100 | 76.3 |
| 2026-05-21 | May 21 | 100 | 81.3 |
| 2026-05-22 | May 22 | 100 | 83 |
| 2026-05-26 | May 26 | 100 | 87.2 |
| 2026-05-27 | May 27 | 100 | 91 |
| 2026-05-28 | May 28 | 100 | 94 |
| 2026-05-29 | May 29 | 100 | 96 |
| 2026-06-01 | Jun 1 | 100 | 100 |
| 2026-06-02 | Jun 2 | 100 | 100 |
| 2026-06-03 | Jun 3 | 0 | 90 |
| 2026-06-04 | Jun 4 | 66.7 | 86.7 |
| 2026-06-05 | Jun 5 | 50 | 81.7 |
| 2026-06-08 | Jun 8 | 66.7 | 78.3 |
| 2026-06-09 | Jun 9 | 100 | 78.3 |
| 2026-06-10 | Jun 10 | 100 | 78.3 |
| 2026-06-11 | Jun 11 | 66.7 | 75 |
| 2026-06-12 | Jun 12 | 66.7 | 71.7 |
| 2026-06-15 | Jun 15 | 0 | 61.7 |
| 2026-06-16 | Jun 16 | 75 | 59.2 |
| 2026-06-17 | Jun 17 | 57.1 | 64.9 |
| 2026-06-18 | Jun 18 | 40 | 62.2 |
| 2026-06-22 | Jun 22 | 50 | 62.2 |
| 2026-06-24 | Jun 24 | 66.7 | 62.2 |
| 2026-06-25 | Jun 25 | 55.6 | 57.8 |
| 2026-06-26 | Jun 26 | 83.3 | 56.1 |
| 2026-06-29 | Jun 29 | 83.3 | 57.8 |
| 2026-06-30 | Jun 30 | 50 | 56.1 |
| 2026-07-01 | Jul 1 | 66.7 | 62.8 |
| 2026-07-02 | Jul 2 | 100 | 65.3 |
| 2026-07-06 | Jul 6 | 100 | 69.6 |
| 2026-07-07 | Jul 7 | 100 | 75.6 |
| 2026-07-09 | Jul 9 | 100 | 80.6 |
| 2026-07-13 | Jul 13 | 75 | 81.4 |
| 2026-07-14 | Jul 14 | 75 | 83.3 |
| 2026-07-15 | Jul 15 | 80 | 83 |
| 2026-07-16 | Jul 16 | 75 | 82.2 |
| 2026-07-17 | Jul 17 | 100 | 87.2 |
| 2026-07-20 | Jul 20 | 0 | 80.5 |
| 2026-07-21 | Jul 21 | 25 | 73 |
| 2026-07-22 | Jul 22 | 33.3 | 66.3 |
| 2026-07-23 | Jul 23 | 40 | 60.3 |
| 2026-07-24 | Jul 24 | 66.7 | 57 |
| 2026-07-27 | Jul 27 | 100 | 59.5 |
| 2026-07-28 | Jul 28 | 100 | 62 |
| 2026-07-29 | Jul 29 | 100 | 64 |
the exact SQL behind every number
WITH daily_close AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(close, window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','AVGO','JPM','JNJ','XOM','PG',
'KO','PEP','WMT','HD','CVX','MRK','PFE','ABBV','CSCO','ORCL',
'CRM','ADBE','MCD','NKE','VZ','T','DIS','BA','CAT','GE',
'IBM','MMM','UNH','LLY','COST','TGT','SBUX','GS','MS','LIN')
AND window_start >= toDateTime('2025-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 05:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
extremes AS (
SELECT cur.ticker AS ticker,
cur.session_date AS session_date,
cur.close_px AS close_px,
max(hist.close_px) AS high_52w,
min(hist.close_px) AS low_52w
FROM daily_close AS cur
INNER JOIN daily_close AS hist ON cur.ticker = hist.ticker
WHERE cur.session_date >= toDate('2026-04-01')
AND hist.session_date <= cur.session_date
AND hist.session_date > cur.session_date - 364
GROUP BY cur.ticker, cur.session_date, cur.close_px
),
daily AS (
SELECT session_date,
countIf(close_px >= high_52w) AS new_highs,
countIf(close_px >= high_52w) + countIf(close_px <= low_52w) AS names_at_extreme
FROM extremes
GROUP BY session_date
HAVING names_at_extreme > 0
),
rhp AS (
SELECT session_date,
round(100 * new_highs / names_at_extreme, 1) AS record_high_pct
FROM daily
),
smoothed AS (
SELECT session_date,
record_high_pct,
round(avg(record_high_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS high_low_index_pct,
count() OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS sessions_in_window
FROM rhp
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
record_high_pct,
high_low_index_pct
FROM smoothed
WHERE sessions_in_window = 10
ORDER BY session_date
More from this analysisWhat Is the High-Low Index? Market Breadth
New 52-week highs and lows each session: 40 large-cap US names, April to July 2026
series 77×4
→
Two breadth measures, same basket: 10-day High-Low Index vs 10-day advancing share
series 68×4
→
How thin the denominator gets: sessions bucketed by names at a 52-week extreme
table 3×5
→
AAPL price vs. running VWAP: July 2, 2026 regular session, sampled every 5 minutes
series 78×3
→
See all 2,170 queries →