Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

¿Los gaps de acciones siempre se llenan? Datos

¿Los gaps de acciones siempre se llenan? No en un plazo fijo. Consulta las tasas de fill en la sesión, 5, 20 y 60 sesiones para large caps y el SQL.

¿Los gaps de las acciones siempre se llenan? No dentro de un horizonte lo bastante corto como para operar con esa premisa, y la afirmación suele mantenerse sobre todo cuando nadie especifica uno. Un gap es la distancia entre la apertura de hoy y el cierre de ayer en la sesión regular. Un fill ocurre cuando el precio vuelve a cruzar ese cierre anterior. Todo el argumento depende del tiempo que el lector esté dispuesto a esperar.

Qué se considera un gap y qué se considera un cierre

Un gap se mide entre la apertura y el cierre previo. La sesión de ayer terminó en un precio y la de hoy abrió en otro. La diferencia entre ambos es el gap. No es la distancia respecto del máximo o mínimo intradía de ayer. Ese es un objetivo distinto y mucho más fácil. Confundirlos es la razón por la que un “gap” puede convertirse silenciosamente en un movimiento que se cierra antes del mediodía en cualquier sesión normal. Los gaps pequeños aparecen en casi todas las sesiones. Las operaciones en otras zonas horarias, los cambios en los índices, las noticias sobre una acción específica y los ajustes por la fecha ex-dividendo pueden mover el precio razonable mientras el mercado estadounidense está cerrado. Por qué las acciones presentan gaps durante la noche explica de dónde surge esa reevaluación nocturna.

Un cierre ocurre en el primer momento en que la acción vuelve a cotizar atravesando el precio de cierre previo. Esa definición está incompleta si no se establece un plazo. En un horizonte ilimitado, una acción líquida cruza en algún momento casi cualquier nivel que mencione un lector. Por eso, afirmar que “los gaps siempre se cierran” no se puede refutar, pero tampoco es cierto. Cada cifra que aparece a continuación incluye un horizonte definido.

El análisis utiliza una muestra durante todo el artículo: ocho acciones estadounidenses de gran capitalización, con días de gap entre enero de 2021 y febrero de 2026. Los cierres se evaluaron con los máximos y mínimos de velas de un minuto durante la sesión regular. Se excluyen los gaps inferiores a 0.25% porque pueden deberse al redondeo.

¿Las brechas de las acciones siempre se cierran el mismo día?

Empiece por el tamaño. Agrupe cada brecha según su magnitud y luego compruebe si el cierre previo volvió a tocarse antes de que terminara esa misma sesión.

ConsultaTasa de cierre del gap en la misma sesión, por tamaño del gap, ocho acciones de gran capitalización, 2021 a 2026
El SQL exacto detrás de cada cifra
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
gapped AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close
    FROM sessions
),
measured AS
(
    SELECT
        abs(100 * (session_open / prior_close - 1)) AS gap_pct,
        toUInt8(if(session_open > prior_close,
                   session_low  <= prior_close,
                   session_high >= prior_close))    AS filled_same_session
    FROM gapped
    WHERE prior_close > 0
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 0.25
)
SELECT
    multiIf(gap_pct < 0.5, '0.25 to 0.5%',
            gap_pct < 1,   '0.5 to 1%',
            gap_pct < 2,   '1 to 2%',
            gap_pct < 4,   '2 to 4%',
                           '4% or more')         AS gap_bucket,
    count()                                      AS gap_days,
    round(100 * avg(filled_same_session), 1)     AS same_session_fill_pct
FROM measured
GROUP BY gap_bucket
ORDER BY min(gap_pct) ASC
Run this yourself

Las brechas más pequeñas de la muestra, de 0.25% a 0.5%, se cerraron en la misma sesión 74.6% de las veces, en 2381 casos. Las brechas de 4% o más se cerraron en la misma sesión 14.8% de las veces. La pendiente descendente del gráfico resume gran parte de la conclusión: cuanto menor es la brecha, más veces la acción vuelve a cruzarla durante el día. Dicho de otro modo, las brechas pequeñas son ruido y el ruido tiende a revertirse.

