Strasmore Research

Je, Uza Mei na Uondoke Hufanya Kazi?

Kanuni ya Uza Mei na Uondoke yapimwa kwa misimu miwili ya miongo ya S&P 500. Tazama pengo la kiangazi na gharama halisi ya kubadili mikakati.

“Sell in May and go away” ndiyo kanuni ya kalenda inayojulikana zaidi katika soko la hisa: uza mwishoni mwa Aprili, shikilia fedha taslimu wakati wote wa kiangazi, kisha nunua tena mwishoni mwa Oktoba. Kwa kuzipima bei za ETF inayofuatilia S&P 500 kuanzia kufungwa kwa soko siku ya mwisho ya Aprili 2005 hadi kufungwa kwa soko siku ya mwisho ya Aprili 2026, kipindi cha Novemba hadi Aprili kina wastani wa faida kubwa kuliko kipindi cha Mei hadi Oktoba. Tofauti hiyo ipo, lakini ni ndogo kuliko inavyodokezwa na msemo huo. Kipindi cha kiangazi pia huwa na wastani wa faida, na hapo ndipo kanuni hiyo inaposhindwa kuwa mpango wa uwekezaji.

Kanuni inasema nini, na unaijaribuje

Kauli hii ilitokana na desturi ya zamani ya London ya kuondoka mjini baada ya mashindano ya mbio za farasi ya majira ya kuchipua na kurejea wakati wa majira ya vuli. Katika mfumo wake wa kisasa unaoweza kupimwa, ni kanuni ya kubadilisha uwekezaji yenye tarehe mbili. Unashikilia fahirisi pana ya hisa kuanzia siku ya mwisho ya biashara ya Oktoba hadi siku ya mwisho ya biashara ya Aprili. Kwa miezi sita mingine hushikilii chochote.

Kuijaribu kunahitaji vitu viwili ambavyo msemo huo hautoi: mfululizo wa bei na kipindi kilichobainishwa. Kila namba hapa chini inatumia SPY, ETF ya zamani zaidi inayofuatilia S&P 500, ikiwa na bei zilizotokana na minute bars za saa za kawaida za biashara katika jedwali la global_markets.delayed_stocks_minute_aggs, kuanzia kufungwa kwa mwisho kwa Aprili 2005 hadi kufungwa kwa mwisho kwa Aprili 2026. Return ya mwezi hapa ni bei ya mwisho ya saa za kawaida za biashara ikilinganishwa na bei ya mwezi uliotangulia, bila kujumuisha kitu kingine isipokuwa bei. Dividends zitaelezwa katika sehemu yake hapa chini, na jinsi returns za kila mwezi zinavyopimwa inaeleza kwa nini tofauti hiyo hubadilisha jibu.

Je, kuuza mwezi Mei na kuondoka hufanya kazi? Rekodi ya 2005 hadi 2026

UlizaKifuatiliaji cha S&P 500: Mei hadi Oktoba dhidi ya Novemba hadi Aprili, msimu baada ya msimu
SQL halisi nyuma ya kila namba
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

Kila nukta inaunganisha majira ya kiangazi moja na majira ya baridi yanayofuata. Chati ina jozi 21 kamili, ikianza na kiangazi cha 2005 na kumalizika na majira ya baridi yaliyofikia mwisho wake mwezi Aprili 2026.

Mistari hiyo miwili inatofautiana katika miaka mingi, na inalingana katika mwaka mbaya zaidi. Kati ya mwisho wa Aprili na mwisho wa Oktoba 2008, kipindi cha kiangazi kilipima -29.81%, kiwango cha chini zaidi katika mfululizo huo. Majira ya baridi yaliyofuata yalipima -10.03%. Mmiliki aliyeuza mwezi huo wa Aprili alijiondoa kabla ya anguko kubwa, kisha akaingia tena wakati wa hatua ya mwisho ya kushuka. Kalenda na hasara ziliendana katika nusu tu ya safari.

Je, pengo la majira ya kiangazi limepungua tangu 2015?

Wastani ndio msingi wa dai hili, na kipindi ndicho msingi wa wastani huo. Kugawa mfululizo katika sehemu mbili kuanzia 2015 kunatoa nusu mbili zenye urefu unaokaribiana, zilizokokotolewa kwa njia ileile.

UlizaPengo la msimu kwa vipindi: wastani wa returns za nusu mwaka na tofauti kati yao
SQL halisi nyuma ya kila namba
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

Katika misimu yote 21, kuanzia Mei hadi Oktoba kulikuwa na wastani wa 3.88%, na kuanzia Novemba hadi Aprili kulikuwa na wastani wa 6.06%, tofauti ya 2.18 percentage points. Tofauti hiyo ndiyo msingi wote wa kanuni hiyo. Tazama safu ya majira ya kiangazi: 16 ya misimu hiyo iliisha ikiwa juu kuliko ilivyoanza. Hivyo, kukaa nje kwa wastani kulikosa faida badala ya kuepuka hasara.

