Strasmore Research
Educación Matt ConnorPor Matt Connor

¿Qué es el High-Low Index? Amplitud de mercado

El High-Low Index es la media de 10 días de Record High Percent. Vea la fórmula con números redondos y el riesgo del tamaño de muestra en sesiones tranquilas.

El High-Low Index es una medida de amplitud de mercado construida a partir de dos conteos: es la media móvil simple de 10 días de Record High Percent, y Record High Percent son los nuevos máximos de 52 semanas divididos entre la suma de los nuevos máximos y los nuevos mínimos de 52 semanas, multiplicado por 100. Una lectura superior a 50 significa que más acciones están marcando nuevos máximos que nuevos mínimos. Una lectura inferior a 50 indica lo contrario. La fórmula es así de breve. A continuación se muestra la aritmética con números redondos y el problema del tamaño de la muestra que permite que una lectura aparentemente decisiva descanse sobre unas pocas acciones.

¿Cómo se calcula el High-Low Index?

Dos pasos, ambos caben en una línea.

  1. Record High Percent, para una sola sesión: cuente las acciones de su universo que cerraron en un nuevo máximo de 52 semanas, cuente las que cerraron en un nuevo mínimo de 52 semanas, divida los máximos entre la suma de ambos y multiplique por 100.
  2. El High-Low Index: calcule el promedio de las últimas 10 lecturas diarias de Record High Percent.

Los números redondos lo hacen concreto. En una sesión se registran 90 nuevos máximos y 30 nuevos mínimos. La suma es 120, y 90 dividido entre 120 es 0.75. Por tanto, Record High Percent para esa sesión es 75. Ahora tome diez sesiones con estas lecturas: 75, 70, 65, 60, 55, 50, 45, 40, 35 y 30. Suman 525, y 525 dividido entre 10 es 52.5. El High-Low Index marca 52.5 en un día cuyo propio Record High Percent fue 75.

Esa diferencia es el costo de la media móvil. Diez días de memoria suavizan una serie que puede pasar de 100 a 0 de un día para otro, pero a cambio llega tarde. El índice responde dónde estuvo la amplitud durante dos semanas. Nunca responde qué ocurrió esta tarde.

¿Qué cuenta como un nuevo máximo de 52 semanas?

Una acción marca un nuevo máximo de 52 semanas cuando su precio supera todos los precios registrados durante las 52 semanas anteriores. Los proveedores de datos difieren en la base del cálculo: algunos comparan máximos y mínimos intradía, mientras que otros comparan únicamente precios de cierre. Ambos métodos producen conteos distintos para una misma sesión. En toda esta página se utilizan precios de cierre. Nuevos máximos y mínimos de 52 semanas explica la lista en detalle.

El panel siguiente cuenta ambos extremos en cada sesión para una canasta fija de 40 acciones estadounidenses de gran capitalización, del 1 de abril al 31 de julio de 2026. Una canasta de ese tamaño mantiene los conteos en un nivel que se puede comprobar manualmente. Eso permite ver más adelante el problema de la fórmula.

ConsultaNuevos máximos y mínimos de 52 semanas por sesión: 40 acciones estadounidenses de alta capitalización, abril a julio de 2026
El SQL exacto detrás de cada cifra
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

En las 77 sesiones, los dos conteos rara vez suben al mismo tiempo. En Jul 29, la última sesión del periodo, 3 de las 40 acciones cerraron en un máximo de 52 semanas y 0 cerraron en un mínimo de 52 semanas. En Apr 1, la primera sesión, la distribución fue de 1 máximos frente a 1 mínimos. Todas las demás acciones de la canasta permanecieron dentro de su propio rango y no entraron en el cálculo.

¿Qué lectura del High-Low Index es buena?

La línea de 50 es el punto de equilibrio entre máximos y mínimos. El nivel convencional de fortaleza es 70, cuando los nuevos máximos han superado a los nuevos mínimos por más de dos a uno durante el promedio completo de 10 días. El nivel convencional de debilidad es 30, su reflejo inverso. Entre 30 y 70, el índice indica que los extremos del mercado están mezclados. Es donde se encuentra la mayor parte del tiempo.

El panel siguiente grafica el Record High Percent diario frente a su propia media de 10 días para la misma canasta. El rezago se aprecia en el gráfico y no necesita describirse.

ConsultaPorcentaje de máximos históricos y su promedio de 10 días (índice High-Low), canasta de 40 acciones
El SQL exacto detrás de cada cifra
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

El rango graficado comienza con un Record High Percent de 100 en Apr 15, mientras que el índice se situaba en 52.5. Termina en 100 en Jul 29, con el índice en 64. Compare cada lectura con los niveles de 70 y 30. La distancia entre ambas líneas muestra el costo del suavizado: en cualquier día, el promedio todavía incorpora nueve sesiones anteriores. Las primeras nueve sesiones del periodo quedan excluidas del panel, porque una media de 10 días necesita 10 días.

El denominador ignora la mayor parte del mercado

Esta es la limitación que conviene recordar. El denominador de Record High Percent son los nuevos máximos más los nuevos mínimos, y nada más. Una acción que se encuentra en la zona media de su rango de 52 semanas no forma parte ni del numerador ni del denominador. El índice no puede distinguir entre una sesión en la que 900 de 3,000 acciones alcanzan un extremo y otra en la que lo hacen 9. Imprime ambas con el mismo número de dos dígitos, aparentemente concluyente.

