Strasmore Research

هل تنجح قاعدة البيع في مايو والابتعاد؟

اختبر قاعدة البيع في مايو والابتعاد على موسمي S&P 500 خلال عقدين، وقارن فجوة الصيف بتكلفة تبديل المراكز، ولماذا لا يعني التفوق الموسمي خطة تداول ناجحة.

تُعد قاعدة «البيع في مايو والابتعاد» الأشهر بين القواعد التقويمية في سوق الأسهم: تبيع في نهاية أبريل، وتحتفظ بالنقد طوال الصيف، ثم تعود إلى الشراء في نهاية أكتوبر. وبالقياس إلى أسعار متتبعات S&P 500 من إغلاق أبريل 2005 الأخير حتى إغلاق أبريل 2026 الأخير، يحقق النصف الممتد من نوفمبر إلى أبريل في المتوسط عائداً أعلى من النصف الممتد من مايو إلى أكتوبر. الفارق حقيقي، لكنه أصغر مما توحي به المقولة. كما يحقق نصف السنة الصيفي مكسباً في المتوسط، وهنا تتوقف القاعدة عن كونها خطة تداول فعالة.

ما تقوله القاعدة، وكيف تختبرها

تعود هذه العبارة إلى عادة قديمة في لندن، إذ كان الناس يغادرون المدينة بعد اجتماعات سباقات الربيع ويعودون إليها في الخريف. أما بصيغتها الحديثة القابلة للاختبار، فهي قاعدة تبديل تعتمد على تاريخين. تحتفظ بمؤشر واسع للأسهم من آخر يوم تداول في أكتوبر حتى آخر يوم تداول في أبريل. ولا تحتفظ بأي مراكز خلال الأشهر الستة الأخرى.

يتطلب اختبارها أمرين لا توفرهما المقولة نفسها: سلسلة أسعار وفترة محددة. تستخدم كل الأرقام أدناه SPY، وهو أقدم ETF يتتبع مؤشر S&P 500، مع احتساب الأسعار من أشرطة الدقائق خلال ساعات التداول العادية في جدول global_markets.delayed_stocks_minute_aggs، وذلك من إغلاق آخر يوم تداول في أبريل 2005 حتى إغلاق آخر يوم تداول في أبريل 2026. ويُقصد بعائد الشهر هنا التغير في آخر سعر خلال ساعات التداول العادية مقارنةً بآخر سعر في الشهر السابق، من دون احتساب التوزيعات. وترد التوزيعات في قسم مستقل أدناه، بينما يوضح كيفية قياس العوائد الشهرية سبب اختلاف النتيجة عند إجراء هذا التمييز.

Does sell in May and go away work? The 2005 to 2026 record

الاستعلاممقارنة موسمية لمؤشر S&P 500: من مايو إلى أكتوبر مقابل من نوفمبر إلى أبريل، موسمًا بموسم
استعلام SQL الدقيق وراء كل رقم
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
)
SELECT toYear(apr_m.month_start) AS year,
       round(100 * (toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) - 1), 2) AS may_oct_pct,
       round(100 * (toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) - 1), 2) AS nov_apr_pct
FROM monthly AS apr_m
INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
WHERE toMonth(apr_m.month_start) = 4
ORDER BY year
Run this yourself

Each point pairs one summer with the winter that follows it. The chart holds 21 complete pairs, opening with the summer of 2005 and closing with the winter that ended in April 2026.

The two lines disagree in most individual years and agree in the worst one. Between the end of April and the end of October 2008 the summer half measured -29.81%, the deepest reading in the run. The winter that followed measured -10.03%. A holder who sold that April stepped out of a heavy fall and then stepped back in for the final leg down. The calendar and the damage lined up for only half the trip.

هل تلاشى الفارق الصيفي منذ عام 2015؟

المتوسطات هي جوهر المقولة، والفترة الزمنية هي الأساس الذي تستند إليه تلك المتوسطات. ويقسّم فصل السلسلة عند عام 2015 البيانات إلى نصفين متقاربين في الطول، حُسبا بالطريقة نفسها.

