Sell in May and Go Away funciona?
Testamos duas décadas de temporadas do S&P 500: veja o tamanho da diferença no verão e quanto a troca sazonal realmente custa na prática.
“Sell in May and go away” é a regra de calendário mais conhecida do mercado acionário: vender no fim de abril, manter o dinheiro em caixa durante o verão e recomprar no fim de outubro. Considerando as cotações de ETFs que acompanham o S&P 500, do fechamento do último pregão de abril de 2005 ao fechamento do último pregão de abril de 2026, o semestre de novembro a abril registra, em média, um retorno maior do que o semestre de maio a outubro. A diferença existe, mas é menor do que o ditado sugere. O semestre de verão também registra, em média, uma alta. É aí que a regra deixa de funcionar como estratégia.
O que a regra diz e como testá-la
A expressão vem de um antigo hábito londrino de deixar a cidade depois das corridas de primavera e voltar no outono. Na sua forma moderna e testável, é uma regra de alternância com duas datas. Mantém-se um índice amplo de ações desde o último dia de negociação de outubro até o último dia de negociação de abril. Nos outros seis meses, não se mantém posição.
Para testá-la, são necessários dois elementos que o ditado nunca fornece: uma série de preços e uma janela definida. Todos os números abaixo usam o SPY, o ETF do S&P 500 mais antigo, com preços baseados em barras de um minuto no horário regular, na tabela global_markets.delayed_stocks_minute_aggs, desde o fechamento final de abril de 2005 até o fechamento final de abril de 2026. O retorno mensal aqui compara o último preço no horário regular do mês com o preço do mês anterior, considerando apenas o preço. Os dividendos têm uma seção própria mais abaixo, e como os retornos mensais são medidos explica por que essa distinção altera o resultado.
A estratégia de vender em maio e sair do mercado funciona? O histórico de 2005 a 2026
O SQL exato por trás de cada número
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 yearCada ponto combina um verão com o inverno que o sucede. O gráfico contém 21 pares completos, começando com o verão de 2005 e terminando com o inverno encerrado em abril de 2026.
As duas linhas divergem na maioria dos anos e coincidem no pior deles. Entre o fim de abril e o fim de outubro, 2008 o semestre de verão registrou -29.81%, a leitura mais baixa do período. O inverno seguinte registrou -10.03%. Quem vendeu em abril evitou uma forte queda e depois voltou ao mercado para a etapa final da baixa. O calendário e a perda coincidiram apenas durante metade do percurso.
A diferença sazonal perdeu força desde 2015?
As médias são o que o ditado realmente afirma, e o período é a base dessas médias. Dividir a série em 2015 produz duas metades de extensão comparável, calculadas da mesma forma.
O SQL exato por trás de cada número
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 eraAo longo de todas as 21 temporadas, o período de maio a outubro teve média de 3.88%, enquanto o de novembro a abril teve média de 6.06%, uma diferença de 2.18 pontos percentuais. Essa diferença é toda a base da regra. Observe a coluna do verão ao lado: 16 desses verões terminaram em alta em relação ao início, portanto ficar fora do mercado, em média, fez o investidor deixar de capturar um ganho, e não evitar uma perda.
As duas metades apresentam resultados diferentes. O bloco anterior mostra uma diferença de 4.84 pontos, e o posterior, de -0.24. Repetições populares citam uma diferença sem informar os anos a que ela se refere, mas são os anos que sustentam o argumento. Toda estatística sazonal é uma afirmação sobre um período específico da história, e esse período é escolhido por quem a repete.
O efeito ocorre realmente em agosto e setembro?
Seis meses são uma medida pouco precisa. Dividir o calendário por mês permite avaliar se o período de verão é uniformemente fraco ou se uma parte dele concentra todo o resultado.
O SQL exato por trás de cada número
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))A fraqueza está em setembro. O mês teve média de -0.75% e terminou em alta em 12 de 21 anos, com mediana de 0.38%. Agosto teve média de 0.28%. Julho, no meio do período que o vendedor deixa de fora, teve média de 2.63%. Outubro, o último mês antes de a regra voltar a comprar, teve média de 0.97%.
O efeito nesse período é restrito: há uma única fase de fraqueza no fim do verão, enquanto os meses ao redor se comportam de forma semelhante ao restante do calendário. Sair no fim de abril para evitar setembro também significa ficar fora de maio, junho, julho e agosto.
Quanto a troca realmente custa
A diferença sazonal é um número bruto. Uma regra precisa sobreviver às suas próprias fricções.
O SQL exato por trás de cada número
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 yearUm dólar mantido durante todas as estações, do fim de abril 2005 ao fim de abril 2026, cresceu para US$6.21. O mesmo dólar investido no mercado apenas de novembro a abril, e mantido parado no restante do período, cresceu para US$3.14. Ambas as linhas mostram apenas o preço, sem qualquer dedução, o que favorece a regra de troca. Veja o que o gráfico não mostra.
- Duas operações por ano, em cada uma das 21 estações. Hoje, a ordem é gratuita na maioria das corretoras. O spread entre compra e venda pago em cada ida e volta não é.
- Impostos. Numa conta tributável, a venda em abril realiza qualquer ganho acumulado desde novembro. Por definição, uma posição mantida de novembro a abril dura menos de um ano, o que coloca o ganho nas alíquotas de curto prazo para um contribuinte nos EUA.
- Dinheiro parado. A linha que considera apenas o inverno atribui rendimento zero ao dinheiro mantido fora do mercado. Um investidor real o aplicaria em algum instrumento, e onde aplicar o dinheiro parado aborda as alternativas usadas para isso.
- Dividendos, que o painel seguinte quantifica.
O SQL exato por trás de cada número
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 yearAs datas ex-dividendo do SPY ocorrem em março, junho, setembro e dezembro. Portanto, duas das quatro ficam dentro dos seis meses em que o vendedor permanece fora do mercado. Em 2025, as distribuições de US$3.592 por cota tiveram data ex-dividendo entre maio e outubro, contra US$3.689 nos outros seis meses. As duas colunas acompanham-se ao longo de todo o gráfico. Ficar fora do mercado durante metade do ano implica abrir mão de aproximadamente metade da renda do fundo todos os anos, além do efeito da variação de preço nesses meses. A data ex-dividendo é o corte que determina quem recebe o pagamento.
Há ainda um custo que não aparece em nenhuma linha. Os retornos dos índices chegam em grupos, e perder os melhores dias mostra o efeito de algumas sessões ausentes sobre um saldo de longo prazo. Ficar fora do mercado seis meses por ano significa perder muitas sessões. Essa é a mesma lógica por trás do investimento periódico como disciplina de permanência no mercado, e não de tentativa de antecipar seus movimentos.
Por que uma regra de calendário famosa merece desconfiança
Doze meses permitem 4.095 formas não vazias de escolher um subconjunto para investir. Ao pesquisar esse espaço em uma única série histórica de preços, alguma combinação parecerá impressionante. Essa é uma característica da própria pesquisa.
“Sell in May” tem uma vantagem honesta sobre uma regra extraída na semana passada: era famosa muito antes do início desta amostra. Assim, os anos apresentados nesta página funcionam como um teste fora da amostra, e não como um resultado ajustado aos dados. O teste mostra uma diferença modesta, concentrada em um mês, associada a uma regra de alternância que fica atrás da estratégia de comprar e manter no mesmo período. O viés de antecipação explica como um backtest aprende silenciosamente a resposta com antecedência. As regras de calendário são o exemplo clássico: os meses são escolhidos depois que os retornos já são conhecidos.
Perguntas frequentes
Vender em maio e sair do mercado ainda funciona?
Nos preços do SPY entre abril de 2005 e abril de 2026, o período de novembro a abril teve média de 6.06%, contra 3.88% de maio a outubro. Portanto, a diferença sazonal permanece na amostra completa. O semestre de verão ainda registrou ganho médio: 16 dos 21 verões terminaram em alta em relação ao início.
Quais meses são, de fato, os mais fracos?
Nesta janela, a fraqueza concentra-se em setembro, que teve média de -0.75% e terminou em alta em 12 dos 21 anos. Julho, outro mês fora da estratégia, teve média de 2.63% no mesmo período.
Vender em maio supera comprar e manter?
Não nesta amostra. Um dólar mantido continuamente desde o fim de abril 2005 cresceu para $6.21 até abril 2026, contra $3.14 na estratégia de alternância exclusiva para o inverno. Essa comparação não considera custos de negociação, impostos nem dividendos.
O que acontece com os dividendos quando se vende em maio?
As datas ex-dividendo de um fundo não são suspensas durante o verão. Duas das quatro datas ex-dividendo trimestrais do SPY caem entre maio e outubro. O investidor que estiver fora do fundo na data ex-dividendo não recebe essa distribuição.
Um padrão sazonal é o mesmo que uma previsão?
Não. Uma média histórica de 21 temporadas descreve o que ocorreu em uma janela definida. Os anos individuais variam bastante em torno dessa média, como mostra o primeiro gráfico, e a própria janela é uma escolha.
Cada painel aqui corresponde a uma consulta armazenada, com o respectivo SQL anexado. Altere o ticker, mude a janela e verifique se a diferença sazonal se mantém no terminal Strasmore.