Piense en una bolsa con 6,000 acciones durante una sesión lenta de agosto: 40 acciones marcan nuevos máximos y 20 marcan nuevos mínimos. Record High Percent es 40 dividido entre 60, o 66.7, una lectura que parece indicar un avance amplio. El cálculo se basó en el 1% de las acciones cotizadas. Las otras 5,940 no tuvieron voto.

La canasta de 40 acciones muestra esa limitación de forma cuantificable. Cada sesión del periodo se clasifica según cuántas acciones marcaron algún extremo.

ConsultaQué tan reducido queda el denominador: sesiones agrupadas por número de acciones en un extremo de 52 semanas
El SQL exacto detrás de cada cifra
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

En las 39 sesiones del grupo de 1 to 3 names, toda la lectura se apoyó en un promedio de 2 acciones de un total de 40. Esas sesiones registraron una mediana de Record High Percent de 100 y se situaron a una mediana de 50 puntos de la línea de 50. Las 10 or more names sesiones, 1 de ellas con un promedio de 10 acciones, registraron una mediana de 70 y se situaron a 20 puntos del punto medio.

La aritmética limita incluso las lecturas que puede producir una sesión con poca participación. Con tres acciones en un extremo, las únicas lecturas posibles son 0, 33.3, 66.7 y 100. Con dos acciones, solo son posibles 0, 50 y 100. Una lectura de 66.7 basada en dos máximos y un mínimo muestra un decimal que su muestra no puede respaldar. La práctica que corrige esto es sencilla: lea los conteos brutos de máximos y mínimos junto al índice. Nunca lea el índice por sí solo.

Amplitud de mercado: High-Low Index frente a advance/decline

Ambas medidas preguntan cuántas acciones están participando. Lo hacen en horizontes distintos. La amplitud advance/decline cuenta todas las acciones que terminaron al alza o a la baja frente al día anterior. Su denominador es todo el universo y describe una sola sesión. El High-Low Index cuenta únicamente las acciones que se encuentran en un extremo de 52 semanas. Su denominador es pequeño y describe la posición de los precios frente a un año completo de historia. Una sesión puede terminar ampliamente al alza aunque muy pocas acciones estén cerca de un máximo de 52 semanas.

El panel siguiente suaviza ambas medidas durante las mismas 10 sesiones y sobre la misma canasta. Así quedan en una escala común.

ConsultaDos medidas de amplitud, misma canasta: índice High-Low de 10 días vs. porcentaje de acciones al alza de 10 días
El SQL exacto detrás de cada cifra
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

El periodo graficado comienza en 52.5 para el High-Low Index y en 52.8 para la proporción alcista de 10 días, en Apr 15. Termina en 64 y 52.5, respectivamente, en Jul 29, a lo largo de 68 sesiones graficadas. La proporción alcista se mueve dentro de una banda estrecha. En una sesión normal, aproximadamente la mitad de la canasta cierra al alza. Al promediar diez sesiones, la línea permanece cerca del centro de la escala. El High-Low Index no tiene ese punto de anclaje. Si ninguna acción de la canasta marca un mínimo de 52 semanas durante diez sesiones consecutivas, cada lectura diaria es 100 y el promedio también es 100.

La amplitud se interpreta mejor junto con medidas de participación. Volumen relativo pregunta si una acción está negociando hoy con una actividad inusualmente alta frente a su propia norma. Las acciones con mayores movimientos de la semana muestra qué acciones realmente se desplazaron, y acciones con volumen inusual esta semana muestra hacia dónde se dirigió la negociación.

Preguntas frecuentes sobre el High-Low Index

¿Qué significa una lectura del High-Low Index superior a 70?

Significa que los nuevos máximos de 52 semanas superaron a los nuevos mínimos de 52 semanas por más de dos a uno durante el promedio de las últimas diez sesiones. Es el nivel convencional de fortaleza del mercado. No indica cuántas acciones alcanzaron algún extremo. Ese es el dato que debe revisarse junto con el índice.

¿Cuál es la diferencia entre Record High Percent y el High-Low Index?

Record High Percent es la cifra de una sola sesión: nuevos máximos divididos entre nuevos máximos más nuevos mínimos, multiplicado por 100. El High-Low Index es la media móvil simple de 10 días de esa cifra. Una medida describe el día actual. La otra describe las últimas dos semanas.

¿Puede el High-Low Index ser 0 o 100?

Sí. Si ninguna acción del universo marca un nuevo mínimo de 52 semanas durante diez sesiones consecutivas, cada lectura diaria es 100 y el promedio también. Cuando ninguna acción marca un máximo ni un mínimo, la fracción tiene denominador cero y la sesión no tiene una lectura definida.

¿Es el High-Low Index igual que la amplitud advance/decline?

No. La amplitud advance/decline divide entre todo el universo y describe la dirección de una sola sesión. El High-Low Index divide entre el grupo reducido de acciones situadas en extremos de 52 semanas y describe su posición frente a un año de precios.

¿Cuántas acciones suelen formar el denominador del High-Low Index?

En la canasta de 40 acciones medida aquí entre abril y julio de 2026, las sesiones del grupo de 1 to 3 names tuvieron un promedio de 2 acciones en el denominador. Los conteos de toda la bolsa son mayores en términos absolutos, pero siguen representando una fracción pequeña del total de acciones cotizadas. Por eso los conteos brutos deben aparecer en pantalla junto al índice.


Todos los conteos de esta página provienen de una consulta almacenada y versionada sobre precios de cierre. Abra cualquier panel para leer el SQL que lo sustenta o reconstruya la misma serie de amplitud con una canasta propia en la terminal de Strasmore.

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