¿Cuánto tarda en cerrarse un gap?

Si se amplía el plazo, la tasa de cierre solo puede aumentar. Un horizonte más largo suma cierres y nunca los elimina. La pregunta es qué proporción del total llega demasiado tarde para ser útil.

ConsultaPorcentaje de gaps de 1%+ cerrados, según el tiempo de espera
El SQL exacto detrás de cada cifra
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
paths AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)                                                          AS prior_close,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING)   AS low_5,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING)   AS high_5,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING)  AS low_20,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING)  AS high_20,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING)  AS low_60,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING)  AS high_60
    FROM sessions
),
gaps AS
(
    SELECT
        session_open > prior_close AS gap_up,
        prior_close,
        session_low,
        session_high,
        low_5,
        high_5,
        low_20,
        high_20,
        low_60,
        high_60
    FROM paths
    WHERE prior_close > 0
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 1
),
flags AS
(
    SELECT arrayJoin([
        (1, '1 session',   toUInt8(if(gap_up, session_low <= prior_close, session_high >= prior_close))),
        (2, '5 sessions',  toUInt8(if(gap_up, low_5  <= prior_close, high_5  >= prior_close))),
        (3, '20 sessions', toUInt8(if(gap_up, low_20 <= prior_close, high_20 >= prior_close))),
        (4, '60 sessions', toUInt8(if(gap_up, low_60 <= prior_close, high_60 >= prior_close)))
    ]) AS f
    FROM gaps
)
SELECT
    tupleElement(f, 2)                        AS horizon,
    count()                                   AS gaps_measured,
    round(100 * avg(tupleElement(f, 3)), 1)   AS filled_pct
FROM flags
GROUP BY horizon
ORDER BY min(tupleElement(f, 1)) ASC
Run this yourself

De 2191 gaps de 1% o más, 34% se cerraron dentro de la misma sesión y 88.7% se habían cerrado en un plazo de 60 sessions. La segunda cifra es la que suele citarse, sin indicar el horizonte temporal. Sesenta sesiones equivalen aproximadamente a tres meses de trading. Es un periodo largo para una posición basada en una dislocación de un día. Además, un gap que se cierra el día 47, después de que la acción haya avanzado primero con fuerza en la dirección opuesta, sigue contando como cerrado en esa estadística.

Las brechas por ruido y las brechas informativas son dos poblaciones

Una brecha en una jornada tranquila y con volumen normal es un pequeño ajuste de precio. Una brecha provocada por noticias de resultados o por una oferta de adquisición refleja un cambio en el valor de la empresa, y ya no existe un precio anterior al que revertir. El volumen permite distinguir razonablemente bien ambos casos: cuando todo el mercado quiere negociar una revaluación, los prints suelen multiplicar varias veces el turnover normal.

ConsultaTasa de cierre del gap según el volumen del día del gap
El SQL exacto detrás de cada cifra
WITH sessions AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMin(toFloat64(open), window_start)                AS session_open,
        argMax(toFloat64(close), window_start)               AS session_close,
        toFloat64(max(high))                                 AS session_high,
        toFloat64(min(low))                                  AS session_low,
        sum(toFloat64(volume))                               AS session_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
      AND window_start >= '2021-01-01'
      AND window_start <  '2026-07-01'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY ticker, d
),
paths AS
(
    SELECT
        d,
        session_open,
        session_high,
        session_low,
        session_volume,
        lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY d ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)                                                         AS prior_close,
        avg(session_volume) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN 21 PRECEDING AND 2 PRECEDING) AS normal_volume,
        min(session_low)  OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING) AS low_20,
        max(session_high) OVER (PARTITION BY ticker ORDER BY d ASC ROWS BETWEEN CURRENT ROW AND 19 FOLLOWING) AS high_20
    FROM sessions
),
measured AS
(
    SELECT
        session_volume / normal_volume AS volume_ratio,
        toUInt8(if(session_open > prior_close, session_low <= prior_close, session_high >= prior_close)) AS filled_same_session,
        toUInt8(if(session_open > prior_close, low_20 <= prior_close, high_20 >= prior_close))           AS filled_20_sessions
    FROM paths
    WHERE prior_close > 0
      AND normal_volume > 0
      AND d >= toDate('2021-03-01')
      AND d <= toDate('2026-02-28')
      AND abs(100 * (session_open / prior_close - 1)) >= 1
)
SELECT
    multiIf(volume_ratio < 1.5, 'Under 1.5x normal',
            volume_ratio < 3,   '1.5x to 3x normal',
                                '3x or more')        AS volume_regime,
    count()                                          AS gap_days,
    round(100 * avg(filled_same_session), 1)         AS same_session_fill_pct,
    round(100 * avg(filled_20_sessions), 1)          AS within_20_sessions_fill_pct