Nusu hizo zinatofautiana. Kipindi cha awali kinaonyesha tofauti ya 4.84 points, huku kipindi cha baadaye kikiwa na -0.24. Maelezo maarufu mara nyingi hutaja pengo bila kutaja miaka inayolizunguka. Lakini miaka hiyo ndiyo hoja yenyewe. Takwimu yoyote ya msimu ni dai kuhusu kipindi fulani cha historia, na kipindi hicho huchaguliwa na mtu anayesimulia dai hilo.

Je, kweli kuna athari ya Agosti na Septemba?

Miezi sita ni kipimo kipana. Kuigawa kalenda kwa miezi kunasaidia kubaini ikiwa kipindi cha majira ya joto huwa dhaifu kwa ujumla, au ikiwa sehemu moja ndiyo hubeba matokeo yote.

UlizaWastani wa return ya kifuatiliaji cha S&P 500 kwa mwezi wa kalenda, Mei 2005 hadi Aprili 2026
SQL halisi nyuma ya kila namba
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

Udhaifu uko Septemba. Wastani wake ulikuwa -0.75%, na mwezi huo ulimaliza kwa kupanda katika 12 kati ya miaka 21, huku median ikiwa 0.38%. Wastani wa Agosti ulikuwa 0.28%. Julai, iliyo katikati ya kipindi ambacho muuzaji hukiepuka, ilikuwa na wastani wa 2.63%, na Oktoba, mwezi wa mwisho kabla ya kanuni kuanza tena kununua, ilikuwa na wastani wa 0.97%.

Mwelekeo wa athari katika kipindi hiki ni finyu: kuna kipindi kimoja dhaifu mwishoni mwa majira ya joto, huku miezi inayokizunguka ikifanana kwa kiasi kikubwa na miezi mingine ya kalenda. Kuondoka mwishoni mwa Aprili ili kuepuka Septemba pia kunamaanisha kukosa Mei, Juni, Julai na Agosti.

Gharama halisi za kubadili

Pengo la msimu ni takwimu ghafi. Mkakati lazima ustahimili gharama zake za utekelezaji.

UlizaUkuaji wa dola moja: kuwekeza mwaka mzima dhidi ya kuwekeza Novemba hadi Aprili pekee
SQL halisi nyuma ya kila namba
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

Dola moja iliyowekezwa katika kila msimu kuanzia mwisho wa Aprili 2005 ilikua hadi $6.21 kufikia mwisho wa Aprili 2026. Dola hiyo hiyo ikiwa sokoni kuanzia Novemba hadi Aprili pekee, na bila kuwekeza katika kipindi kingine, ilikua hadi $3.14. Mistari yote miwili inaonyesha bei pekee bila kukatwa gharama yoyote. Hivyo, inaifanya kanuni ya kubadili ionekane bora kuliko ilivyo. Hivi ndivyo chati haijaonyesha.

  • Miamala miwili kila mwaka, katika kila moja ya misimu 21. Kwa sasa, madalali wengi hawatozi ada ya msingi ya muamala. Lakini spread ya bei ya kununua na kuuza inayolipwa katika ununuzi na uuzaji wa kurudi haijaondolewa.
  • Kodi. Katika akaunti inayotozwa kodi, uuzaji wa Aprili hutambua faida yoyote iliyopatikana tangu Novemba. Kwa muundo huo, kipindi cha kushikilia kuanzia Novemba hadi Aprili ni chini ya mwaka mmoja. Hivyo, kwa mlipa kodi wa Marekani, faida hiyo hutozwa viwango vya faida za muda mfupi.
  • Fedha ambazo hazijawekezwa. Mstari wa uwekezaji wa majira ya baridi pekee unaonyesha fedha zilizowekwa pembeni kama zisizozalisha chochote. Mmiliki halisi angeziweka mahali zinapoweza kuleta faida, na mahali pa kuweka fedha ambazo hazijawekezwa inaeleza vyombo vinavyotumiwa kwa hilo.
  • Dividends, ambazo paneli inayofuata inaziondoa kwenye hesabu.
UlizaMgawanyo wa SPY kwa mwezi wa ex-dividend: ndani ya kipindi cha Mei hadi Oktoba dhidi ya nje ya kipindi hicho
SQL halisi nyuma ya kila namba
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

Tarehe za ex-dividend za SPY huwa katika Machi, Juni, Septemba na Desemba. Hivyo, mbili kati ya nne huangukia ndani ya miezi sita ambayo muuzaji huwa nje ya soko. Katika 2025, distributions za $3.592 kwa kila hisa zilikuwa na tarehe ya ex-dividend kati ya Mei na Oktoba, ikilinganishwa na $3.689 katika miezi sita mingine. Nguzo hizo mbili zinafuatana katika chati nzima. Kutokuwa sokoni kwa nusu ya mwaka kunamaanisha kuachwa kwa takribani nusu ya mapato ya mfuko kila mwaka, kabla hata ya kuzingatia mabadiliko ya bei katika miezi hiyo. Tarehe ya ex-dividend ndiyo tarehe ya mwisho inayoamua nani atalipwa.

