স্টকের gap কি সবসময় fill হয়? তথ্য দেখুন
স্টকের gap কোনো নির্দিষ্ট সময়সীমায় সবসময় fill হয় না। large-cap শেয়ারে একই session, 5, 20 ও 60 session-এর fill rate এবং এর পেছনের SQL দেখুন।
স্টকের gap কি সবসময় fill হয়? ট্রেড করার মতো যথেষ্ট সংক্ষিপ্ত কোনো সময়সীমায় নয়। এই দাবি মূলত তখনই টিকে থাকে, যখন কেউ নির্দিষ্ট সময়সীমা উল্লেখ না করে। Gap হলো আজকের opening price এবং গতকালের regular-session close-এর মধ্যকার দূরত্ব। Fill হলো সেই মুহূর্ত, যখন দাম আগের closing price অতিক্রম করে আবার লেনদেন হয়। পুরো বিতর্কটি নির্ভর করে পাঠক কতদিন অপেক্ষা করতে রাজি তার ওপর।
Gap হিসেবে কী গণ্য হয়, আর fill হিসেবে কী গণ্য হয়
Gap মাপা হয় opening price এবং আগের closing price-এর তুলনায়। গতকালের session এক দামে শেষ হয়েছে, আজকের session অন্য দামে খুলেছে, আর এই দুই দামের পার্থক্যই gap। এটি গতকালের intraday high বা low থেকে মাপা দূরত্ব নয়। সেটি ভিন্ন এবং অনেক সহজ একটি target। দুটিকে এক করে ফেললেই “gap” এমন কিছুতে পরিণত হয়, যা সাধারণ দিনে দুপুরের খাবারের আগেই বন্ধ হয়ে যায়। প্রায় প্রতিটি session-এই ছোট gap দেখা যায়। অন্যান্য time zone-এ লেনদেন, index-এর পরিবর্তন, নির্দিষ্ট কোম্পানির খবর এবং ex-dividend adjustment—এসবের কারণে US market বন্ধ থাকার সময় fair price বদলে যায়। কেন শেয়ারে overnight gap তৈরি হয়-এ এই overnight repricing-এর উৎস ব্যাখ্যা করা হয়েছে।
Fill হলো প্রথম সেই মুহূর্ত, যখন শেয়ারের দাম আগের closing price অতিক্রম করে আবার লেনদেন হয়। তবে এর সঙ্গে একটি deadline না জুড়লে সংজ্ঞাটি অসম্পূর্ণ থাকে। সীমাহীন সময়ের মধ্যে কোনো liquid stock পাঠক উল্লেখ করা প্রায় যেকোনো price level অতিক্রম করতে পারে। ফলে “gap সবসময় fill হয়” কথাটি সত্য না হয়ে unfalsifiable হয়ে যায়। নিচের প্রতিটি সংখ্যার সঙ্গে একটি নির্দিষ্ট সময়সীমা দেওয়া আছে।
এই পুরো পৃষ্ঠায় একই sample ব্যবহার করা হয়েছে: আটটি large-cap US stock, January 2021 থেকে February 2026 পর্যন্ত gap day, এবং regular-session এক মিনিটের high ও low দিয়ে fill পরীক্ষা করা হয়েছে। 0.25%-এর কম gap rounding-এর কারণে বাদ দেওয়া হয়েছে।
স্টকের gap কি একই session-এ সবসময় fill হয়?
প্রথমে gap-এর আকার দেখুন। প্রতিটি gap-কে তার আকার অনুযায়ী ভাগ করুন। তারপর দেখুন, সেই একই session শেষ হওয়ার আগে আগের closing price আবার স্পর্শ করা হয়েছিল কি না।
প্রতিটি সংখ্যার পেছনের সঠিক 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-এ সবচেয়ে ছোট gap, অর্থাৎ 0.25% থেকে 0.5%, একই session-এ 74.6% সময় বন্ধ হয়েছে, মোট 2381টি occurrence-এর মধ্যে। 4% বা তার বেশি gap একই session-এ 14.8% সময় বন্ধ হয়েছে। Chart-এর নিম্নমুখী slope-ই মূল বিষয়টি দেখায়: gap যত ছোট, দিনের মধ্যে stock তত বেশি সেটি অতিক্রম করে ফিরে আসে। অন্যভাবে বললে, ছোট gap হলো noise, আর noise সাধারণত বিপরীত দিকে ফিরে যায়।
একটি gap fill হতে কত সময় লাগে?
Deadline বাড়ালে fill rate কেবল বাড়তেই পারে। দীর্ঘ সময়সীমা নতুন fill যোগ করে, কোনো fill বাদ দেয় না। প্রশ্ন হলো, মোট fill-এর কত অংশ এত দেরিতে আসে যে তা আর ব্যবহারিকভাবে কার্যকর থাকে না।
প্রতিটি সংখ্যার পেছনের সঠিক 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% বা তার বেশি gap-এর 2191টির মধ্যে 34% একই session-এ fill হয়েছে এবং 88.7%টি 60 sessions-এর মধ্যে fill হয়েছে। দ্বিতীয় সংখ্যাটিই সাধারণত উদ্ধৃত করা হয়, কিন্তু সময়সীমাটি বাদ পড়ে যায়। ষাটটি session প্রায় তিনটি trading month-এর সমান। এক দিনের dislocation-কে ভিত্তি করে নেওয়া position-এর জন্য এটি দীর্ঘ holding period। কোনো gap যদি 47তম দিনে fill হয়, অথচ তার আগে stock অনেক দূর বিপরীত দিকে চলে যায়, তবুও এই পরিসংখ্যানে সেটি filled হিসেবেই গণ্য হয়।
Noise gap এবং information gap হলো দুটি পৃথক population
কম activity-র দিনে, স্বাভাবিক volume-এ তৈরি gap হলো ছোট একটি pricing adjustment। Earnings news বা takeover approach-এর কারণে তৈরি gap কোম্পানিটির মূল্য সম্পর্কে নতুন তথ্য বহন করে। তখন ফিরে যাওয়ার মতো আগের price আর নাও থাকতে পারে। Volume এই দুই ধরনের gap-কে মোটামুটি ভালোভাবে আলাদা করে। পুরো market যে 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) ASCStock-এর স্বাভাবিক turnover-এর 1.5 গুণের কম volume-এ তৈরি 1% বা তার বেশি gap একই session-এ 35.9% সময় fill হয়েছে। স্বাভাবিক volume-এর 3 গুণ বা তার বেশি volume-এ একই আকারের gap একই session-এ 15.3% সময় fill হয়েছে এবং 59টির মধ্যে 45.8%টি 20টি session-এর মধ্যে fill হয়েছে। উচ্চ-volume group-এই earnings gap এবং deal gap রয়েছে। দুটি group-এর গড় করে একটি সংখ্যা দিলে কোনো group-কেই সঠিকভাবে বর্ণনা করা হয় না।
কেন session-এর প্রথম কয়েক মিনিট gap-এর পরিসংখ্যানকে বিকৃত করে
9:31 a.m.-এ recorded হওয়া একটি fill নির্ভরযোগ্য নাও হতে পারে। Opening price একটি auction থেকে আসে। Overnight জমা হওয়া সব order-এর জন্য একটি price নির্ধারণকারী একক batched cross-এর মাধ্যমে এটি তৈরি হয়। আমাদের opening auction explainer-এ প্রক্রিয়াটি ব্যাখ্যা করা হয়েছে। সেই cross-এর পরের কয়েক মিনিটে quoted spread দিনের মধ্যে সবচেয়ে প্রশস্ত থাকে। একটি ছোট print এমন high বা low তৈরি করতে পারে, যে price level-এ বাস্তবে উল্লেখযোগ্য কোনো size লেনদেন হয়নি। open-এ spread কেন প্রশস্ত হয়-এ এই সময়ে quote কেন এত thin থাকে তা ব্যাখ্যা করা হয়েছে।
নিচের chart-এ basket-এর নিজস্ব tape-এ এই pattern দেখা যায়। 2025 পর্যন্ত প্রতি 15 মিনিটের clock bucket-এ গড় এক মিনিটের high-low range basis point-এ দেখানো হয়েছে। এক 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। প্রতি মিনিটে share volume যথাক্রমে 303.9 thousand এবং 69.6 thousand। প্রথম bucket-এর মধ্যে recorded হওয়া fill দিনের সবচেয়ে কম নির্ভরযোগ্য price-এর ওপর নির্ভর করে। উপরের same-session সংখ্যাগুলোর মধ্যে এই মিনিটগুলোও রয়েছে। ফলে সংখ্যাগুলো কিছুটা বেশি হতে পারে। এই সতর্কতাটি এই পরিসংখ্যানসহ প্রতিটি same-day fill statistic-এর ক্ষেত্রেই প্রযোজ্য।
Gap-কে trade হিসেবে বিবেচনা করার আগে কী পরীক্ষা করবেন
- সময়সীমা। কোনো deadline ছাড়া fill rate আসলে statistic নয়।
- Population। News gap-কে quiet gap থেকে আলাদা করা হয়েছিল কি না এবং বিভাজনের সীমা কীভাবে নির্ধারণ করা হয়েছিল।
- Measurement। বাস্তবে লেনদেন হওয়া range দিয়ে fill পরীক্ষা করা হয়েছিল কি না এবং session-এর প্রথম কয়েক মিনিট অন্তর্ভুক্ত ছিল কি না।
- Survivors। Sample-এ কেবল আজও লেনদেন হওয়া stock রাখা হয়েছে কি না। হলে যেসব gap কখনও fill হয়নি, সেগুলো নীরবে বাদ পড়ে যায়।
এই দাবিটির সঠিক রূপ slogan-এর চেয়ে সংকীর্ণ। স্বাভাবিক volume-এ তৈরি ছোট gap প্রায়ই দ্রুত revert করে। উচ্চ volume-এ তৈরি বড় gap হলো repricing, যা প্রায়ই কয়েক মাস স্থায়ী হয়। কোন কোন নাম বর্তমানে gap করছে তা দেখতে এই সপ্তাহের সবচেয়ে বড় stock mover পৃষ্ঠাটি চলতি সপ্তাহের তথ্য অনুসরণ করে। আর বাজার কীভাবে crash থেকে ঘুরে দাঁড়ায় index drawdown-এর ক্ষেত্রে একই সময়সীমা-ভিত্তিক বিশ্লেষণ প্রয়োগ করে।
FAQ
স্টকের gap কি সবসময় fill হয়?
না। এই sample-এ 1% বা তার বেশি gap-এর 88.7%টি 60 sessions-এর মধ্যে আগের closing price অতিক্রম করে ফিরে এসেছে। অর্থাৎ প্রায় তিনটি trading month পরেও একটি উল্লেখযোগ্য অংশ unfilled রয়ে গেছে। “সবসময়” কথাটি কেবল তখনই কাজ করে, যখন কোনো সময়সীমা নির্ধারণ করা হয় না। সে ক্ষেত্রে দাবিটি আর পরীক্ষা করা যায় না।
একটি gap fill হতে কত সময় লাগে?
Gap-এর ওপর তা নির্ভর করে। এখানে 1% বা তার বেশি gap-এর 34%টি একই session-এ fill হয়েছে। বাকি fill পরবর্তী সপ্তাহ ও মাসজুড়ে এসেছে। ছোট gap একই দিনের bucket-এ বেশি দেখা যায়। উচ্চ-volume gap সবচেয়ে ধীরে fill হয়।
Common gap এবং breakaway gap-এর মধ্যে পার্থক্য কী?
Chart-এর পরিভাষায় gap-কে তার context অনুযায়ী ভাগ করা হয়। Common gap সাধারণ volume ও কোনো নির্দিষ্ট news ছাড়া একটি স্বাভাবিক দিনে তৈরি হয়। Breakaway gap heavy volume-এর সঙ্গে নতুন তথ্য আসার সময় তৈরি হয়। প্রায়ই এটি এমন একটি price range-এর বাইরে খোলে, যেখানে stock কিছু সময় ধরে লেনদেন করছিল। উপরের panel-এর volume split এই একই পার্থক্যের একটি পরিমাপযোগ্য রূপ।
বিভিন্ন source-এ gap fill statistic এত আলাদা হয় কেন?
চারটি সিদ্ধান্ত সংখ্যাটিকে ব্যাপকভাবে বদলে দেয়: fill-এর সময়সীমা, stock-এর basket, অন্তর্ভুক্ত সময়কাল, এবং gap আগের closing price থেকে মাপা হয়েছে নাকি আগের high ও low থেকে। এই চারটির কোনো একটি অনুপস্থিত থাকলে উদ্ধৃত fill rate-কে অন্য fill rate-এর সঙ্গে তুলনা করা যায় না।
এই সংখ্যাগুলো কীভাবে মাপা হয়েছে
New York time অনুযায়ী regular trading hours-এর এক মিনিটের bar ব্যবহার করে session তৈরি করা হয়েছে। Opening price হলো প্রথম regular-session bar-এর open। Close হলো শেষ bar-এর close। দিনের high ও low হলো ওই bar-গুলোর সর্বোচ্চ ও সর্বনিম্ন price। প্রতিটি gap একই ticker-এর আগের session-এর close-এর তুলনায় মাপা হয়েছে।
5, 20 এবং 60 session-এর সময়সীমায় gap day-টিকেও অন্তর্ভুক্ত করা হয়েছে। Gap day February 2026-এর শেষে থেমেছে, কিন্তু tape June 2026 পর্যন্ত নেওয়া হয়েছে। ফলে horizon panel-এর প্রতিটি gap-এর জন্য অন্তত 60টি পরবর্তী session available রয়েছে। তথ্যের অভাবে কোনো gap-কে unfilled হিসেবে গণনা করা হয়নি।
তৃতীয় panel-এ normal volume হলো gap-এর দুই দিন আগে শেষ হওয়া 20টি session-এর regular-session volume-এর গড়। এর ফলে gap day এবং তার আগের দিন নিজেদের benchmark-এর মধ্যে অন্তর্ভুক্ত হয়নি।
Basket-এ আটটি liquid large-cap stock রয়েছে। কম liquid নামের gap হওয়ার প্রবণতা বেশি এবং সেগুলোর fill-এর ধরনও আলাদা। তাই একই test পুনরায় না চালিয়ে এই rate-গুলো small-cap stock-এ প্রয়োগ করা যায় না।
এখানে প্রতিটি panel-এর নিচে সঠিক SQL দেওয়া আছে। আপনি যে ticker অনুসরণ করেন, সেটিতে একই test চালাতে Strasmore terminal-এ plain English-এ প্রশ্নটি লিখুন।