Strasmore Research

Sell in May and Go Away funziona davvero?

Sell in May and Go Away, testato su due decenni di stagionalità dell’S&P 500. Scopri il gap estivo e quanto costa davvero il cambio di strategia.

“Sell in May and go away” è la più nota regola di calendario del mercato azionario: vendere alla fine di aprile, restare liquidi per tutta l’estate e ricomprare alla fine di ottobre. Misurata sui prezzi di un tracker dell’S&P 500, dall’ultima chiusura di aprile 2005 all’ultima chiusura di aprile 2026, la metà dell’anno compresa tra novembre e aprile registra in media un rendimento superiore rispetto a quella tra maggio e ottobre. Il differenziale è reale, ma inferiore a quanto lasci intendere il detto. Anche la metà estiva registra in media un guadagno: è questo il punto in cui la regola smette di funzionare come strategia.

Cosa dice la regola e come verificarla

L’espressione deriva da un’antica consuetudine londinese: lasciare la città dopo le corse primaverili e rientrare in autunno. Nella sua forma moderna e verificabile, è una regola di switch con due date. Si detiene un ampio indice azionario dall’ultimo giorno di trading di ottobre all’ultimo giorno di trading di aprile. Negli altri sei mesi non si detiene nulla.

Per verificarla servono due elementi che il proverbio non fornisce mai: una serie storica dei prezzi e una finestra temporale definita. Tutti i dati riportati di seguito utilizzano SPY, il più antico ETF sull’S&P 500, con prezzi ricavati dalle barre intraday a un minuto delle normali ore di mercato nella tabella global_markets.delayed_stocks_minute_aggs, dall’ultima chiusura di aprile 2005 all’ultima chiusura di aprile 2026. In questo caso, il rendimento mensile è calcolato confrontando l’ultimo prezzo delle normali ore di mercato del mese con quello del mese precedente, considerando solo il prezzo. I dividendi sono trattati in una sezione separata più avanti; come vengono misurati i rendimenti mensili spiega perché questa distinzione modifica il risultato.

La strategia «sell in May and go away» funziona? Il bilancio dal 2005 al 2026

QueryTracker S&P 500: da maggio a ottobre vs da novembre ad aprile, stagione per stagione
L'esatto SQL dietro ogni numero
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

Ogni punto abbina un’estate all’inverno successivo. Il grafico contiene 21 coppie complete: si apre con l’estate del 2005 e si chiude con l’inverno terminato ad aprile 2026.

Le due linee divergono nella maggior parte dei singoli anni e coincidono in quello peggiore. Tra la fine di aprile e la fine di ottobre 2008 la metà estiva ha registrato -29.81%, il valore peggiore della serie. L’inverno successivo ha registrato -10.03%. Chi aveva venduto ad aprile ha evitato una forte discesa, per poi rientrare nella fase finale del ribasso. Il calendario e la perdita hanno coinciso solo per metà del percorso.

Il gap estivo si è attenuato dal 2015?

La regola si riferisce davvero alle medie, che a loro volta dipendono dall’intervallo considerato. Dividere la serie nel 2015 crea due metà di lunghezza comparabile, calcolate con lo stesso metodo.

QueryIl divario stagionale per epoca: rendimenti medi semestrali e spread tra i due periodi
L'esatto SQL dietro ogni numero
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

Nelle 21 stagioni complessive, da maggio a ottobre la media è stata pari a 3.88%, mentre da novembre ad aprile è stata pari a 6.06%: uno spread di 2.18 punti percentuali. Questo spread rappresenta l’intero fondamento della regola. Basta guardare la colonna estiva: 16 di quelle estati si sono concluse a un livello superiore a quello iniziale. In altre parole, l’uscita media dal mercato ha fatto rinunciare a un guadagno, non ha evitato una perdita.

Le due metà divergono. Il primo blocco mostra uno spread di 4.84 punti, il secondo di -0.24. Le versioni più diffuse citano un gap senza indicare gli anni a cui si riferisce, ma sono proprio gli anni a costituire l’argomento. Ogni statistica stagionale descrive un determinato arco della storia, scelto da chi la ripropone.

È davvero un effetto di agosto e settembre?

Sei mesi sono un’unità di misura troppo ampia. Suddividere il calendario per mesi consente di capire se la finestra estiva è debole in modo uniforme oppure se l’intero risultato dipende da una sola parte.

QueryRendimento medio del tracker S&P 500 per mese solare, da maggio 2005 ad aprile 2026
L'esatto SQL dietro ogni numero
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

La debolezza si concentra a settembre. La media è stata pari a -0.75% e il mese si è chiuso in rialzo in 12 anni su 21, con una mediana di 0.38%. Agosto ha registrato una media di 0.28%. Luglio, al centro del periodo in cui il venditore resta fuori dal mercato, ha segnato una media di 2.63%, mentre ottobre, l’ultimo mese prima del rientro previsto dalla regola, ha registrato 0.97%.

In questa finestra l’effetto è circoscritto: un’unica fase debole a fine estate, mentre i mesi adiacenti si comportano in modo molto simile al resto dell’anno. Uscire dal mercato alla fine di aprile per evitare settembre significa rinunciare anche a maggio, giugno, luglio e agosto.

Quanto costa davvero il passaggio

Il differenziale stagionale è un dato lordo. Una regola deve tenere conto dei propri costi operativi.

QueryCrescita di un dollaro: investimento annuale vs investimento solo da novembre ad aprile
L'esatto SQL dietro ogni numero
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

