Strasmore Research
学習 Matt Connor著者: Matt Connor ・更新: 2026-08-08

ハイ・ロー・インデックスとは?市場の広がり

ハイ・ロー・インデックスはRecord High Percentの10日平均です。概数での計算例と、少数銘柄に左右されるサンプルサイズの落とし穴を解説します。

High-Low Indexは、二つの集計値から算出する市場の広がりを示す指標です。Record High Percentの10日単純移動平均であり、Record High Percentは、新52週高値銘柄数を新52週高値銘柄数と新52週安値銘柄数の合計で割り、100を掛けて求めます。50を上回る場合は、新高値を付ける銘柄が新安値を付ける銘柄を上回っていることを示します。50を下回る場合は、その逆です。計算式はこれほど短いものです。以下では、概数を用いた算術計算と、決定的に見える数値が少数の銘柄に基づくことになり得るサンプルサイズの問題を説明します。

ハイ・ロー・インデックスの計算方法

二つの手順で計算できます。どちらも一行で収まります。

  1. Record High Percentを一セッションについて算出する。対象銘柄のうち、52週高値を更新して引けた銘柄数と、52週安値を更新して引けた銘柄数を数える。高値更新銘柄数を両者の合計で割り、100を掛ける。
  2. ハイ・ロー・インデックスを算出する。直近10日間のRecord High Percentを平均する。

具体例で確認します。相場で高値更新が90銘柄、安値更新が30銘柄あったとします。高値更新と安値更新の合計は120銘柄です。90を120で割ると0.75になるため、そのセッションのRecord High Percentは75です。次に、10セッションの数値が75、70、65、60、55、50、45、40、35、30だったとします。合計は525で、525を10で割ると52.5です。その日のRecord High Percentが75であっても、ハイ・ロー・インデックスは52.5を示します。

この差が、移動平均によって生じるものです。10日間のデータを用いることで、一晩で100から0まで変動し得る系列が平滑化されます。ただし、その分だけ反応は遅れます。この指数が示すのは、2週間にわたる市場の広がりです。当日の午後に何が起きたかを示すものではありません。

52週高値の新値とは何を指すのか

株価が過去52週間に記録したすべての価格を上回ると、その銘柄は52週高値を更新したことになります。判定基準はデータ提供会社によって異なります。日中の高値・安値を比較する会社もあれば、終値だけを比較する会社もあります。そのため、同じ取引日でも集計結果は異なります。このページでは、すべて終値を基準にしています。52週高値・安値の新値では、実際の一覧を確認できます。

下のパネルでは、2026年4月1日から7月31日まで、米国の大型株40銘柄で構成する固定バスケットについて、各セッションの高値・安値の更新数を集計しています。この規模であれば、件数が少なく手作業で確認できます。そのため、後述する計算式の欠陥が明確になります。

クエリ各セッションの52週高値・安値:大型米国株40銘柄、2026年4月~7月
各数値の背後にある正確なSQL
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

77セッションを通じて、二つの件数が同時に増えることはほとんどありません。期間の最終セッションであるJul 29には、40銘柄のうち3銘柄が52週高値で引け、0銘柄が52週安値で引けました。最初のセッションであるApr 1は、高値が1銘柄、安値が1銘柄でした。その他の銘柄はそれぞれのレンジ内で推移し、計算の対象には一度も入りませんでした。

ハイ・ロー・インデックスはどの水準が適切ですか?

50が分岐点で、高値と安値が均衡している状態を示します。一般的に強気の目安は70です。これは、10日平均全体で新高値銘柄が新安値銘柄を二対一超の割合で上回った水準です。弱気の目安は、その反対の30です。30から70の間では、市場の両極端が混在していることを示します。インデックスは通常、この範囲にあります。

下のパネルでは、同じ銘柄群について、日次のRecord High Percentの実績値と、その10日平均を示しています。タイムラグは説明ではなく、チャート上で確認できます。

クエリ過去最高値比率とその10日平均(High-Low Index)、40銘柄バスケット
各数値の背後にある正確なSQL
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

表示期間は、Apr 15のRecord High Percent 100で始まり、インデックスは52.5です。Jul 29には100で終了し、インデックスは64です。それぞれを70と30の目安に照らして確認してください。また、二本の線の間隔は平滑化による価格として捉えます。特定の日の平均値には、なお過去九セッションが含まれているためです。10日平均には10日分のデータが必要なので、期間の最初の九セッションはパネルから除外しています。

市場の大半を分母が無視している

押さえておくべき限界はここです。Record High Percentの分母は、新高値銘柄数と新安値銘柄数の合計だけです。それ以外は含まれません。52週レンジの中央付近で推移する銘柄は、分子にも分母にも入りません。この指数では、3,000銘柄のうち900銘柄が極値を付けたセッションと、9銘柄だけが極値を付けたセッションを区別できません。どちらも、同じ自信ありげな二桁の数値として表示されます。

6,000銘柄が上場する取引所で、8月の閑散としたセッションを考えてみます。40銘柄が新高値を付け、20銘柄が新安値を付けました。Record High Percentは40を60で割った66.7となり、市場全体が上昇したように読めます。しかし、計算の対象となったのは上場銘柄の1%です。残り5,940銘柄には投票権がありませんでした。

