Ano ang High-Low Index? Market Breadth
Ang High-Low Index ay 10-day average ng Record High Percent. Tingnan ang formula gamit ang bilog na numero at ang sample size trap sa tahimik na market.
Ang High-Low Index ay isang sukatan ng market breadth na binubuo mula sa dalawang bilang. Ito ang 10-day simple moving average ng Record High Percent. Ang Record High Percent naman ay new 52-week highs na hinati sa kabuuan ng new 52-week highs at new 52-week lows, at saka minultiply sa 100. Kapag higit sa 50 ang reading, mas maraming stock ang nagpi-print ng bagong high kaysa bagong low. Kapag mas mababa sa 50, kabaligtaran ang ipinapakita nito. Ganoon kaikli ang formula. Ang kasunod ay ang arithmetic gamit ang mga bilog na numero, pati ang sample size flaw na maaaring magmukhang mapagpasiya ang reading kahit nakabatay lamang ito sa ilang stock.
Paano kinakalkula ang High-Low Index?
Dalawang hakbang, at parehong kasya sa isang linya.
- Record High Percent para sa isang session: bilangin ang mga stock sa iyong universe na nagsara sa bagong 52-week high, bilangin ang mga nagsara sa bagong 52-week low, hatiin ang highs sa kabuuan ng highs at lows, at i-multiply sa 100.
- High-Low Index: kunin ang average ng pinakahuling 10 daily Record High Percent readings.
Mas madaling makita gamit ang mga bilog na numero. May 90 new highs at 30 new lows ang tape. Ang highs plus lows ay 120, at ang 90 na hinati sa 120 ay 0.75, kaya 75 ang Record High Percent para sa session na iyon. Ngayon, kunin ang readings sa sampung session: 75, 70, 65, 60, 55, 50, 45, 40, 35 at 30. Ang kabuuan ng mga ito ay 525, at ang 525 na hinati sa 10 ay 52.5. Ang High-Low Index ay nasa 52.5 sa araw na ang sariling Record High Percent ay 75.
Ang agwat na iyon ang epekto ng moving average. Pinapakinis ng sampung araw na memorya ang seryeng maaaring umakyat mula 0 hanggang 100 o bumagsak mula 100 hanggang 0 sa loob ng magdamag, kapalit ng mas mabagal na pagdating ng signal. Sinasagot ng index kung nasaan ang market breadth sa loob ng dalawang linggo. Hindi nito sinasagot kung ano ang nangyari ngayong hapon.
Ano ang itinuturing na bagong 52-week high?
Nagtatala ang isang stock ng bagong 52-week high kapag nalampasan ng presyo nito ang lahat ng presyong na-print nito sa nakaraang 52 weeks. Magkakaiba ang batayan ng mga data provider: ikinukumpara ng ilan ang intraday highs at lows, habang closing prices lamang ang ginagamit ng iba. Magkaiba ang bilang na lalabas para sa parehong session. Closing prices ang batayan sa buong pahinang ito. Ipinapaliwanag sa Mga bagong 52-week highs at lows ang mismong listahan.
Binibilang ng panel sa ibaba ang dalawang extreme sa bawat session para sa fixed basket ng 40 large-cap US names, mula April 1 hanggang July 31, 2026. Dahil 40 lamang ang laman ng basket, sapat na maliit ang mga bilang para masuri nang mano-mano. Dahil dito, mas madaling makita sa bandang huli ang pagkukulang sa formula.
Ang eksaktong SQL sa likod ng bawat numero
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_dateSa 77 sessions, bihirang sabay na tumaas ang dalawang bilang. Noong Jul 29, ang huling session sa window, 3 sa 40 names ang nagsara sa 52-week high at 0 ang nagsara sa 52-week low. Noong Apr 1, ang unang session, 1 highs ang naitala kumpara sa 1 lows. Ang lahat ng iba pang name sa basket ay nanatili sa loob ng sarili nitong range at hindi naisama sa kalkulasyon.
Ano ang magandang reading ng High-Low Index?
Ang 50 line ang pivot, kung saan balanse ang mga high at low. Ang conventional strong marker ay 70. Ibig sabihin, mas marami nang higit sa two-to-one ang new highs kaysa new lows sa buong 10-day average. Ang conventional weak marker ay 30, na kabaligtaran nito. Sa pagitan ng 30 at 70, ipinapakita ng index na magkakahalo ang mga extreme ng merkado. Dito ito nananatili sa karamihan ng panahon.
Ipinapakita ng panel sa ibaba ang raw daily Record High Percent laban sa sarili nitong 10-day average para sa parehong basket. Makikita sa chart ang lag sa halip na ilarawan ito.
Ang eksaktong SQL sa likod ng bawat numero
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_dateNagsisimula ang ipinakitang range sa Record High Percent na 100 noong Apr 15, habang nasa 52.5 ang index. Nagtatapos ito sa 100 noong Jul 29, at nasa 64 ang index. Basahin ang bawat isa kumpara sa 70 at 30 markers. Basahin din ang pagitan ng dalawang linya bilang presyo ng smoothing: sa anumang araw, dala pa rin ng average ang siyam na mas naunang session. Hindi isinama sa panel ang unang siyam na session ng window dahil nangangailangan ang 10-day average ng 10 araw.
Hindi kasama sa denominator ang karamihan ng merkado
Narito ang limitasyong dapat tandaan. Ang denominator ng Record High Percent ay new highs at new lows lamang. Walang iba. Ang stock na nasa gitna ng 52-week range nito ay wala sa numerator o denominator. Hindi matutukoy ng index ang pagkakaiba ng session kung kailan 900 sa 3,000 pangalan ang umabot sa extreme at session kung kailan siyam lamang ang gumawa nito. Pareho nitong ipapakita ang mga ito bilang parehong kumpiyansang two-digit number.
Isipin ang isang exchange na may 6,000 pangalan sa isang mabagal na August session: 40 stock ang gumawa ng new highs at 20 ang gumawa ng new lows. Ang Record High Percent ay 40 na hinati sa 60, o 66.7, na parang nagpapahiwatig ng malawakang pag-akyat. Ngunit nakalkula ito mula sa 1% lamang ng mga listing. Walang naging ambag ang iba pang 5,940 pangalan.
Ipinapakita ng 40-name basket ang bersiyong nasusukat ng puntong ito. Ang bawat session sa window ay inaayos sa isang bucket batay sa dami ng pangalan na nakapag-print ng kahit anong extreme.
Ang eksaktong SQL sa likod ng bawat numero
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_denominatorSa 39 session sa 1 to 3 names bucket, nakabatay ang buong reading sa average na 2 pangalan mula sa 40. Ang mga session na ito ay may median Record High Percent na 100 at may median na layo na 50 points mula sa 50 line. Sa 10 or more names session, 1 sa mga ito ay may average na 10 pangalan. May median ang mga ito na 70 at nasa layong 20 points mula sa gitna.
Nililimitahan ng arithmetic kung ano ang maaaring mai-print ng isang manipis na session. Kung tatlong pangalan ang nasa extreme, ang mga posibleng reading lamang ay 0, 33.3, 66.7 at 100. Kung dalawang pangalan naman, 0, 50 at 100 lamang. Ang reading na 66.7 na nabuo mula sa dalawang high at isang low ay may decimal point na hindi kayang suportahan ng sample nito. Simple ang paraan para maitama ito: basahin ang raw counts ng highs at lows kasabay ng index, at huwag kailanman umasa sa index lamang.
Market breadth: High-Low Index kumpara sa advance/decline
Parehong sinusukat ng dalawang measure kung ilang stock ang nakikilahok. Magkaiba ang time horizon na ginagamit nila. Binibilang ng advance/decline breadth ang bawat stock na nagsara nang mas mataas o mas mababa kumpara kahapon. Ang denominator nito ay ang buong universe, kaya inilalarawan nito ang isang araw. Binibilang naman ng High-Low Index ang mga stock na nasa 52-week extreme lamang. Mas maliit ang denominator nito, at inilalarawan nito kung nasaan ang mga presyo kumpara sa kasaysayan ng buong taon. Maaaring malawak ang pagtaas ng tape sa isang araw habang kakaunti lamang ang stock na malapit sa 52-week high.
Pinapakinis ng panel sa ibaba ang dalawang measure sa parehong 10 sessions at sa parehong basket, kaya nasa iisang scale ang mga ito.
Ang eksaktong SQL sa likod ng bawat numero
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_dateNagsisimula ang dalawang series sa plotted range sa 52.5 para sa High-Low Index at 52.8 para sa 10-day advancing share noong Apr 15. Nagtatapos ang mga ito sa 64 at 52.5 noong Jul 29, sa loob ng 68 plotted sessions. Nananatili ang advancing share sa makitid na band. Sa karaniwang session, humigit-kumulang kalahati ng basket ang nagsasara nang mas mataas. Kapag pinag-average ang sampung session, nananatili ang linya malapit sa gitna ng scale. Walang ganoong anchor ang High-Low Index. Kapag walang stock sa basket ang nagpi-print ng 52-week low sa loob ng sampung magkakasunod na session, 100 ang bawat daily reading, at 100 din ang average.
Mas madaling basahin ang breadth kapag may katabing participation measures. Sinusukat ng Relative volume kung may stock na hindi pangkaraniwang kalaki ang trading volume ngayon kumpara sa sarili nitong normal na volume. Ipinapakita ng Pinakamalalaking stock mover ngayong linggo kung aling mga stock ang aktuwal na malaki ang naging galaw, habang ipinapakita ng mga stock na may hindi pangkaraniwang volume ngayong linggo kung saan napunta ang trading.
FAQ sa High-Low Index
Ano ang ibig sabihin kapag mas mataas sa 70 ang reading ng High-Low Index?
Ibig sabihin, mas marami nang higit sa two-to-one ang mga bagong 52-week high kaysa sa mga bagong 52-week low sa average ng huling ten sessions. Ito ang karaniwang palatandaan ng malakas na tape. Wala itong sinasabi tungkol sa kabuuang bilang ng mga stock na umabot sa extreme. Ang bilang na iyon ang dapat tingnan kasabay nito.
Ano ang pagkakaiba ng Record High Percent at High-Low Index?
Ang Record High Percent ang figure para sa isang session: hinahati ang bagong highs sa kabuuan ng bagong highs at bagong lows, saka minumultiply sa 100. Ang High-Low Index naman ang 10-day simple moving average ng figure na iyon. Inilalarawan ng una ang araw na ito. Inilalarawan ng ikalawa ang huling dalawang linggo.
Maaari bang maging 0 o 100 ang High-Low Index?
Oo. Kung walang stock sa universe ang magtatala ng bagong 52-week low sa loob ng ten sunod-sunod na sessions, 100 ang bawat daily reading at 100 din ang average. Kapag walang stock na nagtala ng high o low, zero ang denominator ng fraction kaya walang defined reading ang session na iyon.
Pareho ba ang High-Low Index at advance/decline breadth?
Hindi. Hinahati ng advance/decline breadth ang bilang batay sa buong universe at inilalarawan ang direksiyon sa isang araw. Hinahati naman ng High-Low Index ang bilang batay sa maliit na grupo ng mga stock na nasa 52-week extremes at inilalarawan ang posisyon kumpara sa presyo sa loob ng isang taon.
Ilang stock ang karaniwang nasa denominator ng High-Low Index?
Sa 40-name basket na sinukat dito mula April hanggang July 2026, ang mga session sa 1 to 3 names bucket ay may average na 2 names sa denominator. Mas malalaki ang exchange-wide counts sa absolute terms, ngunit maliit pa rin ang mga ito kumpara sa lahat ng listings. Kaya dapat nakikita sa screen ang raw counts kasabay ng index.
Ang bawat count sa page na ito ay mula sa stored at versioned query batay sa closing prices. Buksan ang anumang panel para mabasa ang SQL sa likod nito, o buuin muli ang parehong breadth series gamit ang sarili mong basket sa Strasmore terminal.