FROM measured
WHERE isFinite(volume_ratio)
GROUP BY volume_regime
ORDER BY min(volume_ratio) ASC
Run this yourself

Las brechas de 1% o más, con un volumen inferior a 1.5 veces el turnover normal de la acción, se cerraron en la misma sesión 35.9% de las veces. Las brechas del mismo tamaño, con un volumen de tres veces el normal o más, se cerraron en la misma sesión 15.3% de las veces y 45.8% dentro de 20 sesiones, en 59 de los casos. El grupo de alto volumen es donde se concentran las brechas por resultados y las brechas relacionadas con operaciones corporativas. Promediar ambos grupos en una sola cifra no describe adecuadamente a ninguno de los dos.

Por qué los primeros minutos de la sesión distorsionan las estadísticas de gaps

Una ejecución registrada a las 9:31 a. m. es un dato frágil. El precio de apertura surge de una subasta, un cruce único por lotes que establece un precio para todas las órdenes acumuladas durante la noche. Nuestro explicador sobre la subasta de apertura detalla el mecanismo. En los minutos posteriores a ese cruce, los spreads cotizados alcanzan sus niveles más amplios del día y una sola operación pequeña puede marcar un máximo o un mínimo en el que nunca se negoció un volumen significativo. Los spreads se amplían en la apertura explica por qué la cotización es tan poco líquida en ese momento.

El gráfico siguiente muestra este patrón en el tape del propio basket: el rango máximo-mínimo promedio de un minuto, en puntos básicos (un punto básico equivale a una centésima parte de un por ciento), por bloques horarios de quince minutos, hasta 2025.

ConsultaRango promedio de un minuto y volumen por hora del día, 2025
El SQL exacto detrás de cada cifra
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
    round(10000 * avg(toFloat64(high) / toFloat64(low) - 1), 1) AS avg_range_bps,
    round(avg(toFloat64(volume)) / 1000, 1)                     AS avg_volume_k
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'JPM', 'KO', 'WMT', 'XOM')
  AND window_start >= '2025-01-01'
  AND window_start <  '2026-01-01'
  AND toFloat64(low) > 0
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
       + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY et_time
ORDER BY et_time ASC
Run this yourself

El bloque de apertura registra un rango promedio de 24.4 puntos básicos por minuto, frente a 6.9 puntos básicos en el bloque 12:30, con 303.9 mil acciones por minuto frente a 69.6 mil. Una ejecución registrada dentro de ese primer bloque se basa en los precios menos confiables del día. Las cifras de la misma sesión que aparecen arriba incluyen esos minutos, lo que introduce un sesgo ligeramente alcista. Esta salvedad se aplica a todas las estadísticas de ejecuciones del mismo día, incluida esta.

