La stratégie Sell in May fonctionne-t-elle ?
Sell in May and Go Away testé sur deux décennies du S&P 500 : mesurez l’écart entre été et hiver, le coût réel du changement saisonnier et l’intérêt d’agir.
« Sell in May and go away » est la règle calendaire la plus connue des marchés actions : vendre fin avril, rester en liquidités pendant l’été, puis racheter fin octobre. Mesurée sur les cours d’un tracker du S&P 500, de la clôture de fin avril 2005 à celle de fin avril 2026, la période de novembre à avril affiche en moyenne un rendement supérieur à celle de mai à octobre. L’écart est réel, mais inférieur à ce que suggère le dicton. La période estivale enregistre elle aussi un gain moyen. C’est là que cette règle cesse de fonctionner comme stratégie.
Ce que dit la règle et comment la tester
Cette expression vient d’une ancienne habitude londonienne : quitter la ville après les réunions hippiques du printemps et y revenir à l’automne. Sous sa forme moderne et testable, il s’agit d’une règle d’alternance fondée sur deux dates. Vous détenez un indice boursier large du dernier jour de cotation d’octobre au dernier jour de cotation d’avril. Vous ne détenez rien pendant les six autres mois.
Pour la tester, deux éléments manquent dans le dicton : une série de cours et une fenêtre d’observation définie. Tous les chiffres ci-dessous utilisent SPY, le plus ancien ETF répliquant le S&P 500, valorisé à partir des données minute des heures normales de cotation figurant dans le tableau global_markets.delayed_stocks_minute_aggs, du cours de clôture final d’avril 2005 à celui d’avril 2026. Le rendement mensuel correspond ici à la variation entre le dernier cours des heures normales de cotation du mois et celui du mois précédent, hors dividendes. Les dividendes font l’objet d’une section distincte plus loin, et la mesure des rendements mensuels explique pourquoi cette distinction modifie le résultat.
La stratégie « sell in May and go away » fonctionne-t-elle ? Le bilan de 2005 à 2026
Le SQL exact derrière chaque chiffre
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 yearChaque point associe un été à l’hiver qui le suit. Le graphique présente 21 paires complètes, en commençant par l’été de 2005 et en se terminant par l’hiver qui s’est achevé en avril 2026.
Les deux courbes divergent pendant la plupart des années prises individuellement et convergent lors de la pire année. Entre la fin avril et la fin octobre 2008, la période estivale a affiché -29.81%, soit le niveau le plus bas de la série. L’hiver suivant a affiché -10.03%. Un détenteur qui aurait vendu en avril aurait évité une forte baisse, puis serait revenu sur le marché pour la dernière phase du recul. Le calendrier et la baisse n’ont coïncidé que pendant la moitié du parcours.
L’écart estival s’est-il estompé depuis 2015 ?
Ce sont les moyennes que le dicton met réellement en avant, et la période d’observation est la base de ces moyennes. En scindant la série en 2015, on obtient deux moitiés de longueur comparable, calculées de la même manière.
Le SQL exact derrière chaque chiffre
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 eraSur l’ensemble des 21 saisons, la période de mai à octobre a affiché une moyenne de 3.88%, contre 6.06% pour novembre à avril, soit un spread de 2.18 points de pourcentage. Ce spread constitue tout l’argument en faveur de cette règle. Il suffit de regarder la colonne estivale : 16 de ces étés se sont terminés au-dessus de leur niveau de départ. En moyenne, rester à l’écart a donc fait manquer une hausse plutôt qu’éviter une perte.
Les deux moitiés présentent des écarts distincts. La première affiche un spread de 4.84 points, contre -0.24 pour la seconde. Les reprises courantes de cette règle citent un écart sans préciser les années concernées. Or ce sont précisément les années qui fondent l’argument. Toute statistique saisonnière porte sur une période donnée de l’histoire, et cette période est choisie par celui qui la reprend.
S’agit-il vraiment d’un effet août-septembre ?
Six mois constituent une mesure trop grossière. Découper l’année en mois permet de déterminer si la période estivale est uniformément faible ou si l’essentiel du résultat vient d’une seule partie de cette période.
Le SQL exact derrière chaque chiffre
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))C’est en septembre que se concentre la faiblesse. Le mois a affiché une moyenne de -0.75% et a terminé en hausse pendant 12 des 21 années étudiées, avec une médiane de 0.38%. La moyenne d’août s’est établie à 0.28%. Juillet, situé au milieu de la période pendant laquelle le vendeur reste à l’écart, a affiché une moyenne de 2.63%, tandis qu’octobre, dernier mois avant le rachat prévu par la règle, a affiché une moyenne de 0.97%.
L’effet observé sur cette période est concentré : il se limite à une phase de faiblesse en fin d’été, les mois qui l’entourent ressemblant beaucoup au reste de l’année. Sortir du marché à la fin avril pour éviter septembre signifie aussi rester à l’écart en mai, juin, juillet et août.
Ce que coûte réellement le changement de régime
L’écart saisonnier est un chiffre brut. Une règle doit résister à ses propres frictions.
Le SQL exact derrière chaque chiffre
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 yearUn dollar investi pendant toutes les saisons, de la fin avril 2005 à la fin avril 2026, aurait atteint $6.21. Le même dollar investi sur le marché uniquement de novembre à avril, puis laissé sans emploi le reste du temps, aurait atteint $3.14. Les deux courbes ne tiennent compte que des cours, sans aucune déduction, ce qui embellit la stratégie de changement de régime. Voici ce que le graphique ne montre pas.
- Deux transactions par an, pour chacune des 21 saisons. Les frais de courtage sont désormais gratuits chez la plupart des brokers. En revanche, le bid-ask spread payé à chaque aller-retour ne l’est pas.
- La fiscalité. Sur un compte taxable, la vente en avril matérialise la plus-value accumulée depuis novembre. Une période de détention de novembre à avril est, par construction, inférieure à un an, ce qui soumet la plus-value au taux applicable aux gains à court terme pour un contribuable américain.
- Les liquidités inutilisées. La courbe qui ne conserve l’investissement qu’en hiver attribue un rendement nul aux capitaux restés à l’écart. En pratique, un investisseur les placerait ; la page où placer les liquidités inutilisées présente les instruments utilisés à cette fin.
- Les dividendes, dont le panneau suivant mesure l’impact.
Le SQL exact derrière chaque chiffre
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 yearLes dates ex-dividende de SPY tombent en mars, juin, septembre et décembre. Deux d’entre elles se situent donc pendant les six mois où le vendeur reste à l’écart. En 2025, les distributions de $3.592 par action correspondaient à des dates ex-dividende comprises entre mai et octobre, contre $3.689 pendant les six autres mois. Les deux colonnes évoluent de façon parallèle sur l’ensemble du graphique. Rester à l’écart pendant la moitié de l’année prive donc l’investisseur d’environ la moitié des revenus du fonds chaque année, indépendamment de l’évolution des cours sur ces mois. La date ex-dividende détermine qui reçoit le dividende.
Un autre coût n’apparaît sur aucune ligne. Les performances des indices se concentrent sur quelques séances, et manquer les meilleures séances permet de mesurer l’effet de quelques journées absentes sur un capital à long terme. Six mois sans investir chaque année représentent un grand nombre de séances manquées. C’est le même raisonnement que celui qui sous-tend l’investissement programmé, appliqué à la régularité du temps passé sur le marché plutôt qu’au market timing.
Pourquoi une règle calendaire célèbre doit être examinée avec prudence
Douze mois permettent de sélectionner un sous-ensemble investi de 4 095 façons non vides. Si vous explorez cet espace à partir d’un seul historique de cours, un résultat finira par sembler frappant. C’est une propriété de la recherche.
La règle Sell in May présente un avantage honnête par rapport à une règle extraite la semaine dernière : elle était célèbre bien avant le début de cet échantillon. Les années présentées ici constituent donc un test hors échantillon, et non un résultat ajusté aux données. Le test fait ressortir un écart modeste, concentré sur un mois, associé à une règle de rotation qui sous-performe une stratégie d’achat-conservation sur la même période. Le biais d’anticipation explique comment un backtest apprend discrètement sa réponse à l’avance. Les règles calendaires en sont l’exemple classique : les mois sont sélectionnés une fois les performances connues.
FAQ
La stratégie « sell in May and go away » fonctionne-t-elle encore ?
Pour les cours de SPY d’avril 2005 à avril 2026, la période de novembre à avril a affiché une moyenne de 6.06%, contre 3.88% pour la période de mai à octobre. L’écart saisonnier subsiste donc sur l’ensemble de l’échantillon. La période estivale a également enregistré en moyenne une hausse, 16 des 21 périodes estivales se terminant à un niveau supérieur à celui de leur début.
Quels sont réellement les mois les plus faibles ?
Sur cette période, la faiblesse se concentre en septembre. Le rendement moyen s’est établi à -0.75%, et le mois a terminé en hausse dans 12 des 21 années. Juillet, autre mois exclu par la stratégie, a affiché une moyenne de 2.63% sur la même période.
Vendre en mai surperforme-t-il une stratégie d’achat-conservation ?
Pas sur cet échantillon. Un dollar investi en continu depuis la fin avril 2005 aurait atteint $6.21 en avril 2026, contre $3.14 pour la rotation limitée à la période hivernale. Cette comparaison ne tient compte ni des coûts de transaction, ni de la fiscalité, ni des dividendes.
Que deviennent les dividendes si vous vendez en mai ?
Les dates ex-dividende d’un fonds ne sont pas suspendues pendant l’été. Deux des quatre dates ex-dividende trimestrielles de SPY tombent entre mai et octobre. Un porteur qui n’est pas investi dans le fonds à la date ex-dividende ne reçoit pas la distribution correspondante.
Un schéma saisonnier équivaut-il à une prévision ?
Non. Une moyenne historique calculée sur 21 périodes décrit ce qui s’est produit sur une période donnée. Les années individuelles s’écartent fortement de cette moyenne, comme le montre le premier graphique, et le choix de la période constitue lui-même une décision.
Chaque panneau présenté ici correspond à une requête stockée, avec son code SQL associé. Modifiez le ticker, changez la période et vérifiez si l’écart saisonnier se maintient sur le terminal Strasmore.