الاستعلامالفجوة الموسمية حسب الحقبة: متوسط عوائد نصف السنة والفارق بينهما
استعلام SQL الدقيق وراء كل رقم
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
pairs AS (
    SELECT toYear(apr_m.month_start) AS season_year,
           toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) - 1 AS may_oct,
           toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) - 1 AS nov_apr
    FROM monthly AS apr_m
    INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
    INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
    WHERE toMonth(apr_m.month_start) = 4
),
tagged AS (
    SELECT may_oct,
           nov_apr,
           arrayJoin(['All seasons 2005-2025',
                      if(season_year <= 2014, 'First half 2005-2014', 'Second half 2015-2025')]) AS era
    FROM pairs
)
SELECT era,
       count() AS season_count,
       round(100 * avg(may_oct), 2) AS avg_may_oct_pct,
       round(100 * avg(nov_apr), 2) AS avg_nov_apr_pct,
       round(100 * (avg(nov_apr) - avg(may_oct)), 2) AS winter_minus_summer_pct,
       countIf(may_oct > 0) AS summers_positive
FROM tagged
GROUP BY era
ORDER BY era
Run this yourself

على مدى جميع المواسم البالغ عددها 21، بلغ متوسط الفترة من مايو إلى أكتوبر 3.88%، في حين بلغ متوسط الفترة من نوفمبر إلى أبريل 6.06%، بفارق قدره 2.18 نقطة مئوية. وهذا الفارق هو كامل الأساس الذي تستند إليه القاعدة. وانظر إلى عمود الصيف بجانبه: فقد أنهى 16 من تلك المواسم الفترة عند مستوى أعلى مما بدأها، ما يعني أن البقاء خارج السوق طوال المتوسط الصيفي فوّت مكسباً، لا خسارة.

ويظهر اختلاف بين النصفين. فقد سجّل الجزء الأسبق فارقاً قدره 4.84 نقطة، بينما سجّل الجزء الأحدث -0.24 نقطة. وتورد الصياغات الشائعة المتداولة فارقاً من دون تحديد السنوات التي تقف وراءه، مع أن السنوات هي جوهر الحجة. فأي إحصاء موسمي هو ادعاء يتعلق بفترة معينة من التاريخ، وتحديد تلك الفترة قرار يتخذه من يعيد تكرار هذا الإحصاء.

هل هو فعلاً تأثير أغسطس وسبتمبر؟

ستة أشهر مقياس واسع وغير دقيق. ويتيح تقسيم السنة إلى أشهر اختبار ما إذا كانت فترة الصيف ضعيفة بانتظام، أم أن جزءاً واحداً منها يتحمل النتيجة بأكملها.

الاستعلاممتوسط عائد مؤشر S&P 500 حسب الشهر الميلادي، من مايو 2005 إلى أبريل 2026
استعلام SQL الدقيق وراء كل رقم
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
month_returns AS (
    SELECT m1.month_start AS month_start,
           100 * (toFloat64(m1.month_close) / toFloat64(m0.month_close) - 1) AS ret_pct
    FROM monthly AS m1
    INNER JOIN monthly AS m0 ON m0.month_start = addMonths(m1.month_start, -1)
)
SELECT formatDateTime(month_start, '%b') AS label,
       count() AS readings,
       round(avg(ret_pct), 2) AS avg_return_pct,
       round(quantileDeterministic(0.5)(ret_pct, cityHash64(month_start)), 2) AS median_return_pct,
       countIf(ret_pct > 0) AS positive_readings
FROM month_returns
GROUP BY label
ORDER BY min(toMonth(month_start))
Run this yourself

يتركز الضعف في سبتمبر. بلغ متوسطه -0.75%، وأنهى العام على ارتفاع في 12 من أصل 21 عاماً، فيما بلغ الوسيط 0.38%. وبلغ متوسط أغسطس 0.28%. أما يوليو، الذي يقع في منتصف الفترة التي يتجنبها البائع، فبلغ متوسطه 2.63%، في حين بلغ متوسط أكتوبر، وهو الشهر الأخير قبل إعادة شراء المركز وفق القاعدة، 0.97%.

ويبدو تأثير هذه الفترة محدوداً: موجة ضعف واحدة في أواخر الصيف، بينما تبدو الأشهر المحيطة بها شبيهة إلى حد كبير ببقية أشهر السنة. والخروج من السوق في نهاية أبريل لتجنب سبتمبر يعني أيضاً تفويت مايو ويونيو ويوليو وأغسطس.

ما التكلفة الفعلية للتبديل

