Strasmore Research

Sell in May and Go Away کیا واقعی کام کرتا ہے؟

S&P 500 کے دو عشروں کے seasonal data میں Sell in May and Go Away کو جانچیں، summer gap اور عملی طور پر اس switching rule کی لاگت دیکھیں۔

Sell in May and go away stock market کا سب سے معروف calendar rule ہے: April کے آخر میں فروخت کریں، گرمیوں کے دوران cash میں رہیں، اور October کے آخر میں دوبارہ خریداری کریں۔ April 2005 کی آخری closing سے April 2026 کی آخری closing تک S&P 500 tracker کی prices کی بنیاد پر پیمائش کی جائے تو November سے April تک کا چھ ماہ کا عرصہ، May سے October تک کے عرصے کے مقابلے میں اوسطاً زیادہ return دیتا ہے۔ یہ فرق حقیقی ہے، لیکن اس کہاوت کے تاثر سے کم ہے۔ گرمیوں کے چھ ماہ میں بھی اوسطاً gain ہوتا ہے، اور یہی وہ نکتہ ہے جہاں یہ rule ایک عملی منصوبے کے طور پر ناکام ہو جاتا ہے۔

قاعدہ کیا کہتا ہے، اور آپ اسے کیسے جانچتے ہیں

یہ فقرہ لندن کی ایک پرانی روایت سے نکلا ہے، جس میں لوگ موسمِ بہار کی race meetings کے بعد شہر سے باہر چلے جاتے اور خزاں میں واپس آتے تھے۔ جدید اور قابلِ جانچ شکل میں یہ دو تاریخوں پر مبنی switching rule ہے۔ آپ اکتوبر کے آخری trading day سے اپریل کے آخری trading day تک ایک broad stock index میں سرمایہ کاری رکھتے ہیں۔ باقی چھ ماہ کے لیے آپ کی کوئی پوزیشن نہیں ہوتی۔

اس کی جانچ کے لیے دو چیزیں درکار ہیں جو یہ کہاوت فراہم نہیں کرتی: price series اور متعین window۔ ذیل کے تمام اعداد SPY استعمال کرتے ہیں، جو سب سے قدیم S&P 500 exchange traded fund ہے۔ قیمتیں global_markets.delayed_stocks_minute_aggs table میں موجود regular-hours minute bars سے لی گئی ہیں، اور مدت اپریل 2005 کے آخری close سے اپریل 2026 کے آخری close تک ہے۔ یہاں کسی ماہ کا return صرف اس ماہ کی آخری regular-hours price اور پچھلے ماہ کی price کا تقابل ہے۔ Dividends کے لیے آگے الگ section موجود ہے، جبکہ ماہانہ returns کیسے ماپے جاتے ہیں میں بتایا گیا ہے کہ یہ فرق نتیجے کو کیوں بدل دیتا ہے۔

کیا May میں فروخت کر کے مارکیٹ سے دور رہنے کی حکمتِ عملی کارآمد ہے؟ 2005 سے 2026 تک کا ریکارڈ

استفسار کریںS&P 500 tracker: مئی تا اکتوبر بمقابلہ نومبر تا اپریل، ہر سیزن
ہر عدد کے پیچھے موجود درست 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

ہر نقطہ ایک summer کو اس کے بعد آنے والے winter سے ملاتا ہے۔ چارٹ میں 21 مکمل جوڑے شامل ہیں۔ اس کا آغاز 2005 کے summer سے ہوتا ہے اور اختتام اس winter پر ہوتا ہے جو April 2026 میں ختم ہوا۔

زیادہ تر انفرادی برسوں میں دونوں لائنوں کے نتائج مختلف رہے، جبکہ بدترین سال میں دونوں متفق تھیں۔ April کے اختتام سے October کے اختتام تک 2008 summer half نے -29.81% ریکارڈ کیا، جو اس پورے سلسلے کی سب سے گہری reading تھی۔ اس کے بعد آنے والے winter نے -10.03% ریکارڈ کیا۔ جس holder نے اس April میں فروخت کی، وہ شدید گراوٹ کے ایک بڑے حصے سے باہر رہا، پھر آخری مرحلے کی گراوٹ کے لیے دوبارہ داخل ہوا۔ Calendar اور نقصان صرف سفر کے نصف حصے میں ایک دوسرے سے مطابقت رکھتے تھے۔

کیا 2015 کے بعد summer gap کم ہو گیا ہے؟

یہ محاورہ دراصل averages کے بارے میں دعویٰ کرتا ہے، اور وہ window اہم ہے جس پر یہ averages مبنی ہوتے ہیں۔ 2015 پر مدت کو تقسیم کرنے سے دو تقریباً مساوی حصے بنتے ہیں، جن کا حساب ایک ہی طریقے سے کیا گیا ہے۔

استفسار کریںہر دور میں سیزنل فرق: اوسط ششماہی returns اور ان کا spread
ہر عدد کے پیچھے موجود درست 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 seasons میں May سے October تک average 3.88% رہا، جبکہ November سے April تک average 6.06% رہا۔ دونوں کے درمیان فرق 2.18 percentage points تھا۔ یہی فرق اس rule کی پوری بنیاد ہے۔ summer column کو ساتھ دیکھیں: ان summers میں سے 16 اپنے آغاز سے زیادہ سطح پر ختم ہوئے۔ اس لیے average sit-out نے نقصان کے بجائے gain کو چھوڑ دیا۔

