Wat is de High-Low Index? Marktbreedte
De High-Low Index is het 10-daags gemiddelde van Record High Percent. Bekijk de formule met ronde getallen en de valkuil van een kleine steekproef op rustige handelsdagen.
De High-Low Index is een breadth-maatstaf die op twee tellingen is gebaseerd: het is het 10-daags simple moving average van Record High Percent, en Record High Percent is het aantal nieuwe 52-week highs gedeeld door de som van het aantal nieuwe 52-week highs en nieuwe 52-week lows, vermenigvuldigd met 100. Een stand boven 50 betekent dat meer aandelen nieuwe highs printen dan nieuwe lows. Een stand onder 50 betekent het omgekeerde. Zo kort is de formule. Hieronder volgen de rekenstappen met ronde getallen en de tekortkoming in de steekproefomvang, waardoor een overtuigend ogende stand op slechts enkele aandelen kan berusten.
Hoe berekent u de High-Low Index?
Twee stappen, die elk op één regel passen.
- Record High Percent voor één sessie: tel de aandelen in uw universum die op een nieuwe 52-week high sloten, tel de aandelen die op een nieuwe 52-week low sloten, deel het aantal highs door de som van beide aantallen en vermenigvuldig vervolgens met 100.
- De High-Low Index: bereken het gemiddelde van de laatste 10 dagelijkse Record High Percent-standen.
Ronde getallen maken dit concreet. In een tape worden 90 nieuwe highs en 30 nieuwe lows geprint. Highs plus lows is 120, en 90 gedeeld door 120 is 0,75. Record High Percent voor die sessie is dus 75. Neem vervolgens tien sessies met de standen 75, 70, 65, 60, 55, 50, 45, 40, 35 en 30. Deze tellen op tot 525, en 525 gedeeld door 10 is 52,5. De High-Low Index staat op 52,5 op een dag waarop Record High Percent zelf 75 was.
Dat verschil is de prijs van het moving average. Tien dagen aan historie dempt een reeks die van de ene op de andere dag van 100 naar 0 kan bewegen. Daar staat tegenover dat de index later reageert. De index laat zien hoe breadth zich over twee weken heeft ontwikkeld. Hij laat nooit zien wat er die middag gebeurde.
Wat geldt als een nieuwe 52-week high?
Een aandeel maakt een nieuwe 52-week high wanneer de koers hoger staat dan elke koers die het in de voorafgaande 52 weken heeft geprint. Dataleveranciers hanteren hiervoor verschillende grondslagen. Sommige vergelijken intraday highs en lows, andere uitsluitend slotkoersen. Daardoor kunnen de tellingen voor dezelfde sessie verschillen. Op deze pagina vormen slotkoersen de grondslag. Nieuwe 52-week highs en lows bespreekt de lijst zelf.
Het paneel hieronder telt voor elke sessie beide extremen voor een vaste basket van 40 Amerikaanse large-cap-aandelen, van 1 april tot en met 31 juli 2026. Bij een basket van die omvang blijven de tellingen klein genoeg om met de hand te controleren. Daardoor wordt de tekortkoming in de formule later zichtbaar.
De exacte SQL achter elk getal
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 <= low_52w) AS new_lows,
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
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
new_highs,
new_lows
FROM daily
ORDER BY session_dateIn 77 sessies lopen de twee tellingen zelden gelijk op. Op Jul 29, de laatste sessie in het venster, sloten 3 van de 40 namen op een 52-week high en 0 op een 52-week low. Op Apr 1, de eerste sessie, was de verdeling 1 highs tegenover 1 lows. Alle andere namen in de basket bevonden zich ergens binnen hun eigen bandbreedte en kwamen niet in de berekening terecht.
Wat is een goede stand van de High-Low Index?
De 50-lijn is het omslagpunt, met highs en lows in balans. De conventionele sterke markering is 70. Daarbij waren nieuwe highs over het volledige 10-daagse gemiddelde met meer dan two-to-one in de meerderheid ten opzichte van nieuwe lows. De conventionele zwakke markering is 30, het spiegelbeeld daarvan. Tussen 30 en 70 geeft de index aan dat de marktextremen gemengd zijn. Daar bevindt de index zich het grootste deel van de tijd.
Het paneel hieronder zet de ruwe dagelijkse Record High Percent af tegen het eigen 10-daags gemiddelde voor dezelfde basket. De vertraging is in de grafiek zichtbaar en wordt niet alleen beschreven.
De exacte SQL achter elk getal
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_dateDe weergegeven reeks begint op Apr 15 met een Record High Percent van 100 en een indexstand van 52.5. De reeks eindigt op Jul 29 met 100 en een indexstand van 64. Vergelijk elke stand met de markeringen 70 en 30. Beschouw de afstand tussen de twee lijnen als de prijs van smoothing: op een willekeurige dag bevat het gemiddelde nog negen oudere sessies. De eerste negen sessies van het venster zijn niet in het paneel opgenomen, omdat voor een 10-daags gemiddelde 10 dagen nodig zijn.
De noemer negeert het grootste deel van de markt
Dit is de beperking die u moet onthouden. De noemer van Record High Percent bestaat uit nieuwe highs plus nieuwe lows, en verder niets. Een aandeel dat midden in zijn 52-week range staat, komt niet voor in de teller en ook niet in de noemer. De index kan geen onderscheid maken tussen een sessie waarin 900 van 3.000 namen een extreem bereiken en een sessie waarin dat er 9 zijn. In beide gevallen verschijnt dezelfde zelfverzekerd ogende tweecijferige stand.
Neem een beurs met 6.000 namen tijdens een rustige sessie in augustus. 40 aandelen maken een nieuwe high en 20 maken een nieuwe low. Record High Percent is 40 gedeeld door 60, oftewel 66,7. Dat leest als een brede stijging. De berekening is echter gebaseerd op 1% van de listings. De overige 5.940 namen hadden geen stem.
De basket van 40 namen brengt dit in telbare vorm in beeld. Elke sessie in het venster wordt ingedeeld op basis van het aantal namen dat überhaupt een extreem printte.
De exacte SQL achter elk getal
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
)
SELECT multiIf(names_at_extreme <= 3, '1 to 3 names',
names_at_extreme <= 9, '4 to 9 names',
'10 or more names') AS sample_size_bucket,
count() AS readings,
round(avg(names_at_extreme), 1) AS avg_names_in_denominator,
round(quantileDeterministic(0.5)(100 * new_highs / names_at_extreme,
cityHash64(session_date)), 1) AS median_record_high_pct,
round(quantileDeterministic(0.5)(abs(100 * new_highs / names_at_extreme - 50),
cityHash64(session_date)), 1) AS median_distance_from_50
FROM daily
GROUP BY sample_size_bucket
ORDER BY avg_names_in_denominatorIn de 39 sessies in de bucket 1 to 3 names was de volledige stand gebaseerd op gemiddeld 2 namen van de 40. In die sessies bedroeg de mediane Record High Percent 100 en lag deze mediaan 50 punten van de 50-lijn. De 10 or more names sessies, waarvan 1 op gemiddeld 10 namen waren gebaseerd, hadden een mediane 70 en lagen 20 punten van het midden.
De rekenkundige structuur beperkt ook welke stand een dunne sessie überhaupt kan laten zien. Met drie namen op een extreem zijn alleen 0, 33,3, 66,7 en 100 mogelijk. Met twee namen zijn alleen 0, 50 en 100 mogelijk. Een stand van 66,7 die is gebaseerd op twee highs en één low, bevat een decimaal die de steekproef niet kan dragen. De eenvoudige oplossing is: lees de ruwe tellingen van highs en lows naast de index en kijk nooit alleen naar de index.
Market breadth: High-Low Index versus advance/decline
Beide maatstaven meten hoeveel aandelen deelnemen. Ze doen dat over verschillende perioden. Advance/decline breadth telt elke naam die hoger of lager eindigde dan de vorige dag. De noemer is het volledige universum en de maatstaf beschrijft één dag. De High-Low Index telt alleen namen op een 52-week extreme. De noemer is klein en de maatstaf beschrijft waar koersen staan ten opzichte van een volledig jaar aan historie. Een tape kan die dag breed hoger staan terwijl slechts enkele namen in de buurt van een 52-week high komen.
Het paneel hieronder strijkt beide maatstaven glad over dezelfde 10 sessies en voor dezelfde basket. Daardoor staan ze op één schaal.
De exacte SQL achter elk getal
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
),
prior AS (
SELECT ticker,
session_date,
close_px,
lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily_close
),
breadth AS (
SELECT session_date,
round(100 * countIf(close_px > prev_close) / count(), 1) AS advancing_pct
FROM prior
WHERE session_date >= toDate('2026-04-01')
AND prev_close > 0
GROUP BY session_date
HAVING count() >= 20
),
combined AS (
SELECT d.session_date AS session_date,
round(100 * d.new_highs / d.names_at_extreme, 1) AS record_high_pct,
b.advancing_pct AS advancing_pct
FROM daily AS d
INNER JOIN breadth AS b ON d.session_date = b.session_date
),
smoothed AS (
SELECT session_date,
round(avg(record_high_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS high_low_index_pct,
round(avg(advancing_pct) OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 1) AS advancing_pct_10d,
count() OVER (ORDER BY session_date
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS sessions_in_window
FROM combined
)
SELECT session_date AS date,
formatDateTimeInJodaSyntax(session_date, 'MMM d') AS session_label,
high_low_index_pct,
advancing_pct_10d
FROM smoothed
WHERE sessions_in_window = 10
ORDER BY session_dateDe twee reeksen beginnen in het weergegeven bereik op Apr 15 met 52.5 voor de High-Low Index en 52.8 voor het 10-daags aandeel stijgers. Ze eindigen op Jul 29 met respectievelijk 64 en 52.5, over 68 weergegeven sessies. Het aandeel stijgers beweegt binnen een smalle band. Op een normale sessie sluit ongeveer de helft van een basket hoger. Het gemiddelde van tien van zulke sessies blijft daardoor dicht bij het midden van de schaal. De High-Low Index heeft geen vergelijkbaar anker. Wanneer tien sessies achter elkaar geen naam in de basket een 52-week low print, is elke dagelijkse stand 100 en bedraagt ook het gemiddelde 100.
Breadth wordt beter geïnterpreteerd naast participation-maatstaven. Relative volume laat zien of één naam vandaag ongewoon actief wordt verhandeld ten opzichte van zijn eigen norm. De grootste koersbewegers van de week toont welke namen daadwerkelijk bewogen, en aandelen met unusual volume deze week laat zien waar de handel plaatsvond.
Veelgestelde vragen over de High-Low Index
Wat betekent een stand van de High-Low Index boven 70?
Dit betekent dat nieuwe 52-week highs over het gemiddelde van de laatste tien sessies met meer dan two-to-one in de meerderheid waren ten opzichte van nieuwe 52-week lows. Dit is de conventionele markering voor een sterke tape. De stand zegt niet hoeveel aandelen überhaupt een extreem bereikten. Dat aantal moet u ernaast controleren.
Wat is het verschil tussen Record High Percent en de High-Low Index?
Record High Percent is het cijfer voor één sessie: nieuwe highs gedeeld door nieuwe highs plus nieuwe lows, vermenigvuldigd met 100. De High-Low Index is het 10-daags simple moving average van dat cijfer. Het ene beschrijft vandaag. Het andere beschrijft de afgelopen twee weken.
Kan de High-Low Index 0 of 100 zijn?
Ja. Als geen enkel aandeel in het universum gedurende tien opeenvolgende sessies een nieuwe 52-week low maakt, is elke dagelijkse stand 100 en geldt dat ook voor het gemiddelde. Wanneer geen enkel aandeel een high of low maakt, heeft de breuk een noemer van nul en is er voor die sessie geen gedefinieerde stand.
Is de High-Low Index hetzelfde als advance/decline breadth?
Nee. Advance/decline breadth deelt door het volledige universum en beschrijft de richting op één dag. De High-Low Index deelt door de kleine groep aandelen die op 52-week extremen staan en beschrijft hun positie ten opzichte van een jaar aan koersen.
Hoeveel aandelen zitten doorgaans in de noemer van de High-Low Index?
In de hier gemeten basket van 40 namen, van april tot en met juli 2026, bevatten sessies in de bucket 1 to 3 names gemiddeld 2 namen in de noemer. Tellingen voor een volledige beurs zijn absoluut gezien groter, maar blijven een klein deel van alle listings. Daarom horen de ruwe tellingen naast de index op het scherm te staan.
Elke telling op deze pagina is afkomstig uit een opgeslagen, versieerde query op basis van slotkoersen. Open een paneel om de SQL erachter te lezen, of bouw dezelfde breadth-reeks op voor een basket van uw keuze in de Strasmore-terminal.