الفارق الموسمي رقم إجمالي. ويجب أن تصمد القاعدة أمام تكاليف تنفيذها.

الاستعلامنمو دولار واحد: الاحتفاظ طوال العام مقابل الاحتفاظ من نوفمبر إلى أبريل فقط
استعلام SQL الدقيق وراء كل رقم
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(close, window_start) AS month_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
pairs AS (
    SELECT toYear(apr_m.month_start) + 1 AS year,
           toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) AS summer_ratio,
           toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) AS winter_ratio
    FROM monthly AS apr_m
    INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)
    INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)
    WHERE toMonth(apr_m.month_start) = 4
)
SELECT year,
       round(exp(sum(log(summer_ratio * winter_ratio)) OVER (ORDER BY year)), 2) AS buy_and_hold_growth,
       round(exp(sum(log(winter_ratio)) OVER (ORDER BY year)), 2) AS winter_only_growth
FROM pairs
ORDER BY year
Run this yourself

نمت دولار واحدة مستثمرة خلال كل موسم، من نهاية أبريل 2005 إلى نهاية أبريل 2026، لتصل إلى $6.21. أما الدولار نفسه إذا بقي في السوق فقط من نوفمبر إلى أبريل، وظل خاملاً بقية العام، فقد نما إلى $3.14. يعرض المساران الأسعار فقط من دون خصم أي تكاليف، ما يعطي قاعدة التبديل أفضل من واقعها. وهذا ما لا يوضحه الرسم البياني:

  • صفقتان كل عام، في كل موسم من المواسم البالغ عددها 21. لا تفرض معظم شركات الوساطة عمولة على تنفيذ الصفقة حالياً. لكن فارق سعر العرض والطلب المدفوع في كل دورة شراء وبيع ليس مجانياً.
  • الضرائب. في الحساب الخاضع للضريبة، تؤدي عملية البيع في أبريل إلى تحقيق أي مكسب تراكم منذ نوفمبر. وبحكم تصميم الاستراتيجية، تستمر فترة الاحتفاظ من نوفمبر إلى أبريل لأقل من عام، ما يضع المكسب ضمن معدلات الضرائب على المكاسب قصيرة الأجل للمستثمر الخاضع للضريبة في الولايات المتحدة.
  • النقد الخامل. يفترض المسار الذي يستثمر في الشتاء فقط أن الأموال الخارجة من السوق لا تحقق أي عائد. لكن المستثمر الفعلي قد يودعها في أداة مناسبة، وتغطي خيارات إيداع النقد الخامل الأدوات التي يستخدمها المستثمرون لذلك.
  • توزيعات الأرباح، التي يقيّمها الجزء التالي من الرسم.
الاستعلامتوزيعات SPY حسب شهر الاستحقاق السابق: ضمن فترة مايو إلى أكتوبر مقابل خارجها
استعلام SQL الدقيق وراء كل رقم
SELECT toYear(ex_dividend_date) AS year,
       round(sumIf(cash_amount, toMonth(ex_dividend_date) >= 5 AND toMonth(ex_dividend_date) <= 10), 3) AS may_oct_dividends_usd,
       round(sumIf(cash_amount, toMonth(ex_dividend_date) < 5 OR toMonth(ex_dividend_date) > 10), 3) AS nov_apr_dividends_usd
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
  AND cash_amount > 0
  AND ex_dividend_date >= toDate('2005-01-01')
  AND ex_dividend_date <= toDate('2025-12-31')
GROUP BY year
ORDER BY year
Run this yourself

تقع تواريخ ex-dividend لسهم SPY في مارس ويونيو وسبتمبر وديسمبر، لذلك يقع اثنان منها ضمن الأشهر الستة التي يظل فيها البائع خارج السوق. في 2025، حملت التوزيعات البالغة $3.592 للسهم الواحد تاريخ ex-dividend بين مايو وأكتوبر، مقابل $3.689 في الأشهر الستة الأخرى. ويتتبع العمودان بعضهما بعضاً عبر الرسم البياني بأكمله. ويؤدي البقاء خارج السوق نصف العام إلى التخلي عن نحو نصف دخل الصندوق كل عام، إضافة إلى أي تغير يطرأ على السعر خلال تلك الأشهر. تاريخ ex-dividend هو الموعد الفاصل الذي يحدد من يحصل على التوزيع.

