Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-08

Всегда ли закрываются гэпы на акциях: статистика и данные

Закрываются ли гэпы на акциях всегда? Нет, если рассматривать фиксированный срок. Изучите статистику закрытия за пять, двадцать и шестьдесят сессий для крупных компаний.

Всегда ли закрываются гэпы на акциях? Нет, если рассматривать временной горизонт, пригодный для торговли. Это утверждение сохраняет популярность лишь до тех пор, пока его никто не конкретизирует. Гэп — это разница между ценой открытия текущей сессии и ценой закрытия предыдущей. Закрытие гэпа — это момент, когда цена в ходе торгов возвращается к уровню этого предыдущего закрытия. Весь спор сводится к тому, сколько времени инвестор готов ждать этого возврата.

Что считается гэпом и что считается его закрытием

Гэп измеряется как разница между ценой открытия и ценой закрытия предыдущего дня. Вчерашняя сессия завершилась по одной цене, сегодняшняя открылась по другой — это и есть гэп. Это не расстояние от вчерашнего внутридневного максимума или минимума. Последнее — это совсем другая и гораздо более легкодостижимая цель. Подмена понятий приводит к тому, что «гэп» якобы закрывается к обеду любого обычного дня. Небольшие гэпы возникают почти на каждой сессии: торговля в других часовых поясах, изменения в индексах, новости по отдельным компаниям и корректировки на размер дивидендов — всё это меняет справедливую цену, пока рынок США закрыт. В статье Почему акции гэпуют на открытии рассматриваются причины такого пересмотра цен в нерабочее время.

Закрытие гэпа — это первый момент, когда цена акции возвращается к уровню предыдущего закрытия. Это определение неполно без указания временного лимита. На бесконечном горизонте ликвидная акция рано или поздно пересечет почти любой уровень, что делает утверждение «гэпы всегда закрываются» нефальсифицируемым, а значит, и бессмысленным. Все цифры ниже приведены с учетом заданного горизонта.

В расчетах используется одна выборка: восемь акций компаний с большой капитализацией в США, дни с гэпами с января 2021 года по февраль 2026 года. Закрытие гэпов проверялось по минутным максимумам и минимумам основной торговой сессии. Гэпы менее 0,25% исключены из-за эффекта округления.

Всегда ли гэпы закрываются в тот же день?

Начнем с размера. Сгруппируем все гэпы по величине и проверим, была ли достигнута цена предыдущего закрытия до конца той же сессии.

ЗапросДоля закрытия гэпов внутри сессии в зависимости от размера, восемь компаний с большой капитализацией, 2021–2026 гг.
Точный SQL-код для каждого числа
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

Самые маленькие гэпы в выборке (от 0,25% до 0,5%) закрывались в ту же сессию в 74.6% случаев из 2381 наблюдений. Гэпы от 4% и более закрывались в ту же сессию в 14.8% случаев. Нисходящий тренд на графике — главный вывод: чем меньше гэп, тем чаще цена возвращается к нему в течение дня. Это лишь подтверждает, что малые гэпы — это рыночный шум, а шум имеет свойство нивелироваться.

Сколько времени занимает закрытие гэпа?

При увеличении временного окна доля закрытых гэпов неизбежно растет. Более длительный период добавляет случаи закрытия, но не исключает их. Вопрос в том, какая часть этих закрытий происходит слишком поздно, чтобы иметь практическую ценность.

ЗапросДоля закрытых гэпов от 1% и более в зависимости от временного интервала
Точный SQL-код для каждого числа
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

Из 2191 гэпов размером 1% и более, 34% закрылись в ту же сессию, а 88.7% закрылись в течение 60 sessions. Вторая цифра — та, которую обычно цитируют, опуская временной горизонт. Шестьдесят сессий — это примерно три торговых месяца, слишком долгий срок для позиции, основанной на однодневном ценовом разрыве. Если гэп закрывается на сорок седьмой день после того, как акция сначала ушла далеко в противоположную сторону, статистика все равно засчитывает его как закрытый.

Шумовые гэпы и информационные гэпы — две разные категории

Гэп в спокойный день при обычном объеме торгов — это небольшая ценовая корректировка. Гэп на новостях о прибыли или предложении о поглощении несет в себе изменение фундаментальной стоимости компании, и старой цены, к которой можно было бы вернуться, больше не существует. Объем торгов позволяет неплохо разделить эти два типа: переоценка, которую рынок считает значимой, сопровождается оборотом, многократно превышающим обычный.

ЗапросДоля закрытия гэпов в зависимости от объема торгов в день гэпа
Точный SQL-код для каждого числа
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

Гэпы от 1% и более при объеме торгов менее 1,5 от среднего закрывались в ту же сессию в 35.9% случаев. Гэпы того же размера при объеме в три раза выше среднего закрывались в ту же сессию в 15.3% случаев, а 45.8% из них закрылись в течение 20 сессий (всего 59 наблюдений). Группа с высокими объемами — это как раз те самые гэпы на новостях о прибыли или сделках. Усреднение этих двух групп в один показатель не дает верного представления ни об одной из них.

Почему первые минуты сессии искажают статистику гэпов

