Adakah Strategi Jual pada Mei Berkesan?
Ujian dua dekad musim S&P 500 mendapati tempoh November hingga April mengatasi Mei hingga Oktober, tetapi perbezaan kecil dan musim panas masih mencatat keuntungan.
“Sell in May and go away” ialah peraturan kalendar yang paling dikenali dalam pasaran saham: jual pada akhir April, simpan tunai sepanjang musim panas, kemudian beli semula pada akhir Oktober. Berdasarkan harga dana penjejak S&P 500 dari penutupan terakhir April 2005 hingga penutupan terakhir April 2026, tempoh November hingga April sememangnya mencatat purata pulangan yang lebih tinggi berbanding tempoh Mei hingga Oktober. Perbezaan itu wujud, tetapi lebih kecil daripada yang digambarkan oleh ungkapan tersebut. Tempoh musim panas juga mencatat purata keuntungan. Di sinilah peraturan itu tidak lagi kukuh sebagai pelan pelaburan.
Apakah yang dinyatakan oleh peraturan itu dan cara mengujinya
Frasa ini berasal daripada kebiasaan lama di London, apabila orang ramai meninggalkan bandar selepas siri perlumbaan musim bunga dan kembali pada musim luruh. Dalam bentuk moden yang boleh diuji, ia ialah peraturan pertukaran dengan dua tarikh. Anda memegang indeks saham yang luas dari hari dagangan terakhir Oktober hingga hari dagangan terakhir April. Anda tidak memegang apa-apa aset untuk enam bulan yang lain.
Pengujian memerlukan dua perkara yang tidak pernah dinyatakan dalam ungkapan itu: siri harga dan tempoh yang ditetapkan. Setiap angka di bawah menggunakan SPY, ETF S&P 500 yang tertua, berdasarkan harga daripada bar minit waktu dagangan biasa dalam jadual global_markets.delayed_stocks_minute_aggs, dari penutupan akhir April 2005 hingga penutupan akhir April 2026. Pulangan bulanan di sini ialah harga waktu dagangan biasa terakhir berbanding harga bulan sebelumnya, tanpa mengambil kira dividen. Dividen dibincangkan dalam bahagian tersendiri di bawah, manakala cara pulangan bulanan diukur menerangkan sebab perbezaan itu mengubah keputusannya.
Adakah strategi jual pada bulan Mei dan keluar pasaran berkesan? Rekod 2005 hingga 2026
SQL tepat di sebalik setiap nombor
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 yearSetiap titik memadankan satu musim panas dengan musim sejuk yang menyusulnya. Carta ini mengandungi 21 pasangan lengkap, bermula dengan musim panas 2005 dan berakhir dengan musim sejuk yang berakhir pada April 2026.
Kedua-dua garisan menunjukkan prestasi yang berbeza dalam kebanyakan tahun dan sehaluan pada tahun yang paling teruk. Antara akhir April hingga akhir Oktober 2008, separuh musim panas mencatat -29.81%, bacaan paling rendah dalam tempoh tersebut. Musim sejuk selepas itu mencatat -10.03%. Pemegang yang menjual pada April berjaya mengelak kejatuhan besar, kemudian masuk semula ketika penurunan terakhir berlaku. Kalendar dan kerugian hanya sehaluan bagi separuh daripada tempoh tersebut.
Adakah jurang musim panas semakin pudar sejak 2015?
Purata ialah perkara yang sebenarnya didakwa oleh pepatah itu, manakala tempoh ialah asas kepada purata tersebut. Membahagikan tempoh itu pada 2015 menghasilkan dua bahagian yang panjangnya setanding dan dikira dengan kaedah yang sama.
SQL tepat di sebalik setiap nombor
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 eraMerentas kesemua 21 musim, tempoh Mei hingga Oktober mencatat purata 3.88%, manakala November hingga April mencatat purata 6.06%, iaitu spread sebanyak 2.18 mata peratusan. Spread itu menjadi keseluruhan asas bagi peraturan tersebut. Lihat lajur musim panas di sebelahnya: 16 daripada musim panas itu berakhir lebih tinggi berbanding permulaannya. Ini bermakna keputusan untuk tidak melabur sepanjang tempoh tersebut menyebabkan pelabur terlepas keuntungan, bukannya mengelakkan kerugian.
Kedua-dua bahagian itu menunjukkan perbezaan. Blok terdahulu mencatat spread sebanyak 4.84 mata, manakala blok terkemudian mencatat -0.24 mata. Huraian popular sering menyebut jurang tanpa menyatakan tahun yang mendasarinya, sedangkan tahun-tahun itulah asas hujah tersebut. Setiap statistik bermusim ialah dakwaan tentang satu tempoh sejarah, dan tempoh itu dipilih oleh pihak yang mengulanginya.
Adakah kesan Ogos dan September benar-benar wujud?
Enam bulan ialah ukuran yang terlalu kasar. Memecahkan kalendar mengikut bulan membantu menentukan sama ada tempoh musim panas itu lemah secara menyeluruh atau sekadar dipengaruhi oleh satu bahagian.
SQL tepat di sebalik setiap nombor
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))Kelemahan tertumpu pada September. Purata pulangannya ialah -0.75% dan bulan itu ditutup lebih tinggi dalam 12 daripada 21 tahun, dengan median 0.38%. Ogos mencatat purata 0.28%. Julai, yang berada di tengah-tengah tempoh yang dielakkan oleh penjual, mencatat purata 2.63%, manakala Oktober, bulan terakhir sebelum strategi itu membeli semula, mencatat purata 0.97%.
Kesan dalam tempoh ini adalah sempit: terdapat satu fasa lemah pada penghujung musim panas, manakala bulan-bulan di sekelilingnya kelihatan hampir sama seperti bulan-bulan lain dalam kalendar. Keluar pada penghujung April untuk mengelakkan September juga bermakna terlepas daripada Mei, Jun, Julai dan Ogos.
Kos sebenar strategi pertukaran
Jurang bermusim ialah angka kasar. Sesuatu peraturan perlu mengambil kira kos pelaksanaannya sendiri.
SQL tepat di sebalik setiap nombor
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 yearSatu dolar yang kekal dilaburkan sepanjang setiap musim dari akhir April 2005 meningkat kepada $6.21 pada akhir April 2026. Dolar yang sama dilaburkan dalam pasaran hanya dari November hingga April, dan tidak dilaburkan sepanjang tempoh lain, meningkat kepada $3.14. Kedua-dua garis hanya menunjukkan harga, tanpa sebarang potongan. Ini menjadikan prestasi strategi pertukaran kelihatan lebih baik daripada keadaan sebenar. Berikut ialah perkara yang tidak ditunjukkan oleh carta.
- Dua dagangan setiap tahun, bagi setiap satu daripada 21 musim. Kebanyakan broker kini tidak mengenakan caj bagi transaksi tersebut. Namun, spread bid-ask yang dibayar bagi setiap perjalanan pergi balik tetap merupakan kos.
- Cukai. Dalam akaun bercukai, penjualan pada April merealisasikan apa-apa keuntungan yang terkumpul sejak November. Tempoh pegangan dari November hingga April sememangnya kurang daripada setahun. Bagi pembayar cukai AS, keadaan ini menyebabkan keuntungan tersebut dikenakan kadar cukai keuntungan modal jangka pendek.
- Tunai terbiar. Garis yang hanya melabur pada musim sejuk memberikan pulangan sifar kepada wang yang tidak dilaburkan. Pemegang sebenar boleh menempatkan wang itu dalam instrumen tertentu, dan tempat untuk menempatkan tunai terbiar menerangkan instrumen yang lazim digunakan.
- Dividen, yang dinilai dalam panel seterusnya.
SQL tepat di sebalik setiap nombor
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 yearTarikh ex-dividend SPY jatuh pada Mac, Jun, September dan Disember. Oleh itu, dua daripada empat tarikh tersebut berada dalam tempoh enam bulan apabila pelabur tidak memegang dana itu. Dalam 2025, agihan sebanyak $3.592 sesaham mempunyai tarikh ex-dividend dari Mei hingga Oktober, berbanding $3.689 dalam enam bulan yang lain. Kedua-dua lajur bergerak seiring sepanjang keseluruhan carta. Tidak melabur selama separuh daripada tahun menyebabkan kira-kira separuh daripada pendapatan dana terlepas setiap tahun, selain kesan perubahan harga dalam tempoh tersebut. Tarikh ex-dividend ialah tarikh penentu yang menentukan pihak yang berhak menerima bayaran.
Satu lagi kos tidak muncul sebagai item berasingan. Pulangan indeks tiba secara berkelompok, dan terlepas hari terbaik menunjukkan kesan beberapa sesi yang tidak disertai terhadap baki jangka panjang. Tidak melabur selama enam bulan setiap tahun bermakna terlepas banyak sesi dagangan. Inilah pengiraan yang sama di sebalik purata kos dolar sebagai disiplin untuk mengekalkan tempoh dalam pasaran, bukannya cuba menentukan masa untuk masuk dan keluar.
Mengapa peraturan kalendar yang terkenal wajar dicurigai
Dua belas bulan membenarkan 4,095 cara tidak kosong untuk memilih subset yang akan dilaburkan. Jika ruang itu diuji terhadap satu sejarah harga, pasti ada sesuatu yang kelihatan ketara. Itulah sifat carian tersebut.
Sell in May mempunyai satu kelebihan yang wajar berbanding peraturan yang dilombong minggu lalu: peraturan itu sudah terkenal jauh sebelum sampel ini bermula. Oleh itu, tahun-tahun dalam halaman ini berfungsi sebagai ujian luar sampel, bukannya hasil yang disesuaikan dengan data. Ujian itu menunjukkan jurang sederhana yang tertumpu pada satu bulan, dan melibatkan peraturan pertukaran yang ketinggalan berbanding strategi membeli dan memegang sepanjang tempoh yang sama. Bias pandang ke hadapan menerangkan cara backtest secara senyap-senyap mempelajari jawapannya lebih awal. Peraturan kalendar ialah contoh klasik: bulan-bulan tersebut dipilih selepas pulangan diketahui.
Soalan Lazim
Adakah strategi menjual pada bulan Mei dan keluar dari pasaran masih berkesan?
Berdasarkan harga SPY dari April 2005 hingga April 2026, purata prestasi November hingga April ialah 6.06% berbanding 3.88% bagi Mei hingga Oktober. Oleh itu, jurang bermusim masih wujud dalam keseluruhan sampel. Tempoh musim panas juga mencatat purata keuntungan. Sebanyak 16 daripada 21 tempoh musim panas berakhir pada paras lebih tinggi berbanding permulaannya.
Bulan manakah yang sebenarnya lemah?
Dalam tempoh ini, kelemahan tertumpu pada September. Purata prestasinya ialah -0.75%, dan bulan itu berakhir lebih tinggi dalam 12 daripada 21 tahun. Julai, iaitu satu lagi bulan yang tidak termasuk dalam strategi tersebut, mencatat purata 2.63% dalam tempoh yang sama.
Adakah menjual pada bulan Mei memberikan prestasi lebih baik berbanding membeli dan memegang?
Tidak dalam sampel ini. Satu dolar yang dipegang secara berterusan dari akhir April 2005 meningkat menjadi $6.21 menjelang April 2026. Bagi strategi bertukar kepada pegangan musim sejuk sahaja, nilainya menjadi $3.14. Perbandingan ini tidak mengambil kira kos dagangan, cukai atau dividen.
Apakah yang berlaku kepada dividen jika anda menjual pada bulan Mei?
Tarikh ex-dividend dana tidak berhenti sepanjang musim panas. Dua daripada empat tarikh ex-dividend suku tahunan SPY jatuh dalam tempoh Mei hingga Oktober. Pemegang yang tidak memiliki dana pada tarikh ex-dividend tidak menerima agihan tersebut.
Adakah corak bermusim sama dengan ramalan?
Tidak. Purata sejarah merentas 21 musim menerangkan perkara yang berlaku dalam tempoh yang dinyatakan. Prestasi setiap tahun berbeza dengan ketara daripada purata itu, seperti yang ditunjukkan oleh carta pertama. Tempoh analisis itu sendiri juga merupakan satu pilihan.
Setiap panel di sini ialah stored query dengan SQL yang dilampirkan. Tukar ticker, ubah tempoh analisis dan semak sama ada jurang bermusim itu kekal pada terminal Strasmore.