هناك تكلفة أخرى لا تظهر في أي بند. تأتي عوائد المؤشرات في فترات متجمعة، ويوضح تفويت أفضل أيام التداول أثر غياب عدد قليل من الجلسات في رصيد طويل الأجل. ويمثل الغياب ستة أشهر من كل عام عدداً كبيراً من الجلسات الفائتة. وهذا هو المنطق الحسابي نفسه وراء المتوسط السعري للتكلفة بوصفه انضباطاً يركز على مدة البقاء في السوق بدلاً من محاولة توقيت السوق.

لماذا تستحق قاعدة تقويمية شهيرة الشك

تتيح اثنا عشر شهراً 4,095 طريقة غير فارغة لاختيار مجموعة من الأشهر للاستثمار فيها. وعند البحث في هذه المساحة باستخدام سجل سعري واحد، سيبدو شيء ما لافتاً للنظر. وهذه نتيجة لطبيعة البحث.

تتمتع قاعدة «البيع في مايو» بميزة نزيهة واحدة مقارنةً بقاعدة جرى استخراجها الأسبوع الماضي: فقد كانت مشهورة قبل بدء هذه العينة بوقت طويل، ولذلك تعمل السنوات الواردة في هذه الصفحة كاختبار خارج العينة، لا كنتيجة ملائمة للبيانات. ويُظهر الاختبار فارقاً متواضعاً يتركز في شهر واحد، وترتبط به قاعدة تبديل تتأخر عن استراتيجية الشراء والاحتفاظ خلال الفترة نفسها. يشرح انحياز النظر إلى المستقبل الطرق التي يتعلم بها الاختبار التاريخي إجابته مسبقاً من دون وضوح، وقواعد التقويم هي الحالة النموذجية لذلك: إذ يجري اختيار الأشهر بعد معرفة العوائد.

الأسئلة الشائعة

هل ما زالت استراتيجية البيع في مايو والخروج من السوق فعّالة؟

بالاستناد إلى أسعار SPY من أبريل 2005 حتى أبريل 2026، بلغ متوسط العائد من نوفمبر إلى أبريل 6.06%، مقابل 3.88% من مايو إلى أكتوبر؛ لذلك يظل الفارق الموسمي قائماً في العينة الكاملة. وحققت فترة الصيف أيضاً متوسط مكسب، إذ انتهت 16 من فصول الصيف البالغ عددها 21 على ارتفاع مقارنةً ببدايتها.

ما الأشهر الضعيفة فعلياً؟

تركز الضعف خلال هذه الفترة في سبتمبر، الذي بلغ متوسطه -0.75% وأنهى العام على ارتفاع في 12 من أصل 21 عاماً. أما يوليو، وهو شهر آخر لا تشملُه القاعدة، فبلغ متوسطه 2.63% خلال الفترة نفسها.

هل يتفوق البيع في مايو على الشراء والاحتفاظ؟

ليس خلال هذه العينة. فالدولار الذي جرى الاحتفاظ به بصورة متواصلة منذ نهاية أبريل 2005 نما إلى $6.21 بحلول أبريل 2026، مقابل $3.14 لاستراتيجية التناوب التي تقتصر على فترة الشتاء. ولا تشمل هذه المقارنة تكاليف التداول أو الضرائب أو توزيعات الأرباح.

ماذا يحدث لتوزيعات الأرباح إذا بعت في مايو؟

لا تتوقف تواريخ ex-dividend للصندوق خلال الصيف. ويقع تاريخان من تواريخ ex-dividend الفصلية الأربعة لـSPY ضمن الفترة من مايو إلى أكتوبر، كما أن المستثمر الذي يكون خارج الصندوق في تاريخ ex-dividend لا يحصل على ذلك التوزيع.

هل النمط الموسمي هو نفسه التنبؤ؟

لا. يصف المتوسط التاريخي عبر 21 مواسم ما حدث خلال فترة محددة. وتتباين السنوات الفردية على نطاق واسع حول ذلك المتوسط، كما يوضح الرسم البياني الأول، كما أن اختيار الفترة نفسه قرار منهجي.


كل لوحة هنا عبارة عن استعلام محفوظ مرفق به SQL الخاص به. غيّر رمز التداول، وعدّل الفترة، وتحقق مما إذا كان الفارق الموسمي قائماً على منصة Strasmore الطرفية.

#seasonality#backtesting#sp-500#market-history#quant