Strasmore Research
Edukasi Matt ConnorOleh Matt Connor · Diperbarui 2026-08-08

Apa Itu High-Low Index? Market Breadth

High-Low Index adalah rata-rata 10 hari Record High Percent. Pelajari rumusnya dengan angka bulat dan mengapa sampel kecil dapat menyesatkan saat pasar sepi.

High-Low Index adalah ukuran market breadth yang dibangun dari dua perhitungan. Indeks ini merupakan simple moving average 10 hari dari Record High Percent. Record High Percent adalah jumlah saham yang mencetak new 52-week highs dibagi jumlah new 52-week highs dan new 52-week lows, lalu dikalikan 100. Angka di atas 50 berarti lebih banyak saham yang mencetak new highs daripada new lows. Angka di bawah 50 berarti sebaliknya. Rumusnya sesingkat itu. Berikut ini adalah perhitungan aritmetikanya menggunakan angka bulat serta kelemahan ukuran sampel yang memungkinkan angka yang tampak menentukan tersebut hanya bertumpu pada segelintir saham.

Bagaimana cara menghitung High-Low Index?

Dua langkah, dan keduanya dapat ditulis dalam satu baris.

  1. Record High Percent untuk satu sesi: hitung saham dalam universe Anda yang ditutup pada level tertinggi baru dalam 52 minggu, hitung saham yang ditutup pada level terendah baru dalam 52 minggu, bagi jumlah saham yang mencetak level tertinggi baru dengan total keduanya, lalu kalikan dengan 100.
  2. High-Low Index: hitung rata-rata 10 pembacaan harian Record High Percent terakhir.

Angka bulat membuatnya lebih konkret. Tercatat 90 saham mencetak level tertinggi baru dan 30 saham mencetak level terendah baru. Jumlah level tertinggi dan terendah adalah 120, sedangkan 90 dibagi 120 adalah 0,75. Jadi, Record High Percent untuk sesi tersebut adalah 75. Selanjutnya, ambil pembacaan selama 10 sesi: 75, 70, 65, 60, 55, 50, 45, 40, 35, dan 30. Jumlahnya 525, lalu 525 dibagi 10 menjadi 52,5. High-Low Index berada di 52,5 pada hari ketika Record High Percent hari itu sendiri adalah 75.

Selisih tersebut adalah efek yang dihasilkan moving average. Riwayat 10 hari menghaluskan rangkaian yang dapat bergerak dari 100 ke 0 dalam semalam, tetapi konsekuensinya indikator tiba lebih lambat. Indeks ini menunjukkan kondisi breadth selama dua pekan terakhir. Indeks ini tidak pernah menunjukkan apa yang terjadi sore itu.

Apa yang dihitung sebagai new 52-week high?

Saham mencetak new 52-week high ketika harganya melampaui seluruh harga yang tercatat dalam 52 minggu sebelumnya. Penyedia data berbeda dalam menentukan basis perhitungan: sebagian membandingkan harga tertinggi dan terendah intraday, sementara lainnya hanya membandingkan harga penutupan. Kedua metode tersebut menghasilkan jumlah yang berbeda untuk sesi yang sama. Di seluruh halaman ini, basis yang digunakan adalah harga penutupan. New 52-week highs and lows menjelaskan daftar tersebut secara lebih rinci.

Panel di bawah menghitung kedua ekstrem tersebut pada setiap sesi untuk keranjang tetap yang terdiri atas 40 saham large-cap AS, dari 1 April hingga 31 Juli 2026. Ukuran keranjang ini membuat jumlahnya cukup kecil untuk diperiksa secara manual. Hal tersebut membuat kelemahan dalam formula terlihat pada bagian berikutnya.

QueryNew 52-week highs dan lows setiap sesi: 40 saham large-cap AS, April hingga Juli 2026
SQL tepat di balik setiap angka
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_date
Run this yourself

Sepanjang 77 sesi, kedua jumlah tersebut jarang meningkat secara bersamaan. Pada Jul 29, yaitu sesi terakhir dalam periode tersebut, 3 dari 40 saham ditutup pada 52-week high dan 0 ditutup pada 52-week low. Pada Apr 1, yaitu sesi pertama, perbandingannya adalah 1 saham yang mencetak high dan 1 saham yang mencetak low. Semua saham lain dalam keranjang berada di antara batas rentangnya masing-masing dan tidak pernah masuk dalam perhitungan.