Kuna gharama nyingine ambayo haionekani kama kipengele tofauti. Returns za fahirisi huja kwa makundi, na kukosa siku zenye faida kubwa kunaonyesha kwa namba athari ya vipindi vichache vilivyokosekana kwenye salio la muda mrefu. Kukosa vipindi vya biashara kwa miezi sita kila mwaka ni jambo kubwa. Hiyo ndiyo hesabu ileile iliyo nyuma ya dollar cost averaging kama nidhamu ya muda wa kukaa sokoni, badala ya kujaribu kutabiri muda sahihi wa kuingia na kutoka.

Kwa nini kanuni maarufu ya kalenda inapaswa kuchukuliwa kwa mashaka

Miezi kumi na miwili inaruhusu njia 4,095 zisizo tupu za kuchagua seti ya miezi ya kuwa na uwekezaji. Ukichunguza nafasi hiyo kwa kutumia historia moja ya bei, kuna kitu kitaonekana kuwa cha kushangaza. Hilo ni kutokana na namna utafutaji huo ulivyofanywa.

Sell in May ina faida moja ya wazi ikilinganishwa na kanuni iliyotengenezwa wiki iliyopita: ilikuwa maarufu muda mrefu kabla ya kipindi hiki cha data kuanza. Kwa hiyo, miaka iliyo kwenye ukurasa huu inatumika kama jaribio la out-of-sample badala ya matokeo yaliyorekebishwa kulingana na data. Jaribio linaonyesha tofauti ndogo, iliyojikita katika mwezi mmoja, na inahusishwa na kanuni ya kubadilisha uwekezaji ambayo inapata matokeo duni kuliko kununua na kushikilia katika kipindi hicho hicho. Upendeleo wa kutumia taarifa za baadaye inaeleza jinsi backtest inaweza kujifunza jibu lake mapema bila kutambuliwa. Kanuni za kalenda ni mfano wa kawaida: miezi huchaguliwa baada ya kujulikana kwa returns.

Maswali Yanayoulizwa Mara kwa Mara

Je, kuuza mwezi wa Mei na kujiondoa bado hufanya kazi?

Kwa bei za SPY kuanzia Aprili 2005 hadi Aprili 2026, kipindi cha Novemba hadi Aprili kilikuwa na wastani wa 6.06% ikilinganishwa na 3.88% kwa Mei hadi Oktoba. Hivyo, tofauti ya msimu bado ipo katika sampuli nzima. Nusu ya mwaka ya kiangazi bado ilikuwa na faida kwa wastani, huku 16 kati ya 21 ya vipindi vya kiangazi vikiishia juu kuliko vilivyoanza.

Ni miezi ipi hasa yenye udhaifu?

Katika kipindi hiki, udhaifu ulijikita Septemba. Mwezi huo ulikuwa na wastani wa -0.75% na ulifunga juu katika 12 ya 21 miaka. Julai, ambao ni mwezi mwingine ambao mkakati huu hauingii sokoni, ulikuwa na wastani wa 2.63% katika kipindi hicho hicho.

Je, kuuza mwezi wa Mei kunazidi kununua na kushikilia?

Si katika sampuli hii. Dola moja iliyoshikiliwa bila kukatizwa kuanzia mwisho wa Aprili 2005 ilikua hadi $6.21 kufikia Aprili 2026. Hii inalinganishwa na $3.14 kwa mkakati wa kubadilisha nafasi kwa kipindi cha majira ya baridi pekee. Ulinganisho huu haujumuishi gharama za biashara, kodi wala dividends.

Nini hutokea kwa dividends ukiuza mwezi wa Mei?

Tarehe za ex-dividend za mfuko haziishii kwa msimu wa kiangazi. Tarehe mbili kati ya nne za SPY za kila robo mwaka za ex-dividend huangukia katika kipindi cha Mei hadi Oktoba. Mmiliki ambaye hayuko kwenye mfuko tarehe ya ex-dividend hapokei distribution hiyo.

Je, muundo wa msimu ni sawa na utabiri?

Hapana. Wastani wa kihistoria katika misimu 21 unaeleza kilichotokea katika kipindi kilichotajwa. Miaka ya mtu mmoja mmoja hutawanyika kwa kiasi kikubwa kuzunguka wastani huo, kama chati ya kwanza inavyoonyesha. Pia, kuchagua kipindi hicho ni uamuzi wa mchambuzi.


Kila paneli hapa ni query iliyohifadhiwa pamoja na SQL yake. Badilisha ticker, sogeza kipindi, na uangalie kama tofauti ya msimu inadumu kwenye terminal ya Strasmore.

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