Un dollaro investito durante tutte le stagioni, dalla fine di aprile 2005 alla fine di aprile 2026, sarebbe cresciuto fino a $6.21. Lo stesso dollaro investito sul mercato solo da novembre ad aprile, e inattivo nel resto dell’anno, sarebbe arrivato a $3.14. Entrambe le serie considerano soltanto i prezzi e non sottraggono alcun costo, quindi favoriscono la strategia basata sul passaggio stagionale. Il grafico non mostra quanto segue.

  • Due operazioni ogni anno, in ciascuna delle 21 stagioni. Oggi la commissione per l’eseguito è gratuita presso la maggior parte dei broker. Il bid-ask spread pagato per ogni operazione di andata e ritorno, invece, non lo è.
  • Imposte. In un conto soggetto a tassazione, la vendita di aprile realizza qualsiasi plusvalenza accumulata da novembre. Per costruzione, un periodo di detenzione da novembre ad aprile dura meno di un anno, quindi per un contribuente statunitense la plusvalenza è tassata con le aliquote previste per il breve termine.
  • Liquidità inattiva. La serie relativa all’investimento solo in inverno attribuisce un rendimento pari a zero al capitale rimasto fuori dal mercato. Un investitore reale lo impiegherebbe, e dove investire la liquidità inattiva illustra gli strumenti utilizzati a questo scopo.
  • Dividendi, che il pannello successivo quantifica.
QueryDistribuzioni di SPY per mese ex-dividend: nella finestra maggio-ottobre vs al di fuori
L'esatto SQL dietro ogni numero
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

Le date ex-dividend di SPY cadono a marzo, giugno, settembre e dicembre; quindi due delle quattro rientrano nei sei mesi in cui il venditore resta fuori dal mercato. In 2025, le distribuzioni per azione pari a $3.592 hanno avuto una data ex-dividend tra maggio e ottobre, contro $3.689 negli altri sei mesi. Le due colonne si muovono in parallelo lungo tutto il grafico. Restare fuori dal mercato per metà dell’anno significa rinunciare ogni anno a circa metà del reddito del fondo, oltre all’eventuale andamento dei prezzi in quei mesi. La data ex-dividend è il termine che determina chi riceve il pagamento.

Esiste un altro costo che non compare in alcuna voce. I rendimenti degli indici si concentrano in alcune sedute, e perdere le sedute migliori mostra in termini numerici l’impatto di una manciata di sessioni mancanti sul valore di lungo periodo. Restare fuori dal mercato sei mesi ogni anno significa perdere molte sedute. È la stessa logica alla base del dollar cost averaging inteso come disciplina sul tempo trascorso sul mercato, anziché come tentativo di individuare il momento giusto per entrarvi o uscirne.

Perché una nota regola di calendario merita cautela

Dodici mesi consentono 4.095 modi non vuoti di scegliere un sottoinsieme in cui investire. Se si cerca in questo spazio usando una sola serie storica dei prezzi, qualcosa apparirà sorprendente. È una proprietà della ricerca.

Sell in May presenta un vantaggio concreto rispetto a una regola individuata la scorsa settimana: era famosa molto prima dell’inizio di questo campione. Gli anni riportati in questa pagina costituiscono quindi un test out-of-sample, non un risultato adattato ai dati. Il test mostra un divario modesto, concentrato in un solo mese, associato a una regola di switch che nello stesso periodo ottiene risultati inferiori a una strategia buy and hold. Il look-ahead bias illustra i modi in cui un backtest può apprendere silenziosamente la risposta in anticipo. Le regole di calendario ne sono il caso da manuale: i mesi vengono scelti dopo che i rendimenti sono noti.

Domande frequenti

La strategia sell in May and go away funziona ancora?

Sui prezzi di SPY da aprile 2005 ad aprile 2026, il periodo da novembre ad aprile ha registrato una media di 6.06% contro 3.88% da maggio a ottobre. Il divario stagionale, quindi, resta presente nell’intero campione. Anche il semestre estivo ha comunque segnato in media un rialzo: 16 delle 21 estati si sono concluse a un livello superiore rispetto all’inizio.

Quali sono effettivamente i mesi più deboli?

In questo intervallo, la debolezza si concentra in settembre, che ha registrato una media di -0.75% e si è concluso in rialzo nel 12 delle 21 annate. Luglio, un altro mese escluso dalla regola, ha segnato una media di 2.63% nello stesso periodo.

Vendere a maggio è più redditizio che acquistare e mantenere?

Non in questo campione. Un dollaro investito senza interruzioni dalla fine di aprile 2005 è cresciuto fino a $6.21 ad aprile 2026, contro $3.14 per la rotazione limitata al periodo invernale. Il confronto non considera costi di negoziazione, imposte né dividendi.

Che cosa succede ai dividendi se si vende a maggio?

Le date ex-dividend di un fondo non si fermano durante l’estate. Due delle quattro date ex-dividend trimestrali di SPY cadono nel periodo da maggio a ottobre. Chi non detiene il fondo alla data ex-dividend non riceve quella distribuzione.

Un pattern stagionale equivale a una previsione?

No. Una media storica calcolata su 21 stagioni descrive ciò che è accaduto in un determinato intervallo. I singoli anni si discostano ampiamente da quella media, come mostra il primo grafico, e anche la scelta dell’intervallo incide sul risultato.


Ogni pannello qui riportato è una stored query con il relativo SQL. Modifica il ticker, sposta l’intervallo e verifica se il divario stagionale regge sul terminale Strasmore.

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