Apa pembacaan High-Low Index yang baik?

Garis 50 adalah titik pivot, dengan jumlah new highs dan new lows yang seimbang. Ambang kuat yang umum digunakan adalah 70, ketika jumlah new highs telah melampaui new lows dengan rasio lebih dari two-to-one dalam keseluruhan rata-rata 10 hari. Ambang lemah yang umum digunakan adalah 30, sebagai kebalikannya. Di antara 30 dan 70, indeks menunjukkan bahwa titik ekstrem pasar bercampur. Indeks berada dalam kisaran ini hampir sepanjang waktu.

Panel di bawah memplot Record High Percent harian mentah terhadap rata-rata 10 harinya untuk basket yang sama. Lag terlihat pada grafik, bukan dijelaskan dalam teks.

QueryRecord High Percent dan rata-rata 10 harinya (High-Low Index), basket 40 saham
SQL tepat di balik setiap angka
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
Run this yourself

Rentang yang diplot dibuka pada Record High Percent sebesar 100 pada Apr 15, dengan indeks di 52.5. Rentang ini ditutup pada 100 pada Jul 29, dengan indeks 64. Bandingkan masing-masing dengan ambang 70 dan 30. Jarak antara kedua garis menunjukkan biaya smoothing: pada hari tertentu, rata-rata masih memasukkan sembilan sesi sebelumnya. Sembilan sesi pertama dalam window tidak ditampilkan pada panel karena rata-rata 10 hari memerlukan 10 hari.

Penyebut mengabaikan sebagian besar pasar

Inilah keterbatasan yang perlu diingat. Penyebut Record High Percent adalah new highs ditambah new lows, dan tidak mencakup hal lain. Saham yang berada di tengah rentang 52-week tidak masuk numerator maupun penyebut. Indeks ini tidak dapat membedakan sesi ketika 900 dari 3.000 saham mencapai titik ekstrem dari sesi ketika hanya 9 saham yang melakukannya. Keduanya ditampilkan dengan angka dua digit yang sama dan terlihat meyakinkan.

Bayangkan bursa dengan 6.000 saham pada sesi Agustus yang sepi: 40 saham mencatat new highs dan 20 saham mencatat new lows. Record High Percent adalah 40 dibagi 60, atau 66,7, yang terbaca seperti kenaikan pasar yang luas. Namun perhitungan itu hanya menggunakan 1% dari seluruh saham yang tercatat. Sebanyak 5.940 saham lainnya tidak diperhitungkan.

Keranjang 40 saham menunjukkan hal itu dalam bentuk yang dapat dihitung. Setiap sesi dalam periode pengamatan dikelompokkan berdasarkan jumlah saham yang mencatat titik ekstrem apa pun.

QuerySeberapa tipis denominator: sesi dikelompokkan berdasarkan jumlah saham pada ekstrem 52 minggu
SQL tepat di balik setiap angka
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_denominator
Run this yourself

Dalam 39 sesi pada kelompok 1 to 3 names, keseluruhan pembacaan bertumpu pada rata-rata 2 saham dari 40 saham. Sesi-sesi tersebut mencatat median Record High Percent sebesar 100 dan berada rata-rata median 50 poin dari garis 50. Sebanyak 10 or more names sesi, dengan 1 di antaranya memiliki rata-rata 10 saham, mencatat median 70 dan berada 20 poin dari titik tengah.

Aritmetika membatasi angka yang mungkin muncul dalam sesi dengan aktivitas tipis. Jika tiga saham mencapai titik ekstrem, pembacaan yang mungkin hanya 0, 33,3, 66,7, dan 100. Jika dua saham, hanya 0, 50, dan 100. Pembacaan 66,7 yang dibangun dari dua new highs dan satu new low memuat angka desimal yang tidak didukung oleh ukuran sampelnya. Kebiasaan untuk mengatasinya sederhana: baca jumlah mentah new highs dan new lows di samping indeks, jangan membaca indeks itu sendiri.

Market breadth: High-Low Index vs advance/decline

Kedua ukuran ini menilai berapa banyak saham yang berpartisipasi. Namun, keduanya menggunakan horizon yang berbeda. Breadth advance/decline menghitung setiap saham yang ditutup naik atau turun dibandingkan hari sebelumnya. Denominator-nya mencakup seluruh universe, dan ukuran ini menggambarkan satu hari. High-Low Index hanya menghitung saham yang mencapai ekstrem 52 minggu. Denominator-nya lebih kecil, dan ukuran ini menggambarkan posisi harga dibandingkan riwayat satu tahun penuh. Pasar dapat naik secara luas pada hari itu, sementara hanya sedikit saham yang berada di dekat level tertinggi 52 minggu.

