کیا stock gaps ہمیشہ fill ہوتے ہیں؟ ڈیٹا کیا کہتا ہے
stock gaps کسی مقررہ مدت میں ہمیشہ fill نہیں ہوتے۔ large caps کے same session، 5، 20 اور 60 session fill rates، اور پسِ پردہ SQL دیکھیں۔
کیا stock gaps ہمیشہ fill ہو جاتے ہیں؟ اتنے مختصر کسی بھی قابلِ تجارت horizon میں نہیں کہ اس پر عملی فیصلہ کیا جا سکے، اور یہ دعویٰ زیادہ تر اسی وقت قائم رہتا ہے جب کوئی horizon بیان نہ کرے۔ Gap آج کے open اور کل کے regular-session close کے درمیان فاصلہ ہے، جبکہ fill وہ لمحہ ہے جب price دوبارہ اس سابقہ close کے پار trade کرے۔ پوری بحث کا دارومدار اس بات پر ہے کہ قاری اس کے لیے کتنے عرصے تک انتظار کرنے کو تیار ہے۔
Gap کسے کہتے ہیں، اور fill کسے
Gap کی پیمائش open کو سابقہ close کے مقابل رکھ کر کی جاتی ہے۔ کل کا session ایک price پر ختم ہوا، آج کا open دوسری price پر ہوا، اور دونوں کے درمیان فرق gap ہے۔ یہ کل کے intraday high یا low سے فاصلہ نہیں ہوتا۔ وہ ایک مختلف اور کہیں آسان target ہے۔ دونوں کو بدل دینا ہی وہ طریقہ ہے جس سے ایک "gap" خاموشی سے ایسا gap بن جاتا ہے جو کسی بھی معمول کے دن دوپہر کے کھانے تک close ہو جاتا ہے۔ چھوٹے gaps تقریباً ہر session میں نظر آتے ہیں: دوسرے time zones میں trading، index changes، single-name news اور ex-dividend adjustments، یہ سب US market بند ہونے کے دوران fair price کو بدل دیتے ہیں۔ Stocks رات بھر gap کیوں کرتے ہیں میں بتایا گیا ہے کہ یہ overnight repricing کہاں سے آتی ہے۔
Fill وہ پہلا لمحہ ہے جب stock دوبارہ سابقہ closing price کے پار trade کرے۔ کسی deadline کے بغیر یہ definition نامکمل ہے۔ لامحدود horizon میں ایک liquid stock کسی بھی بتائی گئی level کو کسی نہ کسی وقت cross کر سکتا ہے۔ اس لیے "gaps ہمیشہ fill ہوتے ہیں" سچ ہونے کے بجائے ناقابلِ تردید دعویٰ بن جاتا ہے۔ ذیل کا ہر number ایک واضح horizon کے ساتھ دیا گیا ہے۔
اس پورے صفحے میں ایک ہی sample استعمال کیا گیا ہے: آٹھ large-cap US stocks، January 2021 سے February 2026 تک کے gap days، اور fills کو regular-session one-minute highs اور lows کے مقابل test کیا گیا ہے۔ 0.25% سے کم gaps کو rounding کی وجہ سے خارج کر دیا گیا ہے۔
کیا stock gaps ہمیشہ اسی دن fill ہو جاتے ہیں؟
آغاز size سے کریں۔ ہر gap کو اس کے size کے مطابق group کریں، پھر دیکھیں کہ اسی session کے اختتام سے پہلے prior close دوبارہ touch ہوا یا نہیں۔
ہر عدد کے پیچھے موجود درست 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) ASCSample میں سب سے چھوٹے gaps، یعنی 0.25% سے 0.5% تک، 74.6% مواقع پر اسی session میں close ہوئے، اور ایسے واقعات کی تعداد 2381 تھی۔ 4% یا اس سے بڑے gaps 14.8% مواقع پر اسی session میں close ہوئے۔ Chart میں نیچے کی طرف جاتا ہوا slope زیادہ تر سبق بیان کرتا ہے: gap جتنا چھوٹا ہو، stock دن کے دوران اتنی ہی زیادہ مرتبہ اس کے پار واپس آتا ہے۔ دوسرے الفاظ میں، چھوٹے gaps noise ہوتے ہیں اور noise عموماً reverse ہوتی ہے۔
Gap کو fill ہونے میں کتنا وقت لگتا ہے؟
Deadline بڑھانے سے fill rate صرف بڑھ سکتی ہے۔ ایک طویل window مزید fills شامل کرتی ہے، انہیں ختم نہیں کرتی۔ اصل سوال یہ ہے کہ total میں سے کتنا حصہ اتنی دیر سے آتا ہے کہ عملی طور پر بے فائدہ ہو جاتا ہے۔
ہر عدد کے پیچھے موجود درست 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 کے اندر fill ہوئے، جبکہ 88.7% 60 sessions کے اندر fill ہو چکے تھے۔ عموماً دوسرا figure ہی quote کیا جاتا ہے، مگر horizon نہیں بتایا جاتا۔ ساٹھ sessions تقریباً تین trading months کے برابر ہیں۔ یہ ایک one-day dislocation پر مبنی position کے لیے طویل holding period ہے۔ اگر stock پہلے مخالف سمت میں کافی دور جا چکا ہو اور day 47 پر gap fill کرے، تب بھی اس statistic میں اسے filled شمار کیا جاتا ہے۔
Noise gaps اور information gaps دو الگ populations ہیں
پرسکون دن، معمول کے volume کے ساتھ بننے والا gap ایک چھوٹی pricing adjustment ہوتا ہے۔ Earnings news یا takeover approach کے بعد بننے والا gap اس بات میں تبدیلی کی نمائندگی کرتا ہے کہ company کی worth کتنی ہے۔ ایسی صورت میں واپس آنے کے لیے کوئی پرانی price باقی نہیں رہتی۔ Volume دونوں کو مناسب حد تک الگ کر دیتا ہے: جب پورا market repricing کو trade کرنا چاہتا ہو تو prints معمول کے turnover سے کئی گنا زیادہ ہوتے ہیں۔
ہر عدد کے پیچھے موجود درست 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) ASC1% یا اس سے بڑے gaps، جن کا volume stock کے معمول کے turnover سے 1.5 گنا کم تھا، 35.9% مواقع پر اسی session میں fill ہوئے۔ اسی size کے gaps، جن کا volume معمول کے turnover سے تین گنا یا اس سے زیادہ تھا، 15.3% مواقع پر اسی session میں fill ہوئے، اور 45.8% gaps 20 sessions کے اندر fill ہوئے۔ یہ results 59 gaps پر مبنی تھے۔ Heavy-volume group میں earnings gaps اور deal gaps شامل ہیں۔ دونوں groups کا average لے کر ایک number نکالنا کسی ایک group کی درست تصویر پیش نہیں کرتا۔
Session کے ابتدائی minutes gap statistics کو کیوں distort کرتے ہیں
9:31 a.m. پر record کیا گیا fill کمزور بنیاد رکھتا ہے۔ Opening price ایک auction سے نکلتی ہے، یعنی overnight queued orders کے لیے ایک single batched cross جو سب orders کے لیے ایک price مقرر کرتا ہے۔ ہمارے opening auction explainer میں اس mechanism کی وضاحت کی گئی ہے۔ اس cross کے فوراً بعد کے minutes میں quoted spreads دن کی بلند ترین سطح پر ہوتے ہیں، اور ایک چھوٹا print ایسا high یا low درج کر سکتا ہے جس پر کوئی قابلِ ذکر size trade ہی نہ ہوئی ہو۔ Open پر spreads کیوں وسیع ہو جاتے ہیں میں بتایا گیا ہے کہ وہاں quote اتنا thin کیوں ہوتا ہے۔
نیچے دیا گیا chart basket کی اپنی tape پر اس pattern کو دکھاتا ہے: 2025 تک، ہر 15-minute clock bucket کے لیے average one-minute high-low range basis points میں۔ ایک basis point، percent کا one hundredth ہوتا ہے۔
ہر عدد کے پیچھے موجود درست 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 میں ہر minute range اوسطاً 24.4 bps رہی، جبکہ 12:30 bucket میں 6.9 bps تھی۔ اس دوران فی minute volume بالترتیب 303.9 thousand shares اور 69.6 thousand shares رہا۔ پہلے bucket کے اندر درج کیا گیا fill دن کی کم ترین reliability رکھنے والی prices پر مبنی ہوتا ہے۔ اوپر دیے گئے same-session numbers میں یہ minutes شامل ہیں۔ اس سے figures کچھ زیادہ ہو سکتے ہیں۔ یہی caveat اس سمیت ہر same-day fill statistic پر لاگو ہوتا ہے۔
Gap کو trade سمجھنے سے پہلے کیا check کرنا چاہیے
- Horizon۔ Deadline کے بغیر fill rate کوئی statistic نہیں۔
- Population۔ یہ دیکھیں کہ news gaps کو quiet gaps سے الگ کیا گیا تھا یا نہیں، اور یہ تقسیم کس بنیاد پر کی گئی۔
- Measurement۔ یہ دیکھیں کہ fills کو حقیقی traded ranges کے مقابل test کیا گیا تھا یا نہیں، اور session کے ابتدائی minutes شامل تھے یا نہیں۔
- Survivors۔ یہ دیکھیں کہ sample میں صرف وہ stocks تو شامل نہیں جو آج بھی trade کر رہے ہیں۔ ایسا کرنا خاموشی سے ان gaps کو خارج کر دیتا ہے جو کبھی fill نہیں ہوئے۔
اس دعوے کی دیانت دار شکل slogan سے کہیں محدود ہے۔ معمول کے volume والے چھوٹے gaps اکثر اور تیزی سے revert کرتے ہیں۔ Heavy volume والے بڑے gaps repricing ہوتے ہیں اور اکثر کئی months تک برقرار رہتے ہیں۔ کون سے names اس وقت gap کر رہے ہیں، اس کی live view کے لیے اس ہفتے کے سب سے بڑے stock movers کا صفحہ موجودہ week کو track کرتا ہے، جبکہ markets crashes سے کیسے recover کرتے ہیں index drawdowns پر یہی horizon discipline لاگو کرتا ہے۔
FAQ
کیا stock gaps ہمیشہ fill ہو جاتے ہیں؟
نہیں۔ یہاں کے sample میں 1% یا اس سے بڑے gaps میں سے 88.7% gaps نے 60 sessions کے اندر prior close کو دوبارہ cross کیا۔ اس کا مطلب ہے کہ تقریباً تین trading months کے بعد بھی ان کا ایک حقیقی حصہ unfilled رہا۔ "Always" والا دعویٰ صرف اسی وقت درست دکھائی دیتا ہے جب کوئی time limit نہ لگائی جائے۔ اس مرحلے پر وہ testable نہیں رہتا۔
Gap کو fill ہونے میں کتنا وقت لگتا ہے؟
یہ gap پر منحصر ہے۔ یہاں 1% یا اس سے بڑے gaps میں سے 34% اسی session کے اندر fill ہوئے، جبکہ باقی fills اگلے weeks اور months میں آئے۔ چھوٹے gaps same-day bucket میں زیادہ concentrated ہیں، جبکہ heavy-volume gaps سب سے سست رفتاری سے fill ہوتے ہیں۔
Common gap اور breakaway gap میں کیا فرق ہے؟
Chart vocabulary gaps کو ان کے context کے مطابق تقسیم کرتی ہے۔ Common gap معمول کے دن، معمول کے volume اور کسی specific news کے بغیر open ہوتا ہے۔ Breakaway gap heavy volume کے ساتھ نئی information کے بعد open ہوتا ہے، اکثر ایسی price range سے باہر جس میں stock کچھ عرصے سے trade کر رہا ہو۔ اوپر والے panel میں volume split اسی distinction کا measurable version ہے۔
مختلف sources کے gap fill statistics میں اتنا فرق کیوں ہوتا ہے؟
چار choices number کو بہت بدل دیتی ہیں: fill horizon، stocks کا basket، شامل کیا گیا period، اور یہ کہ gap کو prior close سے measure کیا گیا یا prior high اور low سے۔ اگر quoted fill rate میں ان چار میں سے کوئی ایک چیز غائب ہو تو اسے دوسرے fill rate کے ساتھ compare نہیں کیا جا سکتا۔
یہ numbers کیسے measure کیے گئے
Sessions کو New York time کے regular trading hours کے one-minute bars سے بنایا گیا ہے۔ Opening price پہلے regular-session bar کا open ہے، close آخری bar کا close ہے، جبکہ day's high اور low انہی bars کی extremes ہیں۔ ہر gap کو اسی ticker کے previous session close کے مقابل measure کیا گیا ہے۔
5، 20 اور 60 session horizons میں gap day خود بھی شامل ہے۔ Gap days February 2026 کے اختتام پر رک جاتے ہیں، جبکہ tape June 2026 تک جاری رہتی ہے۔ اس لیے horizon panel میں ہر gap کے لیے کم از کم ساٹھ بعد کے sessions دستیاب ہیں، اور کسی gap کو data کی کمی کی وجہ سے unfilled شمار نہیں کیا گیا۔
Third panel میں normal volume، gap سے دو دن پہلے ختم ہونے والے 20 sessions کے regular-session volume کا average ہے۔ اس طرح gap day اور اس سے ایک دن پہلے کا volume اپنے ہی benchmark میں شامل نہیں ہوتا۔
Basket میں آٹھ liquid large caps شامل ہیں۔ Thinly traded names زیادہ مرتبہ gap کرتے ہیں اور ان کے fills مختلف ہوتے ہیں۔ اس لیے ان rates کو small caps پر براہِ راست لاگو نہیں کیا جا سکتا، جب تک ان پر یہی test دوبارہ نہ چلایا جائے۔
یہاں موجود ہر panel کے نیچے exact SQL بھی دیا گیا ہے۔ جس ticker کو آپ follow کرتے ہیں، اس پر یہی test چلانے کے لیے Strasmore terminal میں سوال plain English میں لکھیں۔