Закрытие гэпа, зафиксированное в 9:31 утра, — явление ненадежное. Цена открытия формируется на аукционе — единой пакетной сделке, которая устанавливает цену для всех заявок, накопленных за ночь; механика этого процесса описана в нашем материале аукцион открытия. В первые минуты после этого спреды максимально широки, и одна случайная сделка может создать ценовой максимум или минимум, по которому не было совершено значимого объема торгов. В статье Спреды расширяются на открытии объясняется, почему котировки в этот момент так разрежены.

На графике ниже показана динамика на основе данных по нашей корзине акций: средний минутный диапазон (максимум минус минимум) в базисных пунктах (один базисный пункт — одна сотая процента) по 15-минутным интервалам за 2025 год.

ЗапросСредний минутный диапазон и объем торгов по времени суток, 2025 г.
Точный SQL-код для каждого числа
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

В первом 15-минутном интервале средний диапазон составляет 24.4 б.п. в минуту против 6.9 б.п. в 12:30 интервале, при объеме 303.9 тыс. акций в минуту против 69.6 тыс. Закрытие гэпа, зафиксированное в первую минуту, опирается на самые ненадежные цены дня. Приведенные выше показатели закрытия внутри сессии включают эти минуты, что немного завышает статистику. Это предостережение относится к любому показателю внутридневного закрытия.

Что проверить, прежде чем торговать гэп

  1. Временной горизонт. Показатель закрытия без указания срока — это не статистика.
  2. Выборка. Были ли отделены гэпы на новостях от «шумовых» и как именно проводилась эта граница.
  3. Методика измерения. Проверялось ли закрытие по реальным торговым диапазонам и учитывались ли первые минуты сессии.
  4. Выжившие. Содержит ли выборка только те акции, которые торгуются сегодня, что скрыто исключает гэпы, которые так и не закрылись.

Честная версия этого утверждения гораздо скромнее рекламного лозунга. Небольшие гэпы при обычном объеме часто и быстро нивелируются. Крупные гэпы на высоких объемах — это переоценка актива, которая часто сохраняется месяцами. Актуальные данные о том, какие бумаги гэпуют прямо сейчас, можно найти на странице лидеры движения акций на этой неделе, а в статье как рынки восстанавливаются после обвалов та же дисциплина временных горизонтов применяется к просадкам индексов.

Часто задаваемые вопросы

Всегда ли закрываются гэпы на акциях?

Нет. В данной выборке 88.7% гэпов размером 1% и более вернулись к уровню предыдущего закрытия в течение 60 sessions, что оставляет значительную их часть незакрытыми спустя три торговых месяца. Версия «всегда» работает только при отсутствии временных ограничений, но в таком случае она перестает быть проверяемой.

Сколько времени занимает закрытие гэпа?

Зависит от гэпа. В нашем исследовании 34% гэпов от 1% и более закрылись в ту же сессию, а остальные закрывались в течение последующих недель и месяцев. Небольшие гэпы концентрируются в рамках одного дня, а гэпы на высоких объемах закрываются дольше всего.

В чем разница между обычным гэпом и гэпом прорыва?

Терминология графического анализа разделяет гэпы по контексту. Обычный гэп возникает в спокойный день при обычном объеме и отсутствии новостей, тогда как гэп прорыва сопровождается высокими объемами и новой информацией, часто выводя цену за пределы диапазона, в котором акция находилась долгое время. Разделение по объему в таблице выше — это измеримая версия данного различия.

Почему статистика закрытия гэпов так сильно разнится в разных источниках?

Четыре фактора сильно влияют на результат: временной горизонт закрытия, корзина акций, рассматриваемый период и то, измеряется ли гэп от цены закрытия или от максимумов/минимумов предыдущего дня. Показатель закрытия, в котором не указан хотя бы один из этих параметров, нельзя сравнивать с другими.


Как проводились измерения

Сессии построены на основе минутных баров в рамках основной торговой сессии по нью-йоркскому времени. Цена открытия — это открытие первого бара основной сессии, цена закрытия — закрытие последнего бара, дневные максимум и минимум — экстремумы этих баров. Каждый гэп измеряется относительно цены закрытия того же тикера в предыдущую сессию.

Горизонты в 5, 20 и 60 сессий включают сам день гэпа. Дни с гэпами ограничены концом февраля 2026 года, при этом данные по торгам доступны по июнь 2026 года, поэтому для каждого гэпа в панели горизонтов доступно не менее шестидесяти последующих сессий, и ни один из них не помечен как «незакрытый» из-за нехватки данных.

Нормальный объем в третьей панели — это средний объем основной сессии за 20 сессий, предшествующих двум дням до гэпа, что исключает день гэпа и предыдущий день из их собственного бенчмарка.

Корзина состоит из восьми ликвидных акций с большой капитализацией. Менее ликвидные бумаги гэпуют чаще и закрываются иначе, поэтому данные показатели нельзя автоматически переносить на акции малой капитализации без проведения аналогичного теста.

Каждая панель здесь сопровождается точным SQL-запросом. Чтобы провести такой же тест для интересующего вас тикера, задайте вопрос на обычном английском языке в терминале Strasmore.

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