40銘柄バスケットを使うと、この状況を数値で画面上に示せます。対象期間の各セッションを、極値を付けた銘柄数に応じて区分します。

クエリ分母がどれほど薄くなるか:52週極値の銘柄数別のセッション分類
各数値の背後にある正確なSQL
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

1 to 3 namesバケットに入った39セッションでは、全体の読み取りは40銘柄中平均2銘柄に基づいていました。これらのセッションにおけるRecord High Percentの中央値は100で、50ラインからの距離の中央値は50ポイントでした。10 or more namesセッションでは、平均10銘柄に基づくものが1セッションあり、Record High Percentの中央値は70、中央値からの距離は20ポイントでした。

算術上、閑散としたセッションで表示できる値には限界があります。極値を付けた銘柄が3銘柄の場合、取り得る値は0、33.3、66.7、100だけです。2銘柄の場合は、0、50、100だけです。新高値2銘柄と新安値1銘柄に基づく66.7という値には、その標本では支えきれない小数点が含まれます。これを正しく読む方法は明快です。指数だけを見るのではなく、指数の横に表示される新高値銘柄数と新安値銘柄数の実数を必ず確認してください。

市場の広がり:High-Low Indexと騰落銘柄数

どちらの指標も、何銘柄が相場に参加しているかを測ります。ただし、対象とする期間が異なります。騰落銘柄数による市場の広がりは、前日比で上昇または下落して取引を終えた全銘柄を数えます。分母は対象銘柄全体で、1日の動きを示します。High-Low Indexは、52週間の高値または安値を付けた銘柄だけを数えます。分母は小さく、1年間の値動きの中で現在の株価がどの位置にあるかを示します。相場全体がその日に幅広く上昇していても、52週間高値に近い銘柄はごく少数という場合があります。

以下のパネルでは、同じ銘柄群を対象に、両指標を同じ10セッションで平滑化しています。これにより、両者を同じ尺度で比較できます。

クエリ同じバスケットの2つの騰落指標:10日High-Low Indexと10日上昇銘柄比率
各数値の背後にある正確なSQL
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

表示期間の始点は、Apr 15時点でHigh-Low Indexが52.5、10日間の上昇銘柄比率が52.8です。終点はJul 29時点でそれぞれ6452.5となり、表示セッション数は68です。上昇銘柄比率は狭い範囲で推移します。通常のセッションでは、銘柄群の約半数が上昇して取引を終えます。これを10日間平均にすると、線は尺度の中央付近に位置します。High-Low Indexには、このような基準点がありません。銘柄群で10セッション連続して52週間安値を付ける銘柄がなければ、毎日の値は100となり、平均も100になります。

市場の広がりは、参加状況を示す指標と併せて見ると理解しやすくなります。Relative volumeは、ある銘柄が自身の通常の水準と比べて、その日に異常に活発に取引されているかを示します。今週の株価上昇・下落が大きい銘柄は、実際に大きく動いた銘柄を示します。今週の出来高急増銘柄は、取引がどの銘柄に集中したかを示します。

ハイ・ロー指数に関するFAQ

ハイ・ロー指数が70を上回る場合、何を意味しますか?

直近十セッションの平均で、新値52週高値銘柄数が新値52週安値銘柄数を二対一以上の比率で上回ったことを意味します。これは、相場の基調が強いことを示す従来の目安です。ただし、極端な値動きに達した銘柄数そのものは示しません。この銘柄数も併せて確認する必要があります。

レコード・ハイ・パーセントとハイ・ロー指数の違いは何ですか?

レコード・ハイ・パーセントは単一セッションの数値です。新値52週高値銘柄数を、新値52週高値銘柄数と新値52週安値銘柄数の合計で割り、100を掛けて算出します。ハイ・ロー指数は、この数値の10日単純移動平均です。前者は当日の状況を、後者は直近二週間の状況を示します。

ハイ・ロー指数が0または100になることはありますか?

あります。対象銘柄の中で新値52週安値を付ける銘柄が十セッション連続で一つもなければ、毎日の数値は100となり、平均値も100です。高値にも安値にもなる銘柄がない場合、分母がゼロになるため、そのセッションの数値は定義されません。

ハイ・ロー指数は騰落レシオと同じですか?

いいえ。騰落レシオは対象銘柄全体を分母とし、単日の方向性を示します。ハイ・ロー指数は52週の価格推移における極端な水準にある少数の銘柄を分母とし、年間の価格推移に対する位置を示します。

ハイ・ロー指数の分母に含まれる銘柄数は、通常どの程度ですか?

ここで2026年4月から7月まで計測した40銘柄のバスケットでは、1 to 3 names区分のセッションにおける分母の銘柄数は平均2銘柄でした。取引所全体では絶対数が増えますが、全上場銘柄に占める割合は小さいままです。そのため、実数も指数と並べて画面上で確認する必要があります。


このページのすべての銘柄数は、終値に基づく保存済みのバージョン管理クエリから取得しています。各パネルを開くと、その背後にあるSQLを確認できます。Strasmore terminalでは、独自の銘柄バスケットを使って同じ騰落系列を再構築できます。

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