Qué revisar antes de considerar un gap como una operación

  1. El horizonte. Una tasa de cierre sin un plazo definido no es una estadística.
  2. La población. Hay que saber si los gaps provocados por noticias se separaron de los gaps en sesiones tranquilas y cómo se estableció esa distinción.
  3. La medición. Hay que comprobar si los cierres se evaluaron frente a rangos realmente negociados y si se incluyeron los primeros minutos de la sesión.
  4. Los supervivientes. Hay que verificar si la muestra solo contiene acciones que todavía cotizan hoy, lo que elimina de forma silenciosa los gaps que nunca se cerraron.

La versión honesta de la afirmación es más limitada que el eslogan. Los gaps pequeños con un volumen normal suelen revertir con frecuencia y rapidez. Los gaps grandes con un volumen elevado reflejan cambios de valoración y con frecuencia se mantienen durante meses. Para consultar en tiempo real qué nombres están registrando gaps, la página mayores movimientos de acciones de esta semana sigue la semana en curso, mientras que cómo se recuperan los mercados de los crashes aplica la misma disciplina de horizonte a las caídas de los índices.

Preguntas frecuentes

¿Los gaps de las acciones siempre se cubren?

No. En la muestra analizada, 88.7% de los gaps de 1% o más volvieron a negociarse hasta el cierre anterior dentro de 60 sessions, por lo que una proporción relevante seguía sin cubrirse después de unos tres meses de sesiones. La afirmación de que ocurre “siempre” solo funciona si no se establece un límite de tiempo; en ese caso deja de ser comprobable.

¿Cuánto tarda en cubrirse un gap?

Depende del gap. En este análisis, 34% de los gaps de 1% o más se cubrieron dentro de la misma sesión. Los demás se cubrieron durante las semanas y meses siguientes. Los gaps pequeños se concentran en la categoría de cobertura intradía, mientras que los de mayor volumen son los más lentos.

¿Cuál es la diferencia entre un gap común y un gap de ruptura?

La terminología de los gráficos clasifica los gaps según el contexto. Un gap común se produce en un día normal, con un volumen normal y sin noticias específicas. Un gap de ruptura se produce con un volumen elevado y nueva información, a menudo fuera de un rango de precios que la acción había mantenido durante cierto tiempo. La división por volumen del panel anterior es una forma medible de expresar esa misma distinción.

¿Por qué las estadísticas sobre cobertura de gaps varían tanto entre fuentes?

Cuatro decisiones pueden modificar considerablemente el resultado: el horizonte de cobertura, la cesta de acciones, el periodo analizado y si el gap se mide desde el cierre anterior o desde el máximo y el mínimo anteriores. Una tasa de cobertura que no especifique estos cuatro elementos no puede compararse con otra.


Cómo se midieron estas cifras

Las sesiones se construyen a partir de barras de un minuto dentro del horario regular de negociación de Nueva York. El precio de apertura es la apertura de la primera barra de la sesión regular. El cierre es el cierre de la última barra. El máximo y el mínimo del día son los extremos de esas barras. Cada gap se mide frente al cierre de la sesión anterior del mismo ticker.

Los horizontes de 5, 20 y 60 sesiones incluyen el propio día del gap. Los días con gap llegan hasta finales de febrero de 2026, mientras que los datos de mercado se extienden hasta junio de 2026. Por ello, cada gap del panel de horizontes tiene al menos sesenta sesiones posteriores disponibles y ninguno se clasifica como no cubierto por falta de datos.

El volumen normal del tercer panel es el volumen promedio de la sesión regular durante las 20 sesiones que terminan dos días antes del gap. Así, el día del gap y el día anterior quedan fuera de su propio punto de referencia.

La cesta está compuesta por ocho acciones large cap líquidas. Las acciones con menor liquidez presentan gaps con mayor frecuencia y se cubren de otra manera. Por eso, estas tasas no se pueden extrapolar a small caps sin volver a ejecutar la misma prueba sobre ellas.

Cada panel incluye debajo el SQL exacto utilizado. Para ejecutar la misma prueba sobre un ticker que sigues, formula la pregunta en inglés sencillo en la terminal de Strasmore.

#gaps#gap fill#opening auction#overnight returns#technical analysis