Strasmore Research
بررسی عمیق Matt Connorتوسط Matt Connor

آیا فروش در ماه مه و کناره‌گیری جواب می‌دهد؟

قاعده «در ماه مه بفروش و کنار بکش» در دو دهه از دوره‌های S&P 500 آزموده شده است. اندازه شکاف تابستانی و هزینه واقعی این جابه‌جایی را بررسی کنید.

«در ماه مه بفروش و کنار بکش» شناخته‌شده‌ترین قاعده تقویمی در بازار سهام است: در پایان آوریل بفروشید، در طول تابستان نقد بمانید و در پایان اکتبر دوباره خرید کنید. بر اساس قیمت صندوق‌های ردیاب S&P 500، از آخرین قیمت پایانی آوریل 2005 تا آخرین قیمت پایانی آوریل 2026، بازده دوره نوامبر تا آوریل به‌طور میانگین بیشتر از بازده دوره مه تا اکتبر بوده است. این اختلاف واقعی است، اما از آنچه این ضرب‌المثل القا می‌کند کمتر است. دوره تابستانی نیز به‌طور میانگین با رشد همراه بوده است؛ و همین‌جا این قاعده به‌عنوان یک برنامه معاملاتی ناکارآمد می‌شود.

این قاعده چه می‌گوید و چگونه آن را می‌آزمایید

این عبارت از رسم قدیمی لندن می‌آید؛ رسمی که بر اساس آن مردم پس از برگزاری مسابقات اسب‌دوانی بهاری شهر را ترک می‌کردند و در پاییز بازمی‌گشتند. این قاعده در شکل مدرن و قابل‌آزمون خود، یک راهبرد جابه‌جایی با دو تاریخ است. سرمایه‌گذار از آخرین روز معاملاتی اکتبر تا آخرین روز معاملاتی آوریل، شاخصی گسترده از سهام را نگهداری می‌کند. در شش ماه دیگر، هیچ موقعیتی در بازار ندارد.

آزمون این قاعده به دو مورد نیاز دارد که خودِ ضرب‌المثل ارائه نمی‌کند: یک سری قیمتی و یک بازه زمانی مشخص. تمام ارقام زیر بر اساس SPY، قدیمی‌ترین ETF مبتنی بر S&P 500، محاسبه شده‌اند. قیمت‌ها از داده‌های دقیقه‌ای ساعات عادی معاملات در جدول global_markets.delayed_stocks_minute_aggs و از قیمت پایانی نهایی آوریل 2005 تا قیمت پایانی نهایی آوریل 2026 استخراج شده‌اند. بازده ماهانه در اینجا برابر است با قیمت نهایی ساعات عادی معاملات در پایان ماه، در مقایسه با قیمت ماه قبل؛ و فقط تغییر قیمت را نشان می‌دهد. سود سهام در بخش جداگانه‌ای در ادامه بررسی می‌شود و نحوه اندازه‌گیری بازده‌های ماهانه توضیح می‌دهد که چرا این تمایز نتیجه را تغییر می‌دهد.

آیا راهبرد «در ماه مه بفروش و کنار بکش» کار می‌کند؟ کارنامه 2005 تا 2026

پرس‌وجوردیاب 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

هر نقطه، یک تابستان را با زمستان پس از آن جفت می‌کند. این نمودار شامل 21 جفت کامل است؛ از تابستان 2005 آغاز می‌شود و با زمستانی که در آوریل 2026 پایان یافت، خاتمه می‌یابد.

دو خط در بیشتر سال‌ها با یکدیگر اختلاف دارند و در بدترین سال هم‌جهت هستند. از پایان آوریل تا پایان اکتبر، 2008 نیمه تابستانی -29.81% را ثبت کرد؛ عمیق‌ترین افت در این دوره. زمستان پس از آن -10.03% را ثبت کرد. سرمایه‌گذاری که در آن آوریل فروخته بود، از یک ریزش سنگین در پاییز دور ماند و سپس برای بخش پایانی افت دوباره وارد بازار شد. تقویم و زیان فقط در نیمی از این مسیر با یکدیگر هم‌راستا بودند.

آیا شکاف تابستانی از سال 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 به تفکیک ماه تقویمی، از مه ۲۰۰۵ تا آوریل ۲۰۲۶
کد دقیق 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% را داشته است.

اثر این دوره شکل محدودی دارد: یک مقطع ضعیف در اواخر تابستان، در حالی که ماه‌های اطراف آن تفاوت چندانی با سایر ماه‌های تقویم ندارند. خروج از بازار در پایان آوریل برای پشت سر گذاشتن سپتامبر، به معنای از دست دادن ماه‌های مه، ژوئن، ژوئیه و اوت نیز هست.

What the switch actually costs

The seasonal gap is a gross number. A rule has to survive its own frictions.

پرس‌وجورشد یک دلار: نگهداری در سراسر سال در برابر نگهداری فقط از نوامبر تا آوریل
کد دقیق 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

A dollar held through every season from the end of April 2005 grew to $6.21 by the end of April 2026. The same dollar in the market only from November through April, idle the rest of the time, grew to $3.14. Both lines are price only with nothing deducted, which flatters the switching rule. Here is what the chart leaves out.

  • Two trades every year, in every one of the 21 seasons. The ticket is free at most brokers now. The bid ask spread paid on each round trip is not.
  • Tax. In a taxable account the April sale realizes whatever gain built up since November. A November to April holding period runs under a year by construction, which places the gain at short-term rates for a US taxpayer.
  • Idle cash. The winter-only line credits the sidelined money with zero. A real holder would park it, and where to park idle cash covers the instruments people use for that.
  • Dividends, which the next panel prices out.