Panel di bawah ini menghaluskan kedua ukuran selama 10 sesi yang sama dan menggunakan basket yang sama, sehingga keduanya berada pada skala yang sama.

QueryDua ukuran breadth, basket yang sama: High-Low Index 10 hari vs porsi saham yang naik 10 hari
SQL tepat di balik setiap angka
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_date
Run this yourself

Kedua ukuran tersebut membuka rentang yang ditampilkan pada 52.5 untuk High-Low Index dan 52.8 untuk persentase saham yang naik selama 10 hari pada Apr 15. Keduanya berakhir pada 64 dan 52.5 pada Jul 29, dalam 68 sesi yang ditampilkan. Persentase saham yang naik bergerak dalam kisaran sempit. Dalam sesi biasa, kira-kira separuh saham dalam basket ditutup lebih tinggi. Rata-rata sepuluh sesi membuat garisnya berada di dekat bagian tengah skala. High-Low Index tidak memiliki titik acuan seperti itu. Jika tidak ada saham dalam basket yang mencetak level terendah 52 minggu selama sepuluh sesi berturut-turut, setiap pembacaan harian bernilai 100 dan rata-ratanya juga 100.

Breadth lebih mudah dibaca jika disandingkan dengan ukuran partisipasi. Relative volume menilai apakah suatu saham diperdagangkan dengan volume yang jauh lebih besar hari ini dibandingkan biasanya. Pergerakan saham terbesar minggu ini menunjukkan saham mana yang benar-benar bergerak, sedangkan saham dengan volume tidak biasa minggu ini menunjukkan ke mana aliran perdagangan mengarah.

FAQ High-Low Index

Apa arti pembacaan High-Low Index di atas 70?

Artinya, jumlah new 52-week highs lebih dari dua kali jumlah new 52-week lows berdasarkan rata-rata sepuluh sesi terakhir. Ini merupakan penanda konvensional bahwa breadth pasar sangat kuat. Angka tersebut tidak menunjukkan berapa banyak saham yang sama sekali mencapai level ekstrem. Jumlah itu perlu diperiksa secara terpisah.

Apa perbedaan antara Record High Percent dan High-Low Index?

Record High Percent adalah angka untuk satu sesi: jumlah new highs dibagi jumlah new highs ditambah new lows, lalu dikalikan 100. High-Low Index adalah simple moving average 10 hari dari angka tersebut. Yang pertama menggambarkan kondisi hari ini. Yang kedua menggambarkan dua minggu terakhir.

Apakah High-Low Index dapat berada di 0 atau 100?

Ya. Jika tidak ada saham dalam universe yang mencatat new 52-week low selama sepuluh sesi berturut-turut, setiap pembacaan harian bernilai 100 dan demikian pula rata-ratanya. Jika tidak ada saham yang mencatat high maupun low, pecahan tersebut memiliki penyebut nol sehingga tidak ada pembacaan yang terdefinisi untuk sesi itu.

Apakah High-Low Index sama dengan breadth advance/decline?

Tidak. Breadth advance/decline menggunakan seluruh universe sebagai penyebut dan menggambarkan arah pergerakan dalam satu hari. High-Low Index menggunakan kelompok kecil saham yang berada pada level ekstrem 52 minggu sebagai penyebut dan menggambarkan posisi harga terhadap riwayat harga selama satu tahun.

Berapa biasanya jumlah saham dalam penyebut High-Low Index?

Dalam basket yang terdiri dari 40 saham dan diukur di sini dari April hingga Juli 2026, sesi dalam bucket 1 to 3 names rata-rata memiliki 2 saham dalam penyebut. Jumlah di seluruh bursa lebih besar secara absolut, tetapi tetap hanya sebagian kecil dari seluruh saham tercatat. Karena itu, jumlah mentah perlu ditampilkan di layar bersama index.


Setiap jumlah pada halaman ini berasal dari stored query berversi yang menggunakan closing prices. Buka panel mana pun untuk membaca SQL di baliknya, atau susun kembali breadth series yang sama menggunakan basket pilihan Anda di terminal Strasmore.

#market breadth#52-week highs#indicators#record high percent