Strasmore Research
Educación Matt ConnorPor Matt Connor · Actualizado 2026-08-08

¿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 cifras redondeadas y el sesgo del tamaño de muestra en sesiones tranquilas.

El High-Low Index es una medida de amplitud de mercado basada en dos conteos. Es la media móvil simple de 10 días de Record High Percent. A su vez, Record High Percent es el número de nuevos máximos de 52 semanas dividido entre la suma de los nuevos máximos y los nuevos mínimos de 52 semanas, multiplicado por 100. Una lectura superior a 50 indica que más acciones están registrando 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 el cálculo con cifras redondeadas y el problema del tamaño de la muestra, que permite que una lectura aparentemente contundente dependa de apenas un puñado de acciones.

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

Dos pasos. Ambos caben en una sola línea.

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

Los números redondos lo hacen más concreto. En una sesión se registran 90 nuevos máximos y 30 nuevos mínimos. La suma de máximos y mínimos es 120, y 90 dividido entre 120 equivale a 0.75. Por tanto, el Record High Percent de esa sesión es 75. Ahora tome 10 sesiones: 75, 70, 65, 60, 55, 50, 45, 40, 35 y 30. La suma es 525, y 525 dividido entre 10 equivale a 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 que introduce 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 el indicador llega tarde. El índice muestra cómo se ha comportado la amplitud del mercado durante dos semanas. Nunca responde qué ocurrió esta tarde.

¿Qué se considera 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 el criterio: algunos comparan los máximos y mínimos intradía, mientras que otros comparan únicamente los precios de cierre. Por eso, ambos métodos producen recuentos 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 cesta fija de 40 acciones estadounidenses de gran capitalización, del 1 de abril al 31 de julio de 2026. Una cesta de ese tamaño mantiene los recuentos en niveles que se pueden comprobar manualmente. Eso permite ver más adelante el defecto de la fórmula.

ConsultaNuevos máximos y mínimos de 52 semanas por sesión: 40 acciones estadounidenses de gran 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 77 sesiones, ambos recuentos rara vez subieron 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 cesta se mantuvieron dentro de su propio rango y nunca entraron en el cálculo.

¿Qué lectura es buena para el High-Low Index?

La línea de 50 es el punto de equilibrio, con máximos y mínimos balanceados. El umbral convencional de fortaleza es 70: durante el promedio de 10 días, los nuevos máximos han superado a los nuevos mínimos por más de two-to-one. El umbral convencional de debilidad es 30, su imagen inversa. Entre 30 y 70, el índice indica que los extremos del mercado están mezclados. La mayor parte del tiempo se encuentra en ese rango.

El panel siguiente muestra el Record High Percent diario sin suavizar frente a su propio promedio de 10 días para la misma cesta. El rezago se observa en el gráfico, en lugar de 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 el Apr 15, y con el índice en 52.5. Termina en 100 el Jul 29, con el índice en 64. Compare cada valor con los umbrales de 70 y 30. También observe la distancia entre las dos líneas como el costo del suavizado: en cualquier día, el promedio todavía incorpora nueve sesiones anteriores. Las primeras nueve sesiones de la ventana se excluyen del panel, porque un promedio 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 está compuesto por nuevos máximos más nuevos mínimos, y nada más. Una acción que se encuentra en la zona media de su rango de 52 semanas no aparece ni en el numerador ni en el denominador. El índice no puede distinguir una sesión en la que 900 de 3,000 acciones alcanzan un extremo de otra en la que lo hacen 9, y muestra ambas con el mismo número de dos dígitos.

Pensemos 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 cifra que parece indicar un avance generalizado. Se calculó con el 1% de las acciones listadas. Las otras 5,940 no tuvieron ninguna participación.

La cesta de 40 acciones muestra esta situación de forma cuantificable. Cada sesión del periodo se clasifica en un grupo 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 1 to 3 names, la lectura completa se basó en un promedio de 2 acciones de un total de 40. Esas sesiones registraron un Record High Percent mediano 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 los valores que puede mostrar una sesión con poca actividad. 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 nuevos máximos y un nuevo mínimo muestra un decimal que la muestra no puede respaldar. La solución es sencilla: leer junto al índice los conteos brutos de nuevos máximos y nuevos mínimos, y nunca consultar el índice por sí solo.

Amplitud de mercado: índice High-Low frente a avance/descenso

Ambas medidas preguntan cuántas acciones están participando. La diferencia está en el horizonte que utilizan. La amplitud de avance/descenso cuenta todas las acciones que terminaron al alza o a la baja frente al día anterior. Su denominador es el universo completo y describe una sola jornada. El índice High-Low solo cuenta las acciones que alcanzaron un extremo de 52 semanas. Su denominador es reducido y muestra dónde se sitúan los precios frente a un año completo de historia. El mercado puede subir ampliamente durante la jornada mientras muy pocas acciones se encuentran cerca de un máximo de 52 semanas.

El panel siguiente suaviza ambas medidas durante las mismas 10 sesiones y sobre la misma cesta, de modo que las coloca en una escala común.

ConsultaDos medidas de amplitud, misma canasta: índice High-Low de 10 días frente a proporción 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 par inicia el rango graficado en 52.5 para el índice High-Low y en 52.8 para la proporción de avances a 10 días, en Apr 15, y termina en 64 y 52.5, respectivamente, en Jul 29, a lo largo de 68 sesiones graficadas. La proporción de avances se mueve dentro de una banda estrecha. En una sesión normal, aproximadamente la mitad de la cesta cierra al alza. Al promediar diez sesiones de ese tipo, la línea queda cerca de la mitad de la escala. El índice High-Low no tiene ese punto de referencia. Cuando ninguna acción de la cesta 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. El volumen relativo indica si una acción está registrando hoy una actividad inusualmente elevada frente a su propio nivel normal. Las acciones con mayores movimientos de la semana muestran qué acciones realmente se desplazaron, y las acciones con volumen inusual esta semana muestran 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 en el promedio de las últimas diez sesiones. Es el indicador convencional de fortaleza del mercado. No informa cuántas acciones alcanzaron un extremo. Esa es la cifra 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. Uno describe la sesión de hoy. El otro describe las últimas dos semanas.

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

Sí. Si ninguna acción del universo registra 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 registra un nuevo máximo ni un nuevo mínimo, la fracción tiene un denominador igual a cero y esa sesión no tiene una lectura definida.

¿Es el High-Low Index lo mismo que la amplitud avance/descenso?

No. La amplitud avance/descenso 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 que se encuentran 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 cesta de 40 nombres medida aquí entre abril y julio de 2026, las sesiones del grupo 1 to 3 names promediaron 2 nombres en el denominador. Los recuentos de todo el mercado bursátil son mayores en términos absolutos, pero siguen representando una pequeña fracción del total de valores listados. Por eso, los recuentos brutos deben mostrarse junto al índice.


Cada recuento de esta página proviene de una consulta almacenada y versionada sobre precios de cierre. Abra cualquier panel para consultar el SQL correspondiente o reconstruya la misma serie de amplitud con una cesta propia en la terminal de Strasmore.

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