دونوں حصوں میں فرق واضح ہے۔ پہلے block میں spread 4.84 points تھا، جبکہ بعد کے block میں یہ -0.24 رہا۔ عام طور پر دہرائی جانے والی تشریحات کسی gap کا ذکر کرتی ہیں، لیکن اس کے پیچھے موجود years نہیں بتاتیں، حالانکہ اصل بحث years ہی ہیں۔ کوئی بھی seasonal statistic تاریخ کے ایک مخصوص span کے بارے میں دعویٰ ہوتا ہے، اور اس span کا انتخاب وہ شخص کرتا ہے جو اسے دہراتا ہے۔

کیا واقعی August اور September کا اثر ہے؟

چھ ماہ ایک بہت وسیع پیمانہ ہے۔ Calendar کو مہینوں میں تقسیم کرنے سے یہ جاننے میں مدد ملتی ہے کہ آیا summer window مجموعی طور پر کمزور رہتی ہے یا اس کا پورا نتیجہ کسی ایک حصے کی وجہ سے بنتا ہے۔

استفسار کریںکیلنڈر ماہ کے لحاظ سے اوسط S&P 500 tracker return، مئی 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

کمزوری September میں مرکوز ہے۔ اس ماہ کی اوسط -0.75% رہی اور یہ 21 برسوں میں سے 12 برسوں کے اختتام پر بلند رہا، جبکہ median 0.38% تھا۔ August کی اوسط 0.28% رہی۔ July، جو اس مدت کے عین وسط میں آتا ہے اور جسے seller چھوڑ دیتا ہے، کی اوسط 2.63% رہی۔ October، یعنی وہ آخری ماہ جس سے پہلے rule کے تحت خریداری دوبارہ شروع ہوتی ہے، کی اوسط 0.97% رہی۔

اس window میں اثر کی نوعیت محدود ہے: summer کے آخر میں ایک کمزور مرحلہ آتا ہے، جبکہ اس کے آس پاس کے مہینے calendar کے باقی حصے سے بہت مختلف نظر نہیں آتے۔ April کے آخر میں exit کرنے سے September تو رہ جاتا ہے، مگر May، June، July اور August بھی miss ہو جاتے ہیں۔

What the switch actually costs

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

استفسار کریںایک dollar کی growth: پورا سال holding بمقابلہ صرف نومبر تا اپریل holding
ہر عدد کے پیچھے موجود درست 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.
استفسار کریںex-dividend ماہ کے لحاظ سے SPY distributions: مئی تا اکتوبر window کے اندر بمقابلہ باہر
ہر عدد کے پیچھے موجود درست 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.

ایک مشہور calendar rule کو شک کی نظر سے کیوں دیکھنا چاہیے

بارہ ماہ میں کسی subset کا انتخاب کر کے سرمایہ کاری کرنے کے 4,095 غیر خالی طریقے بنتے ہیں۔ قیمتوں کی ایک ہی history میں اس پوری گنجائش کو تلاش کریں تو کوئی نہ کوئی pattern نمایاں دکھائی دے گا۔ یہ search کی فطری خصوصیت ہے۔

Sell in May کو گزشتہ ہفتے تیار کیے گئے کسی rule پر ایک دیانت دارانہ برتری حاصل ہے: یہ اس sample کے آغاز سے بہت پہلے مشہور تھا۔ اس لیے اس صفحے پر موجود سال fitted result کے بجائے out-of-sample test کے طور پر کام کرتے ہیں۔ test میں معمولی فرق سامنے آتا ہے، جو ایک ہی ماہ میں مرکوز ہے۔ یہ فرق ایسی switching rule سے وابستہ ہے جو اسی مدت میں buying and holding سے پیچھے رہتی ہے۔ Look-ahead bias ان طریقوں کی وضاحت کرتا ہے جن سے backtest خاموشی سے اپنا جواب پہلے ہی سیکھ لیتا ہے۔ Calendar rules اس کی textbook مثال ہیں: ماہ returns معلوم ہونے کے بعد منتخب کیے جاتے ہیں۔

FAQ

Does sell in May and go away still work?

On SPY prices from April 2005 through April 2026, November to April averaged 6.06% against 3.88% for May to October, so the seasonal gap survives in the full sample. The summer half still averaged a gain, with 16 of the 21 summers finishing higher than they started.

Which months are actually the weak ones?

In this window the weakness concentrates in September, which averaged -0.75% and finished higher in 12 of 21 years. July, another month the rule sits out, averaged 2.63% over the same span.

Does selling in May beat buying and holding?

Not over this sample. A dollar held continuously from the end of April 2005 grew to $6.21 by April 2026, against $3.14 for the winter-only switch, and that comparison counts no trading costs, no tax, and no dividends.

What happens to dividends if you sell in May?

A fund's ex-dividend dates do not pause for the summer. Two of SPY's four quarterly ex-dates fall inside the May to October window, and a holder who is out of the fund on an ex-date does not receive that distribution.

Is a seasonal pattern the same as a prediction?

No. A historical average across 21 seasons describes what happened over a stated window. Individual years scatter widely around that average, as the first chart shows, and the window itself is a choice.


Every panel here is a stored query with its SQL attached. Change the ticker, move the window, and check whether the seasonal gap holds on the Strasmore terminal.

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