پرس‌وجوتوزیع‌های 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

SPY's ex-dividend dates land in March, June, September and December, so two of the four fall inside the six months a seller sits out. In 2025, $3.592 per share of distributions carried a May to October ex-date, against $3.689 in the other six months. The two columns track each other across the whole chart. Sitting out half the calendar forgoes roughly half the fund's income every year, on top of whatever the price does in those months. The ex-dividend date is the cutoff that decides who gets paid.

One more cost carries no line item. Index returns arrive in clusters, and missing the best days puts numbers on what a handful of absent sessions does to a long-run balance. Six months out of every year is a lot of absent sessions. That is the same arithmetic behind dollar cost averaging as a discipline about time in the market rather than timing.

چرا یک قاعده مشهور تقویمی شایسته تردید است

دوازده ماه، 4٬095 حالت غیرتهی برای انتخاب مجموعه‌ای از ماه‌ها جهت سرمایه‌گذاری ایجاد می‌کند. اگر این فضای جست‌وجو را با یک سابقه قیمتی تطبیق دهید، حتماً چیزی چشمگیر به نظر می‌رسد. این نتیجه، ویژگی خودِ جست‌وجوست.

قاعده «در ماه مه بفروش» یک مزیت صادقانه نسبت به قاعده‌ای دارد که هفته گذشته از داده‌ها استخراج شده است: این قاعده مدت‌ها پیش از آغاز این نمونه مشهور بود. بنابراین سال‌های این صفحه به‌عنوان آزمونی خارج از نمونه عمل می‌کنند، نه نتیجه‌ای برازش‌شده. این آزمون شکافی محدود را نشان می‌دهد که عمدتاً در یک ماه متمرکز است و به قاعده‌ای برای جابه‌جایی سرمایه مربوط می‌شود؛ قاعده‌ای که در همین بازه از خرید و نگهداری عقب می‌ماند. سوگیری نگاه به آینده روش‌هایی را بررسی می‌کند که یک آزمون پس‌نگر به‌طور پنهانی پاسخ خود را از پیش یاد می‌گیرد. قواعد تقویمی نمونه کلاسیک این مسئله‌اند: ماه‌ها پس از مشخص‌شدن بازده‌ها انتخاب می‌شوند.

پرسش‌های متداول

آیا راهبرد «در ماه مه بفروش و کنار بکش» هنوز کار می‌کند؟

در بازه آوریل 2005 تا آوریل 2026، بازده SPY از نوامبر تا آوریل به‌طور میانگین 6.06% بود؛ در مقابل، بازده آن از مه تا اکتبر 3.88% ثبت شد. بنابراین، شکاف فصلی در کل نمونه همچنان پابرجاست. نیمه تابستان نیز همچنان به‌طور میانگین با رشد همراه بود و 16 از 21 تابستان، این دوره را در سطحی بالاتر از آغاز آن به پایان رساندند.

کدام ماه‌ها واقعاً ضعیف هستند؟

در این بازه، ضعف عمدتاً در سپتامبر متمرکز بود. میانگین بازده این ماه -0.75% بود و سپتامبر در 12 از 21 سال، در سطحی بالاتر به پایان رسید. ژوئیه، که این قاعده نیز از آن صرف‌نظر می‌کند، در همین بازه میانگین 2.63% را ثبت کرد.

آیا فروش در ماه مه از خرید و نگهداری بهتر است؟

در این نمونه، خیر. یک دلار که از پایان آوریل 2005 به‌طور پیوسته نگهداری می‌شد، تا آوریل 2026 به $6.21 می‌رسید؛ در مقابل، ارزش آن در راهبرد جابه‌جایی فصلی و نگهداری فقط در زمستان $3.14 بود. این مقایسه هزینه‌های معاملات، مالیات و سود سهام را در نظر نمی‌گیرد.

اگر در ماه مه بفروشید، چه اتفاقی برای سود سهام می‌افتد؟

تاریخ‌های بدون سود یک صندوق در تابستان متوقف نمی‌شوند. دو مورد از چهار تاریخ فصلی ex-dividend مربوط به SPY در بازه مه تا اکتبر قرار دارند. دارنده‌ای که در تاریخ ex-dividend خارج از صندوق باشد، آن توزیع را دریافت نمی‌کند.

آیا الگوی فصلی همان پیش‌بینی است؟

خیر. میانگین تاریخی در 21 فصل، وضعیت رخ‌داده در یک بازه مشخص را توصیف می‌کند. عملکرد سال‌های مختلف می‌تواند فاصله زیادی با این میانگین داشته باشد؛ همان‌طور که نمودار نخست نشان می‌دهد. خودِ انتخاب بازه نیز یک تصمیم تحلیلی است.


تمامی پنل‌های این صفحه، کوئری‌های ذخیره‌شده‌ای هستند که SQL آن‌ها نیز پیوست شده است. در پایانه Strasmore نماد معاملاتی را تغییر دهید، بازه زمانی را جابه‌جا کنید و بررسی کنید که آیا شکاف فصلی همچنان برقرار می‌ماند.

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