Sell in May and Go Away কি কাজ করে?
2005 থেকে 2026 পর্যন্ত S&P 500-এর মৌসুমি রিটার্ন তুলনা করুন। গ্রীষ্মের ব্যবধান কত, আর মে-তে বিক্রি করে অক্টোবরে ফেরার কৌশলে বাস্তবে কত খরচ হয় দেখুন।
Sell in May and go away স্টক মার্কেটের সবচেয়ে পরিচিত calendar rule। এপ্রিলের শেষে বিক্রি করে গ্রীষ্মকালজুড়ে নগদে থাকা এবং অক্টোবরের শেষে আবার কিনে নেওয়াই এই নিয়মের মূল কথা। 2005 সালের এপ্রিলের শেষ ক্লোজ থেকে 2026 সালের এপ্রিলের শেষ ক্লোজ পর্যন্ত S&P 500 tracker-এর দামের ভিত্তিতে হিসাব করলে দেখা যায়, নভেম্বর থেকে এপ্রিল পর্যন্ত ছয় মাসে গড় রিটার্ন মে থেকে অক্টোবর পর্যন্ত ছয় মাসের তুলনায় বেশি। ব্যবধানটি বাস্তব, তবে প্রচলিত কথাটির ইঙ্গিতের চেয়ে ছোট। মে থেকে অক্টোবরের সময়কালেও গড়ে লাভ হয়েছে। এখানেই বিনিয়োগ পরিকল্পনা হিসেবে এই নিয়মটির সীমাবদ্ধতা স্পষ্ট হয়।
নিয়মটি কী বলে এবং কীভাবে এটি পরীক্ষা করবেন
এই বাক্যাংশটির উৎস পুরনো লন্ডনের একটি রীতি। বসন্তের ঘোড়দৌড়ের আসর শেষ হলে লোকজন শহর ছেড়ে যেতেন এবং শরৎকালে ফিরে আসতেন। আধুনিক ও পরীক্ষাযোগ্য রূপে এটি দুটি তারিখভিত্তিক একটি switching rule। আপনি অক্টোবরের শেষ trading day থেকে এপ্রিলের শেষ trading day পর্যন্ত একটি broad stock index ধরে রাখবেন। বাকি ছয় মাস কোনো পজিশন রাখবেন না।
এটি পরীক্ষা করতে এমন দুটি জিনিস দরকার, যা প্রবাদটি নিজে দেয় না: একটি price series এবং একটি নির্দিষ্ট window। নিচের প্রতিটি সংখ্যা global_markets.delayed_stocks_minute_aggs টেবিলের regular-hours minute bars থেকে নেওয়া SPY ব্যবহার করে হিসাব করা হয়েছে। SPY হলো সবচেয়ে পুরনো S&P 500 exchange traded fund। সময়কাল final April 2005 close থেকে final April 2026 close পর্যন্ত। এখানে কোনো মাসের return বলতে বোঝানো হয়েছে, ওই মাসের শেষ regular-hours price এবং আগের মাসের শেষ price-এর তুলনা; এতে শুধু price ধরা হয়েছে। Dividends-এর জন্য নিচে আলাদা section রয়েছে। মাসিক 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
)
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প্রতিটি বিন্দু একটি গ্রীষ্মকালকে তার পরবর্তী শীতের সঙ্গে জোড়া দেয়। চার্টে 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মোট 21টি মৌসুমে মে থেকে অক্টোবর পর্যন্ত গড় ফলাফল ছিল 3.88%, আর নভেম্বর থেকে এপ্রিল পর্যন্ত ছিল 6.06%। ব্যবধান ছিল 2.18 percentage points। এই ব্যবধানই নিয়মটির পক্ষে পুরো যুক্তি। গ্রীষ্মকালীন কলামটি পাশাপাশি দেখুন: ওই গ্রীষ্মগুলোর 16টিতে শুরু দামের তুলনায় শেষ দাম বেশি ছিল। অর্থাৎ, গড় হিসাবে বাজারের বাইরে থাকার সিদ্ধান্ত ক্ষতির বদলে লাভের সুযোগ হাতছাড়া করেছে।
দুটি সময়সীমায় ফল আলাদা। আগের অংশে ব্যবধান ছিল 4.84 points, আর পরের অংশে -0.24। জনপ্রিয় ব্যাখ্যাগুলো প্রায়ই পেছনের বছরগুলোর উল্লেখ না করেই একটি ব্যবধান উদ্ধৃত করে। কিন্তু যুক্তিটিই নির্ভর করে সেই বছরগুলোর ওপর। যেকোনো seasonal statistic ইতিহাসের একটি নির্দিষ্ট সময়সীমা নিয়ে করা দাবি। আর সেই সময়সীমা বেছে নেন যিনি পরিসংখ্যানটি পুনরাবৃত্তি করেন।
এটি কি সত্যিই August এবং September effect?
ছয় মাসের পরিসর বেশ মোটাদাগের। ক্যালেন্ডারকে মাসভিত্তিক ভাগ করলে বোঝা যায়, গ্রীষ্মের সময়কালজুড়ে দুর্বলতা সমানভাবে ছড়িয়ে আছে কি না, নাকি এর পুরো ফলাফল মূলত একটি মাসের ওপর নির্ভর করছে।
প্রতিটি সংখ্যার পেছনের সঠিক 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))দুর্বলতা মূলত September-এ কেন্দ্রীভূত। এই মাসে গড় ফলাফল ছিল -0.75% এবং 21 বছরের মধ্যে 12 বছরে মাসটি উচ্চতর অবস্থায় শেষ হয়েছে; এর median ছিল 0.38%। August-এর গড় ছিল 0.28%। যে সময়ে বিক্রেতা বাজারের বাইরে থাকে, সেই সময়সীমার মাঝামাঝি মাস July-এর গড় ছিল 2.63%। নিয়ম অনুযায়ী পুনরায় কেনাকাটা শুরু হওয়ার আগে শেষ মাস October-এর গড় ছিল 0.97%।
এই সময়সীমায় effect-টির ধরন সীমিত: গ্রীষ্মের শেষভাগে একটি দুর্বল পর্যায় দেখা যায়, কিন্তু এর আগের ও পরের মাসগুলো ক্যালেন্ডারের বাকি সময়ের মতোই ছিল। April-এর শেষে বিক্রি করে September এড়ালে May, June, July এবং August-ও বাদ পড়ে।
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 yearA 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.
প্রতিটি সংখ্যার পেছনের সঠিক 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 yearSPY'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.
কেন একটি বিখ্যাত ক্যালেন্ডার নিয়মকে সন্দেহের চোখে দেখা উচিত
12 মাসে বিনিয়োগের জন্য কোনো উপসেট বেছে নেওয়ার 4,095টি non-empty উপায় রয়েছে। একটি মূল্য-ইতিহাসের বিপরীতে সেই পুরো পরিসর খুঁজলে কোনো না কোনো ফল অবশ্যই চমকপ্রদ দেখাবে। এটি অনুসন্ধান-পদ্ধতিরই একটি বৈশিষ্ট্য।
গত সপ্তাহে ডেটা থেকে তৈরি কোনো নিয়মের তুলনায় Sell in May-এর একটি সৎ সুবিধা রয়েছে: এই নমুনা শুরুর অনেক আগে থেকেই নিয়মটি বিখ্যাত ছিল। তাই এই পৃষ্ঠার বছরগুলো fitted result নয়, বরং out-of-sample test হিসেবে কাজ করে। পরীক্ষায় একটি সীমিত ব্যবধান দেখা যায়, যা মূলত এক মাসে কেন্দ্রীভূত। একই সময়কালে buying and holding-এর তুলনায় switching rule-টি পিছিয়ে থাকে। Look-ahead bias ব্যাখ্যা করে কীভাবে একটি backtest নীরবে আগে থেকেই উত্তর শিখে ফেলে। ক্যালেন্ডার নিয়ম এটির textbook case: returns জানা হয়ে যাওয়ার পর মাসগুলো বেছে নেওয়া হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
মে মাসে বিক্রি করে দূরে থাকার কৌশল কি এখনও কার্যকর?
April 2005 থেকে April 2026 পর্যন্ত SPY-এর দামের হিসাবে, November থেকে April পর্যন্ত গড় রিটার্ন ছিল 6.06%, যেখানে May থেকে October পর্যন্ত ছিল 3.88%। তাই পুরো নমুনায় ঋতুভিত্তিক ব্যবধানটি বজায় রয়েছে। গ্রীষ্মকালীন অর্ধেও গড়ে দাম বেড়েছে। 21টি গ্রীষ্ম শুরুর তুলনায় বেশি দামে শেষ হয়েছে, যার হার ছিল 16।
কোন মাসগুলো আসলে দুর্বল?
এই সময়পর্বে দুর্বলতা মূলত September-এ কেন্দ্রীভূত। মাসটিতে গড় রিটার্ন ছিল -0.75%, এবং 21 বছরের মধ্যে 12 বছর বেশি দামে শেষ হয়েছে। একই সময়ে, এই কৌশলে এড়িয়ে চলা আরেক মাস July-তে গড় রিটার্ন ছিল 2.63%।
মে মাসে বিক্রি করা কি কিনে ধরে রাখার চেয়ে ভালো?
এই নমুনায় নয়। April-এর শেষ থেকে টানা 1 dollar বিনিয়োগ করে April 2005 পর্যন্ত ধরে রাখলে তা April 2026-এ $6.21 হতো। বিপরীতে, শুধু শীতকালীন সময়ে বিনিয়োগ রেখে কৌশল পরিবর্তন করলে তা হতো $3.14। এই তুলনায় কোনো trading cost, tax বা dividend ধরা হয়নি।
মে মাসে বিক্রি করলে dividend-এর কী হয়?
কোনো ফান্ডের ex-dividend date গ্রীষ্মকালে থেমে থাকে না। SPY-এর চারটি ত্রৈমাসিক ex-date-এর মধ্যে দুটি May থেকে October সময়সীমার মধ্যে পড়ে। কোনো ex-date-এ বিনিয়োগকারী ফান্ডের বাইরে থাকলে তিনি ওই distribution পান না।
ঋতুভিত্তিক pattern কি prediction-এর সমান?
না। 21টি season-এর ঐতিহাসিক গড় একটি নির্দিষ্ট সময়পর্বে কী ঘটেছিল, তা বর্ণনা করে। প্রথম chart-এ দেখা যায়, পৃথক বছরগুলোর ফল ওই গড়ের আশপাশে ব্যাপকভাবে ছড়িয়ে থাকে। সময়পর্বটি নিজেও একটি নির্বাচিত পরিসর।
এখানে প্রতিটি panel একটি stored query, এবং তার সঙ্গে SQL সংযুক্ত আছে। ticker পরিবর্তন করুন, সময়পর্ব বদলান এবং Strasmore terminal-এ ঋতুভিত্তিক ব্যবধানটি বজায় থাকে কি না পরীক্ষা করুন।