Sell in Mayは本当に有効か?S&P 500で検証
Sell in May and Go AwayをS&P 500で二十年検証します。夏の半年間と冬の半年間の差、季節スイッチで実際に生じるコストを確認します。
「Sell in May and go away」は、株式市場で最もよく知られたカレンダー則である。四月末に売却し、夏の間は現金で待機し、十月末に買い戻す。S&P 500連動商品の価格を、2005年四月最終営業日の終値から2026年四月最終営業日の終値まで測定すると、十一月から四月までの半年間の平均リターンは、五月から十月までの半年間を上回る。ただし、その差は実在するものの、この格言が示唆するほど大きくはない。五月から十月までの半年間も平均では上昇しており、これがこのルールを投資計画として機能しにくくする。
このルールの内容と検証方法
この言い回しは、春の競馬開催後にロンドンを離れ、秋に戻るという古い習慣に由来します。現代的で検証可能な形では、二つの日付に基づくスイッチングルールです。十月の最終取引日から四月の最終取引日までは、幅広い株価指数を保有します。残りの六カ月は、何も保有しません。
検証には、この格言が示していない二つの要素が必要です。価格系列と、明確に定めた期間です。以下のすべての数値は、最も古いS&P 500 ETFであるSPYを用いています。global_markets.delayed_stocks_minute_aggs表の通常取引時間中の分足データから、2005年四月最終日の終値から2026年四月最終日の終値までを対象に算出しています。ここでの月次リターンは、配当を含めず、当月の通常取引時間中の最終価格を前月の価格と比較したものです。配当については後段で別途扱います。月次リターンの測定方法では、この区別によって結論が変わる理由を説明しています。
「5月に売って立ち去る」は有効か?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年4月に終わった冬で終わります。
個々の年の大半では、2本の線は異なる動きを示し、最悪の年だけ一致しました。4月末から10月末までの2008、夏の期間は-29.81%を記録し、この期間で最も深い下落となりました。その後に続いた冬は-10.03%でした。4月に売却した投資家は大幅な下落を回避した後、最後の下落局面で再び買い戻すことになりました。カレンダーと下落の動きが一致したのは、全期間の半分にすぎません。
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シーズンでは、5月から10月の平均が3.88%、11月から4月の平均が6.06%で、差は2.18ポイントでした。この差が、このルールを支える根拠のすべてです。夏場の列を並べて見ると、そのうち16は開始時点を上回って終えており、平均的な見送りは損失ではなく上昇益を取り逃していました。
二つの期間では差が明確です。前半の差は4.84ポイント、後半は-0.24ポイントでした。一般的な説明では、その差を生んだ年を示さずに数値だけが引用されます。しかし、論点はまさにその年にあります。季節性に関する統計は、ある一つの歴史的期間についての主張であり、その期間は、それを繰り返し語る人が選んだものです。
本当に八月と九月の影響なのか?
六カ月では分析が粗すぎます。暦を月単位に分けることで、夏場全体が一様に軟調なのか、それとも一部の月が結果の大半を占めるのかを確認できます。
各数値の背後にある正確な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))弱さが表れるのは九月です。九月の平均は-0.75%で、21年間のうち12年で上昇しており、中央値は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 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通りあります。一つの価格推移をこの空間で検索すれば、目を引く結果が見つかります。これは検索自体が持つ性質です。
Sell in Mayには、先週データから発掘されたルールにはない正当な利点があります。このサンプル期間が始まるはるか前から有名だったため、このページの各年は、当てはめた結果ではなくアウト・オブ・サンプル検証として機能します。検証で確認できる差は小さく、一つの月に集中しています。また、同じ期間でバイ・アンド・ホールドに劣後する売買ルールに結び付いています。先読みバイアスでは、バックテストがいかにしてひそかに事前に答えを学習するのかを説明しています。カレンダー・ルールはその典型例です。リターンを確認した後で月が選ばれているからです。
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.