آیا گپهای قیمتی سهام همیشه پر میشوند؟ تحلیل دادهها
آیا گپهای قیمتی سهام همیشه پر میشوند؟ بررسی نرخ پر شدن گپ در بازههای زمانی 5، 20 و 60 روزه برای شرکتهای بزرگ به همراه کدهای SQL برای تحلیل دقیق الگوهای معاملاتی.
آیا گپهای قیمتی سهام همیشه پر میشوند؟ نه در بازه زمانی کوتاهی که برای معامله مناسب باشد؛ این ادعا تنها زمانی پابرجا میماند که کسی بازه زمانی مشخصی برای آن تعیین نکند. گپ، فاصله میان قیمت بازگشایی امروز و قیمت بسته شدن جلسه معاملاتی عادی دیروز است. پر شدن گپ (Fill) لحظهای است که قیمت دوباره از آن قیمت بسته شدن قبلی عبور میکند. کل این بحث به این بستگی دارد که خواننده تا چه حد مایل است برای وقوع آن منتظر بماند.
چه چیزی گپ محسوب میشود و چه چیزی پر شدن گپ؟
گپ با مقایسه قیمت بازگشایی با قیمت بسته شدن قبلی اندازهگیری میشود. جلسه دیروز با یک قیمت پایان یافته و امروز با قیمتی دیگر آغاز شده است؛ این تفاوت همان گپ است. این فاصله، فاصله از بالاترین یا پایینترین قیمت روزانه دیروز نیست. آن یک هدف متفاوت و بسیار سادهتر است و جابهجایی این دو مفهوم باعث میشود که یک «گپ» بهآرامی به چیزی تبدیل شود که در هر روز عادی تا زمان ناهار بسته میشود. گپهای کوچک تقریباً در هر جلسه معاملاتی ظاهر میشوند: معاملات در مناطق زمانی دیگر، تغییرات شاخص، اخبار مربوط به تکسهمها و تعدیلهای مربوط به تاریخ بدون سود (ex-dividend)، همگی باعث تغییر قیمت منصفانه در زمانی میشوند که بازار ایالات متحده تعطیل است. مطلب چرا سهام در طول شب گپ میخورند به منشأ این قیمتگذاری مجدد شبانه میپردازد.
پر شدن گپ، اولین لحظهای است که سهم دوباره از قیمت بسته شدن قبلی عبور میکند. این تعریف بدون تعیین یک مهلت زمانی، ناقص است. در یک بازه زمانی نامحدود، هر سهم نقدشوندهای در نهایت از هر سطحی که خواننده نام ببرد عبور میکند، که این امر گزاره «گپها همیشه پر میشوند» را به جای «درست بودن»، «ابطالناپذیر» میکند. تمامی اعداد زیر دارای یک بازه زمانی مشخص هستند.
یک نمونه در سراسر این صفحه بررسی شده است: هشت سهم بزرگ (Large-cap) ایالات متحده، روزهای دارای گپ از ژانویه 2021 تا فوریه 2026، با تست پر شدن گپها در برابر بالاترین و پایینترین قیمتهای یکدقیقهای در جلسات عادی. گپهای کمتر از 0.25 درصد به دلیل گرد کردن اعداد حذف شدهاند.
آیا گپهای سهام همیشه در همان روز پر میشوند؟
با اندازه گپ شروع کنید. هر گپ را بر اساس بزرگی آن دستهبندی کنید، سپس بررسی کنید که آیا قیمت بسته شدن قبلی قبل از پایان همان جلسه دوباره لمس شده است یا خیر.
کد دقیق 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کوچکترین گپهای موجود در نمونه، یعنی 0.25 تا 0.5 درصد، در 74.6% از موارد در همان جلسه پر شدند (در میان 2381 رخداد). گپهای 4 درصد یا بیشتر در 14.8% از موارد در همان جلسه پر شدند. شیب نزولی نمودار، بخش اصلی درس را نشان میدهد: هرچه گپ کوچکتر باشد، سهم در طول روز بیشتر در اطراف آن نوسان میکند؛ این یعنی گپهای کوچک صرفاً نویز هستند و نویزها بازگشتپذیرند.
پر شدن یک گپ چقدر زمان میبرد؟
با افزایش مهلت زمانی، نرخ پر شدن گپ تنها میتواند افزایش یابد. یک پنجره زمانی طولانیتر، موارد پر شدن را اضافه میکند و هرگز آنها را حذف نمیکند. پرسش اینجاست که چه بخشی از کل موارد، آنقدر دیر رخ میدهد که دیگر کاربردی ندارد.
کد دقیق 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از میان 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گپهای 1 درصد یا بیشتر با حجم معاملات کمتر از 1.5 برابر حجم معمول سهم، در 35.9% از موارد در همان جلسه پر شدند. گپهای با همان اندازه اما با حجم معاملات سه برابر معمول یا بیشتر، در 15.3% از موارد در همان جلسه پر شدند و 45.8% از آنها در عرض 20 جلسه، در میان 59 مورد، پر شدند. گروه با حجم بالا، جایی است که گپهای ناشی از گزارشهای درآمدی و قراردادها قرار دارند. میانگین گرفتن از این دو گروه در یک عدد واحد، توصیفکننده هیچکدام نیست.
چرا دقایق ابتدایی جلسه، آمار گپها را مخدوش میکند
پر شدن گپی که در ساعت 9:31 صبح ثبت میشود، پدیدهای شکننده است. قیمت بازگشایی حاصل یک حراج است؛ یک معامله دستهای واحد که یک قیمت را برای تمام سفارشهای انباشتهشده در طول شب تعیین میکند و مطلب حراج بازگشایی ما، مکانیسم آن را توضیح میدهد. در دقایق پس از آن معامله، اسپردها (Spread) در پهنترین حالت روزانه خود قرار دارند و یک معامله کوچک میتواند بالاترین یا پایینترین قیمتی را ثبت کند که هیچ حجم معاملهای در آن صورت نگرفته است. مطلب پهن شدن اسپردها در زمان بازگشایی توضیح میدهد که چرا قیمتهای اعلامی در آن زمان بسیار ضعیف هستند.
نمودار زیر شکل این وضعیت را در نوار معاملات سبد سهام نشان میدهد: میانگین دامنه نوسان بالا-پایین یکدقیقهای بر حسب واحد پایه (هر واحد پایه یکصدم درصد است)، به تفکیک بازههای زمانی پانزدهدقیقهای، تا پایان سال 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بازه بازگشایی بهطور میانگین دارای 24.4 واحد پایه نوسان در دقیقه است، در حالی که این رقم در بازه 12:30 برابر با 6.9 واحد پایه است؛ با حجم 303.9 هزار سهم در دقیقه در مقابل 69.6 هزار سهم. پر شدن گپی که در آن بازه اول ثبت میشود، بر پایه غیرقابلاعتمادترین قیمتهای روز است. اعداد مربوط به «همان جلسه» در بالا شامل این دقایق هستند که باعث میشود کمی بیش از حد واقعی به نظر برسند؛ این هشدار برای تمام آمارهای پر شدن در همان روز، از جمله همین آمار، صادق است.
پیش از معامله بر اساس گپ، چه مواردی را بررسی کنیم
- بازه زمانی: نرخ پر شدن گپ بدون تعیین مهلت زمانی، آمار محسوب نمیشود.
- جامعه آماری: اینکه آیا گپهای خبری از گپهای آرام جدا شدهاند و این مرز چگونه تعیین شده است.
- اندازهگیری: اینکه آیا پر شدن گپها در برابر دامنههای واقعی معاملهشده تست شدهاند و آیا دقایق ابتدایی جلسه در محاسبات لحاظ شدهاند یا خیر.
- بازماندگان: اینکه آیا نمونه فقط شامل سهامی است که هنوز معامله میشوند یا خیر؛ چرا که این کار بهطور ضمنی گپهایی را که هرگز پر نشدهاند، حذف میکند.
نسخه صادقانه این ادعا، محدودتر از شعار آن است. گپهای کوچک با حجم عادی، اغلب و بهسرعت بازگشت میکنند. گپهای بزرگ با حجم بالا، قیمتگذاریهای مجددی هستند که اغلب ماهها باقی میمانند. برای مشاهده زنده اینکه کدام نمادها در حال گپ خوردن هستند، صفحه بزرگترین تغییرات قیمت سهام در این هفته، هفته جاری را ردیابی میکند و مطلب چگونه بازارها از سقوط بهبود مییابند، همین انضباط بازه زمانی را برای افت شاخصها به کار میگیرد.
پرسشهای متداول
آیا گپهای سهام همیشه پر میشوند؟
خیر. در نمونه اینجا، 88.7% از گپهای 1 درصد یا بیشتر، در عرض 60 sessions دوباره از قیمت بسته شدن قبلی عبور کردند که این یعنی بخش قابلتوجهی از آنها پس از حدود سه ماه معاملاتی همچنان پر نشده باقی میمانند. نسخه «همیشه» تنها زمانی کار میکند که هیچ محدودیت زمانی تعیین نشود، که در آن صورت دیگر قابلتست نخواهد بود.
پر شدن یک گپ چقدر طول میکشد؟
بستگی به گپ دارد. در اینجا، 34% از گپهای 1 درصد یا بیشتر در همان جلسه پر شدند و موارد باقیمانده در طول هفتهها و ماههای بعد پر شدند. گپهای کوچک در بازه همان روز متمرکز هستند و گپهای با حجم بالا، کندترین موارد برای پر شدن هستند.
تفاوت بین گپ معمولی و گپ شکست (Breakaway Gap) چیست؟
واژگان نمودار، گپها را بر اساس زمینه (Context) تقسیم میکنند. یک گپ معمولی در یک روز عادی با حجم عادی و بدون اخبار خاص باز میشود، در حالی که یک گپ شکست با حجم بالا و همراه با اطلاعات جدید، اغلب از یک محدوده قیمتی که سهم مدتی در آن بوده، خارج میشود. تفکیک حجم در پنل بالا، نسخه قابلاندازهگیری از همین تفاوت است.
چرا آمار پر شدن گپها بین منابع مختلف بسیار متفاوت است؟
چهار انتخاب باعث تغییر زیاد در این اعداد میشود: بازه زمانی پر شدن، سبد سهام، دوره زمانی مورد بررسی، و اینکه آیا گپ از قیمت بسته شدن قبلی اندازهگیری شده یا از بالاترین و پایینترین قیمت قبلی. نرخ پر شدنِ نقلشدهای که فاقد هر یک از این چهار مورد باشد، قابل مقایسه با دیگری نیست.
نحوه اندازهگیری این اعداد
جلسات معاملاتی از کندلهای یکدقیقهای در ساعات معاملاتی عادی به وقت نیویورک تشکیل شدهاند. قیمت بازگشایی، قیمت باز شدن اولین کندل جلسه عادی و قیمت بسته شدن، قیمت بسته شدن آخرین کندل است و بالاترین و پایینترین قیمت روز، حد نهایی آن کندلها هستند. هر گپ در برابر قیمت بسته شدن جلسه قبلی همان تیکر (Ticker) اندازهگیری شده است.
بازه زمانی 5، 20 و 60 جلسه شامل خودِ روز گپ نیز میشود. روزهای دارای گپ تا پایان فوریه 2026 متوقف میشوند، در حالی که نوار دادهها تا ژوئن 2026 ادامه دارد؛ بنابراین هر گپ در پنل بازه زمانی، حداقل شصت جلسه بعدی را در دسترس دارد و هیچکدام به دلیل کمبود داده، «پر نشده» تلقی نمیشوند.
حجم معمول در پنل سوم، میانگین حجم جلسات عادی در طول 20 جلسه منتهی به دو روز قبل از گپ است که باعث میشود روز گپ و روز قبل از آن در معیار خودشان لحاظ نشوند.
این سبد شامل هشت سهم بزرگ و نقدشونده است. نمادهای کمنقدشوندهتر، بیشتر گپ میخورند و به شکل متفاوتی پر میشوند؛ بنابراین این نرخها بدون اجرای مجدد همان تست، برای شرکتهای کوچک (Small-cap) قابل تعمیم نیستند.
هر پنل در اینجا با کد SQL دقیق زیر آن ارائه شده است. برای اجرای همان تست روی تیکری که دنبال میکنید، پرسش خود را به زبان ساده در ترمینال Strasmore مطرح کنید.