स्टॉक gaps नेहमी भरले जातात का? आकडेवारी
स्टॉक gaps कोणत्याही ठरावीक कालावधीत नेहमी भरले जात नाहीत. large caps साठी same session, 5, 20 आणि 60 session fill rates, तसेच SQL पाहा.
स्टॉकमधील gaps नेहमी भरले जातात का? व्यापारासाठी पुरेसा लहान असा कोणताही horizon घेतला, तर नाही. आणि कोणीही कालमर्यादा सांगत नाही तेव्हाच हा दावा मुख्यतः टिकतो. Gap म्हणजे आजच्या opening price आणि कालच्या regular-session close यांमधील अंतर. Fill म्हणजे किंमत पुन्हा त्या आधीच्या closeमधून व्यवहार करते तो क्षण. हा संपूर्ण युक्तिवाद वाचक किती काळ प्रतीक्षा करण्यास तयार आहे यावर अवलंबून असतो.
Gap आणि fill कशाला म्हणतात
Gap मोजताना आजची open price आधीच्या closeशी तुलना केली जाते. कालचे session एका किंमतीवर संपले आणि आजचे session दुसऱ्या किंमतीवर सुरू झाले; या दोन किंमतींमधील फरक म्हणजे gap. तो कालच्या intraday high किंवा lowपासून मोजला जात नाही. ते वेगळे आणि बरेच सोपे target आहे. दोन्ही गोष्टी एकच मानल्यास कोणत्याही सामान्य दिवशी दुपारपर्यंत बंद होणाऱ्या हालचालीला सहजपणे “gap” म्हटले जाते. जवळजवळ प्रत्येक sessionमध्ये छोटे gaps दिसतात. US market बंद असताना इतर time zonesमधील trading, index changes, single-name news आणि ex-dividend adjustments यांमुळे fair price बदलतो. स्टॉक्समध्ये overnight gap का पडतो या लेखात overnight repricing कुठून येते हे स्पष्ट केले आहे.
Fill म्हणजे स्टॉकची किंमत पुन्हा आधीच्या closing priceमधून व्यवहार करते तो पहिला क्षण. मात्र deadline सांगितल्याशिवाय ही व्याख्या अपुरी आहे. अमर्याद horizonमध्ये liquid stock एखाद्या वाचकाने सांगितलेल्या जवळजवळ कोणत्याही पातळीवर कधीतरी पोहोचतो. त्यामुळे “gaps always fill” हा दावा खरा ठरण्याऐवजी unfalsifiable ठरतो. खालील प्रत्येक आकड्यासोबत स्पष्ट horizon दिलेला आहे.
या पानावरील नमुन्यात आठ मोठ्या market-cap असलेल्या US stocksचा समावेश आहे. January 2021 ते February 2026 या कालावधीतील gap days घेतले आहेत. Fillsची चाचणी regular-session one-minute highs आणि lowsविरुद्ध केली आहे. 0.25%पेक्षा कमी gaps roundingमुळे वगळले आहेत.
स्टॉकमधील gaps त्याच दिवशी नेहमी भरले जातात का?
सुरुवात gapच्या आकारापासून करा. प्रत्येक gap त्याच्या आकारानुसार गटबद्ध करा. त्यानंतर त्याच sessionच्या समाप्तीपूर्वी आधीच्या closeला किंमत पुन्हा स्पर्श करते का ते तपासा.
प्रत्येक आकड्यामागील अचूक 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नमुन्यातील सर्वात छोटे gaps, म्हणजे 0.25% ते 0.5%, 74.6% घटनांपैकी 2381 वेळा त्याच sessionमध्ये बंद झाले. 4% किंवा त्याहून मोठे gaps 14.8% वेळा त्याच sessionमध्ये बंद झाले. Chartमधील उतरणारा कल हा या विश्लेषणाचा मुख्य निष्कर्ष आहे. Gap जितका लहान, तितक्या वेळा स्टॉक दिवसभरात त्यातून पुन्हा उलट बाजूने जातो. दुसऱ्या शब्दांत, छोटे gaps हे noise असतात आणि noise बहुधा उलटतो.
Gap भरण्यास किती वेळ लागतो?
Deadline वाढवल्यास fill rate फक्त वाढू शकतो. मोठा window अधिक fills समाविष्ट करतो आणि आधीचे fills कधीही काढून टाकत नाही. प्रश्न हा आहे की एकूण fillsपैकी किती fills इतक्या उशिरा होतात की त्यांचा tradingसाठी उपयोग राहत नाही.
प्रत्येक आकड्यामागील अचूक 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)) ASC1% किंवा त्याहून मोठ्या 2191 gapsपैकी 34% त्याच sessionमध्ये भरले आणि 88.7% 60 sessionsच्या आत भरले होते. दुसरा आकडा सहसा उद्धृत केला जातो, पण horizon सांगितला जात नाही. Sixty sessions म्हणजे साधारण तीन trading months. One-day dislocationवर आधारित positionसाठी हा मोठा holding period आहे. एखादा gap stockने आधी उलट दिशेने मोठी हालचाल केल्यानंतर day 47ला भरला, तरी त्या statisticमध्ये तो filled म्हणून मोजला जातो.
Noise gaps आणि information gaps हे दोन वेगळे गट आहेत
सामान्य volume असलेल्या शांत दिवशी पडलेला gap हा छोटा pricing adjustment असतो. Earnings news किंवा takeover approachमुळे पडलेला gap कंपनीच्या मूल्याविषयी बदललेली माहिती दर्शवतो. अशा वेळी परत जाण्यासाठी जुनी योग्य किंमत उरलेली नसते. Volume या दोन प्रकारांमध्ये तुलनेने चांगला फरक दाखवतो. संपूर्ण marketला trade करायचे असलेले repricing सामान्य turnoverपेक्षा अनेक पटींनी अधिक prints निर्माण करते.
प्रत्येक आकड्यामागील अचूक 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स्टॉकच्या सामान्य turnoverच्या 1.5 पटांपेक्षा कमी volumeवर पडलेले 1% किंवा त्याहून मोठे gaps 35.9% वेळा त्याच sessionमध्ये भरले. सामान्य volumeच्या किमान तीन पट volumeवर पडलेले समान आकाराचे gaps 15.3% वेळा त्याच sessionमध्ये भरले आणि 59 gapsपैकी 45.8% 20 sessionsच्या आत भरले. High-volume गटात earnings gaps आणि deal gapsचा समावेश आहे. या दोन्ही गटांची सरासरी काढून एकच आकडा दिल्यास तो कोणत्याही गटाचे योग्य वर्णन करत नाही.
Sessionच्या पहिल्या मिनिटांमुळे gap statisticsमध्ये विकृती का येते
9:31 a.m.ला नोंदवलेला fill नाजूक असतो. Opening price auctionमधून ठरते. Overnight queueमध्ये असलेल्या सर्व ordersसाठी एकच किंमत ठरवणारा हा एकत्रित cross असतो. आमचे opening auction स्पष्टीकरण ही प्रक्रिया समजावते. त्या crossनंतरच्या काही मिनिटांत quoted spreads दिवसभरातील सर्वाधिक रुंद असतात. एखादा छोटा print अशा high किंवा lowची नोंद करू शकतो ज्यावर प्रत्यक्षात कोणत्याही मोठ्या sizeचा व्यवहार झालेला नसतो. Openच्या वेळी spreads का रुंदावतात या लेखात त्या वेळची quote इतकी thin का असते हे स्पष्ट केले आहे.
खालील chartमध्ये या basketच्या tapeवरील स्थिती दाखवली आहे. 2025पर्यंतच्या कालावधीत, पंधरा-मिनिटांच्या clock bucketनुसार average one-minute high-low range basis pointsमध्ये दाखवली आहे. One basis point म्हणजे टक्क्याच्या एकशेवा भाग.
प्रत्येक आकड्यामागील अचूक 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 ASCOpening bucketमध्ये प्रति मिनिट range सरासरी 24.4 bps होती. 12:30 bucketमध्ये ती 6.9 bps होती. त्या वेळी प्रति मिनिट volume अनुक्रमे 303.9 हजार shares आणि 69.6 हजार shares होता. पहिल्या bucketमध्ये नोंदवलेला fill दिवसभरातील सर्वात कमी विश्वासार्ह किंमतींवर आधारित असतो. वरील same-session आकड्यांमध्ये ही मिनिटे समाविष्ट आहेत. त्यामुळे ते आकडे किंचित जास्त दिसू शकतात. ही सूचना या आकड्यासह प्रत्येक same-day fill statisticला लागू होते.
Gapला trade मानण्यापूर्वी काय तपासावे
- Horizon. Deadline नसलेला fill rate हा statistic नाही.
- Population. News gaps शांत दिवसांतील gapsपासून वेगळे केले आहेत का, आणि ही सीमा कशी ठरवली आहे.
- Measurement. Fillsची चाचणी प्रत्यक्ष traded rangesविरुद्ध केली आहे का, आणि sessionची पहिली मिनिटे समाविष्ट केली आहेत का.
- Survivors. नमुन्यात आजही trade होणारे stocksच ठेवले आहेत का. असे केल्यास कधीही न भरलेले gaps नकळत वगळले जातात.
या दाव्याची अचूक आवृत्ती sloganपेक्षा मर्यादित आहे. सामान्य volumeवरील छोटे gaps वारंवार आणि लवकर revert होतात. Heavy volumeवरील मोठे gaps हे repricing असतात आणि अनेकदा काही महिने टिकतात. सध्या कोणती names gap होत आहेत हे पाहण्यासाठी या आठवड्यातील सर्वात मोठे stock movers हे पान चालू आठवड्याचा मागोवा घेते. तसेच markets crashesमधून कसे सावरतात हे पान index drawdownsसाठी हाच horizon discipline वापरते.
FAQ
स्टॉकमधील gaps नेहमी भरले जातात का?
नाही. या नमुन्यात 1% किंवा त्याहून मोठ्या gapsपैकी 88.7% gaps 60 sessionsच्या आत आधीच्या closeमधून पुन्हा trade झाले. त्यामुळे साधारण तीन trading monthsनंतरही काही gaps भरलेले नसतात. कोणतीही time limit न लावल्यासच “always” हा दावा चालतो. त्या क्षणी तो test करण्यायोग्य राहत नाही.
Gap भरण्यास किती वेळ लागतो?
हे gapवर अवलंबून असते. येथे 1% किंवा त्याहून मोठ्या gapsपैकी 34% gaps त्याच sessionमध्ये भरले. उर्वरित fills पुढील weeks आणि monthsमध्ये झाले. छोटे gaps same-day bucketमध्ये अधिक प्रमाणात येतात. Heavy-volume gaps सर्वात उशिरा भरतात.
Common gap आणि breakaway gap यांच्यात काय फरक आहे?
Chart vocabulary gapsना त्यांच्या contextनुसार विभागते. Common gap हा सामान्य volume असलेल्या सामान्य दिवशी, विशिष्ट news नसताना उघडतो. Breakaway gap हा heavy volumeसह आणि नवीन माहितीच्या पार्श्वभूमीवर उघडतो. तो अनेकदा stock काही काळ टिकवून ठेवलेल्या price rangeच्या बाहेर पडतो. वरील panelमधील volume split हा याच फरकाचा मोजता येणारा प्रकार आहे.
वेगवेगळ्या sourcesमधील gap fill statisticsमध्ये इतका फरक का असतो?
चार निवडींमुळे आकडा मोठ्या प्रमाणात बदलतो: fill horizon, stocksचा basket, समाविष्ट केलेला कालावधी आणि gap आधीच्या closeपासून मोजला आहे की आधीच्या high आणि lowपासून. या चारपैकी कोणतीही माहिती नसलेला fill rate दुसऱ्या आकड्याशी तुलना करता येत नाही.
हे आकडे कसे मोजले
Sessions New York timeनुसार regular trading hoursमधील one-minute barsपासून तयार केले आहेत. Opening price ही पहिल्या regular-session barची open आहे. Closing price ही शेवटच्या barची close आहे. दिवसाचा high आणि low हे त्या barsमधील extreme values आहेत. प्रत्येक gap त्याच tickerच्या मागील sessionच्या closeच्या तुलनेत मोजला आहे.
5, 20 आणि 60 session horizonsमध्ये gap day स्वतः समाविष्ट आहे. Gap days February 2026च्या अखेरीस थांबतात, तर tape June 2026पर्यंत आहे. त्यामुळे horizon panelमधील प्रत्येक gapनंतर किमान sixty sessions उपलब्ध आहेत. Data उपलब्ध नसल्यामुळे कोणताही gap unfilled म्हणून मोजलेला नाही.
तिसऱ्या panelमधील normal volume हा gapच्या दोन दिवस आधी संपणाऱ्या 20 sessionsमधील average regular-session volume आहे. त्यामुळे gap day आणि त्याच्या आधीचा दिवस त्यांच्या स्वतःच्या benchmarkमध्ये समाविष्ट होत नाही.
Basketमध्ये आठ liquid large caps आहेत. कमी liquidity असलेल्या namesमध्ये gaps अधिक वेळा पडतात आणि ते वेगळ्या पद्धतीने भरतात. त्यामुळे त्यांच्यावर हीच चाचणी पुन्हा केल्याशिवाय हे rates small capsना लागू होत नाहीत.
येथील प्रत्येक panelखाली exact SQL दिलेले आहे. तुम्ही follow करत असलेल्या tickerवर हीच चाचणी चालवण्यासाठी Strasmore terminalवर plain Englishमध्ये प्रश्न विचारा.