Apakah Gap Saham Selalu Terisi? Data
Apakah gap saham selalu terisi? Tidak dalam horizon tetap. Lihat tingkat pengisian pada sesi yang sama, 5, 20, dan 60 sesi untuk large caps, beserta SQL-nya.
Apakah gap saham selalu terisi? Tidak dalam horizon yang cukup singkat untuk diperdagangkan, dan klaim itu terutama bertahan ketika tidak ada yang menyebutkan batas waktunya. Gap adalah jarak antara harga pembukaan hari ini dan penutupan sesi reguler kemarin. Fill adalah saat harga kembali diperdagangkan melewati penutupan sebelumnya. Seluruh perdebatan bergantung pada berapa lama pembaca bersedia menunggu.
Apa yang dimaksud dengan gap dan fill
Gap diukur dari harga pembukaan terhadap penutupan sebelumnya. Sesi kemarin berakhir pada satu harga, sesi hari ini dibuka pada harga lain, dan selisihnya adalah gap. Gap bukan jarak dari titik tertinggi atau terendah intraday kemarin. Itu target yang berbeda dan jauh lebih mudah dicapai. Menukar satu ukuran dengan ukuran lainnya membuat “gap” tampak seolah-olah tertutup sebelum makan siang pada hari biasa. Gap kecil muncul hampir di setiap sesi. Perdagangan di zona waktu lain, perubahan indeks, berita tentang saham tertentu, dan penyesuaian ex-dividend semuanya dapat mengubah harga wajar ketika pasar AS tutup. Mengapa saham mengalami gap overnight membahas sumber repricing overnight tersebut.
Fill adalah momen pertama ketika saham kembali diperdagangkan melewati harga penutupan sebelumnya. Definisi itu belum lengkap tanpa batas waktu. Dalam horizon tanpa batas, saham likuid hampir pasti akan melewati level apa pun yang disebut pembaca pada suatu saat. Itu membuat klaim “gap selalu terisi” tidak dapat dibuktikan salah, bukan berarti benar. Setiap angka di bawah mencantumkan horizon yang digunakan.
Satu sampel digunakan di seluruh halaman ini: delapan saham large-cap AS, hari terjadinya gap dari Januari 2021 hingga Februari 2026, dengan fill diuji berdasarkan titik tertinggi dan terendah reguler satu menit. Gap di bawah 0,25% dikeluarkan sebagai pembulatan.
Apakah gap saham selalu terisi pada hari yang sama?
Mulai dari ukurannya. Kelompokkan setiap gap berdasarkan besarannya, lalu lihat apakah harga penutupan sebelumnya kembali tersentuh sebelum sesi yang sama berakhir.
SQL tepat di balik setiap angka
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) ASCGap terkecil dalam sampel, yaitu 0,25% hingga 0,5%, tertutup pada sesi yang sama sebanyak 74.6% dari 2381 kejadian. Gap sebesar 4% atau lebih tertutup pada sesi yang sama sebanyak 14.8%. Kemiringan grafik menunjukkan sebagian besar pelajarannya: semakin kecil gap, semakin sering saham bergerak kembali melewatinya pada hari tersebut. Dengan kata lain, gap kecil adalah noise, dan noise cenderung berbalik.
Berapa lama waktu yang dibutuhkan gap untuk terisi?
Perpanjangan batas waktu hanya dapat meningkatkan fill rate. Jendela yang lebih panjang menambah fill dan tidak pernah menguranginya. Pertanyaannya adalah seberapa besar bagian total fill yang baru terjadi setelah terlalu lama untuk dimanfaatkan.
SQL tepat di balik setiap angka
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)) ASCDari 2191 gap sebesar 1% atau lebih, 34% terisi dalam sesi yang sama dan 88.7% telah terisi dalam 60 sessions. Angka kedua biasanya yang dikutip, sementara horizonnya tidak disebutkan. Enam puluh sesi kira-kira setara dengan tiga bulan perdagangan. Itu merupakan periode holding yang panjang untuk posisi yang didasarkan pada dislokasi satu hari. Gap yang terisi pada hari ke-47, setelah saham lebih dulu bergerak jauh ke arah berlawanan, tetap dihitung sebagai gap yang terisi dalam statistik tersebut.
Gap noise dan gap informasi merupakan dua kelompok berbeda
Gap pada hari yang tenang dengan volume normal merupakan penyesuaian harga kecil. Gap yang muncul setelah berita earnings atau pendekatan takeover mencerminkan perubahan nilai perusahaan. Dalam kondisi itu, tidak ada lagi harga lama yang harus menjadi tempat kembali. Volume cukup efektif untuk membedakan keduanya. Repricing yang ingin diperdagangkan oleh seluruh pasar akan menghasilkan prints berkali-kali lipat dari turnover normal.
SQL tepat di balik setiap angka
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) ASCGap sebesar 1% atau lebih dengan volume di bawah 1,5 kali turnover normal saham tersebut terisi pada sesi yang sama sebanyak 35.9%. Gap dengan ukuran sama dan volume setidaknya tiga kali turnover normal terisi pada sesi yang sama sebanyak 15.3%, dan 45.8% terisi dalam 20 sesi, dari total 59 gap. Kelompok dengan volume tinggi mencakup gap earnings dan gap akibat deal. Menggabungkan kedua kelompok menjadi satu angka tidak menggambarkan salah satunya dengan baik.
Mengapa menit-menit pertama sesi mendistorsi statistik gap
Fill yang tercatat pada pukul 9.31 pagi merupakan data yang rapuh. Harga pembukaan berasal dari auction, yaitu cross tunggal secara batch yang menetapkan satu harga untuk seluruh order yang mengantre sejak overnight. Penjelasan kami tentang opening auction membahas mekanismenya. Pada menit-menit setelah cross tersebut, quoted spread berada pada level terlebar hari itu. Satu print kecil dapat mencatat titik tertinggi atau terendah yang sebenarnya tidak pernah diperdagangkan dalam size besar. Spread melebar saat pembukaan menjelaskan mengapa quote sangat tipis pada periode tersebut.
Grafik di bawah menunjukkan pola pada tape basket itu sendiri: rata-rata rentang high-low satu menit dalam basis point (satu basis point adalah seperseratus persen), berdasarkan bucket waktu 15 menit, hingga 2025.
SQL tepat di balik setiap angka
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 ASCBucket pembukaan memiliki rata-rata rentang 24.4 bps per menit, dibandingkan dengan 6.9 bps pada bucket 12:30. Volume masing-masing adalah 303.9 ribu saham per menit versus 69.6 ribu. Fill yang tercatat dalam bucket pertama bergantung pada harga yang paling tidak andal pada hari itu. Angka same-session di atas mencakup menit-menit tersebut, sehingga sedikit bias ke atas. Catatan ini berlaku untuk seluruh statistik same-day fill, termasuk statistik ini.
Hal yang perlu diperiksa sebelum memperlakukan gap sebagai trade
- Horizon. Fill rate tanpa batas waktu bukanlah statistik.
- Populasi. Periksa apakah gap akibat berita dipisahkan dari gap pada hari yang tenang, serta bagaimana batas pemisahnya ditentukan.
- Pengukuran. Periksa apakah fill diuji berdasarkan rentang harga yang benar-benar diperdagangkan dan apakah menit-menit pertama sesi turut dihitung.
- Saham yang bertahan. Periksa apakah sampel hanya berisi saham yang masih diperdagangkan hari ini. Pembatasan itu secara diam-diam menghapus gap yang tidak pernah terisi.
Versi klaim yang jujur lebih sempit daripada slogannya. Gap kecil dengan volume normal sering berbalik dan terisi dengan cepat. Gap besar dengan volume tinggi merupakan repricing yang sering bertahan selama berbulan-bulan. Untuk melihat saham mana yang sedang mengalami gap, halaman saham dengan pergerakan terbesar minggu ini melacak minggu berjalan. Halaman bagaimana pasar pulih dari crash menerapkan disiplin horizon yang sama pada drawdown indeks.
FAQ
Apakah gap saham selalu terisi?
Tidak. Dalam sampel ini, 88.7% gap sebesar 1% atau lebih kembali diperdagangkan melewati penutupan sebelumnya dalam 60 sessions. Artinya, sebagian gap tetap tidak terisi setelah sekitar tiga bulan perdagangan. Versi klaim yang menggunakan kata “selalu” hanya berlaku jika tidak ada batas waktu. Dalam kondisi itu, klaim tersebut tidak lagi dapat diuji.
Berapa lama waktu yang dibutuhkan gap untuk terisi?
Hal itu bergantung pada gap-nya. Dalam sampel ini, 34% gap sebesar 1% atau lebih terisi dalam sesi yang sama. Fill lainnya terjadi sepanjang minggu dan bulan berikutnya. Gap kecil terkonsentrasi pada bucket same-day. Gap dengan volume tinggi merupakan yang paling lambat terisi.
Apa perbedaan antara common gap dan breakaway gap?
Kosakata chart membedakan gap berdasarkan konteksnya. Common gap terbuka pada hari dengan volume normal dan tanpa berita spesifik. Breakaway gap terbuka dengan volume tinggi bersamaan dengan informasi baru, sering kali ketika saham keluar dari price range yang telah dipertahankan selama beberapa waktu. Pemisahan berdasarkan volume pada panel di atas merupakan versi terukur dari perbedaan yang sama.
Mengapa statistik gap fill sangat berbeda antar sumber?
Empat pilihan dapat mengubah angka secara signifikan: horizon fill, basket saham, periode yang dicakup, dan apakah gap diukur dari penutupan sebelumnya atau dari titik tertinggi dan terendah sebelumnya. Fill rate yang tidak menyebutkan salah satu dari empat hal tersebut tidak dapat dibandingkan dengan fill rate lainnya.
Cara angka-angka ini diukur
Sesi dibentuk dari bar satu menit dalam jam perdagangan reguler berdasarkan waktu New York. Harga pembukaan adalah open pada bar sesi reguler pertama. Harga penutupan adalah close pada bar terakhir. Titik tertinggi dan terendah harian adalah nilai ekstrem dari bar-bar tersebut. Setiap gap diukur terhadap penutupan sesi sebelumnya pada ticker yang sama.
Horizon 5, 20, dan 60 sesi mencakup hari terjadinya gap. Hari gap berhenti dihitung pada akhir Februari 2026, sementara tape berjalan hingga Juni 2026. Dengan demikian, setiap gap dalam panel horizon memiliki setidaknya 60 sesi berikutnya yang tersedia. Tidak ada gap yang dianggap tidak terisi hanya karena kekurangan data.
Normal volume pada panel ketiga adalah rata-rata volume sesi reguler selama 20 sesi yang berakhir dua hari sebelum gap. Dengan metode ini, hari gap dan hari sebelumnya tidak masuk ke dalam benchmarknya sendiri.
Basket ini terdiri atas delapan saham large-cap yang likuid. Saham yang lebih tipis mengalami gap lebih sering dan memiliki pola fill yang berbeda. Karena itu, rate ini tidak dapat diterapkan pada small caps tanpa menjalankan kembali pengujian yang sama pada saham-saham tersebut.
Setiap panel di sini dilengkapi SQL lengkap di bawahnya. Untuk menjalankan pengujian yang sama pada ticker yang Anda ikuti, ajukan pertanyaan dalam bahasa sehari-hari di terminal Strasmore.