Strasmore Research

¿Funciona la regla de vender en mayo?

Vender en mayo y volver en noviembre, probado durante dos décadas del S&P 500. Conoce la brecha de verano y el costo real de cambiar de estrategia.

“Sell in May and go away” es la regla estacional más conocida del mercado bursátil: vender al cierre de abril, mantener el efectivo durante el verano y volver a comprar al cierre de octubre. Medido con los precios de un tracker del S&P 500 desde el último cierre de abril de 2005 hasta el último cierre de abril de 2026, el semestre de noviembre a abril sí registra, en promedio, una rentabilidad superior a la del semestre de mayo a octubre. La diferencia existe, pero es menor de lo que sugiere el dicho. El semestre de verano también registra, en promedio, una ganancia. Ahí es donde la regla deja de funcionar como plan de inversión.

Qué dice la regla y cómo se pone a prueba

La frase proviene de una antigua costumbre londinense: dejar la ciudad después de las reuniones hípicas de primavera y regresar en otoño. En su forma moderna y comprobable, es una regla de rotación con dos fechas. Se mantiene un índice amplio de acciones desde el último día de negociación de octubre hasta el último día de negociación de abril. Durante los otros seis meses no se mantiene ninguna posición.

Para probarla se necesitan dos elementos que el dicho nunca proporciona: una serie de precios y una ventana definida. Todas las cifras siguientes utilizan SPY, el ETF del S&P 500 más antiguo, con precios basados en barras de un minuto del horario regular en la tabla global_markets.delayed_stocks_minute_aggs, desde el cierre final de abril de 2005 hasta el cierre final de abril de 2026. Aquí, la rentabilidad mensual compara el último precio del horario regular de un mes con el del mes anterior y considera únicamente el precio. Los dividendos se analizan en su propia sección más adelante, y cómo se miden las rentabilidades mensuales explica por qué esa distinción cambia la respuesta.

¿Funciona vender en mayo y ausentarse del mercado? El registro de 2005 a 2026

ConsultaTracker del S&P 500: de mayo a octubre frente a noviembre a abril, temporada por temporada
El SQL exacto detrás de cada cifra
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

Cada punto empareja un verano con el invierno que le sigue. El gráfico contiene 21 pares completos, comienza con el verano de 2005 y termina con el invierno que concluyó en abril de 2026.

Las dos líneas discrepan en la mayoría de los años individuales y coinciden en el peor de ellos. Entre finales de abril y finales de octubre 2008, el tramo de verano registró -29.81%, la lectura más profunda de toda la serie. El invierno siguiente registró -10.03%. Un tenedor que hubiera vendido en abril habría evitado una fuerte caída y luego habría vuelto a entrar para el último tramo bajista. El calendario y el daño coincidieron solo durante la mitad del recorrido.

¿Se ha desvanecido la brecha del verano desde 2015?

Los promedios son lo que realmente afirma el dicho, y el periodo es la base de esos promedios. Dividir la serie en 2015 permite obtener dos mitades de duración comparable, calculadas de la misma manera.

ConsultaLa brecha estacional por era: rendimientos promedio semestrales y el spread entre ellos
El SQL exacto detrás de cada cifra
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

En las 21 temporadas, el periodo de mayo a octubre registró un promedio de 3.88%, frente a 6.06% de noviembre a abril, una diferencia de 2.18 puntos porcentuales. Esa diferencia es la base completa de la regla. Si se observa la columna de verano junto a esos datos, 16 de esos veranos terminaron al alza respecto de su inicio. Por tanto, mantenerse fuera del mercado en promedio implicó perder una ganancia, no evitar una pérdida.

Las dos mitades presentan resultados distintos. El bloque inicial muestra una diferencia de 4.84 puntos, mientras que el posterior registra -0.24. Las versiones populares suelen citar una brecha sin indicar los años que la sustentan, pero los años son el argumento. Toda estadística estacional es una afirmación sobre un periodo concreto de la historia, y ese periodo depende de la elección de quien la repite.

¿Realmente existe un efecto de agosto y septiembre?

Seis meses son una medida demasiado amplia. Dividir el calendario por meses permite determinar si el periodo de verano es débil de manera uniforme o si una sola parte concentra todo el resultado.

ConsultaRendimiento promedio mensual del tracker del S&P 500, de mayo de 2005 a abril de 2026
El SQL exacto detrás de cada cifra
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 debilidad se concentra en septiembre. Su promedio fue de -0.75% y terminó al alza en 12 de 21 años, con una mediana de 0.38%. El promedio de agosto fue de 0.28%. Julio, que queda en medio del periodo que el vendedor evita, tuvo un promedio de 2.63%. Octubre, el último mes antes de que la regla vuelva a comprar, registró un promedio de 0.97%.

El efecto en este periodo es acotado: un solo tramo débil al final del verano, mientras que los meses cercanos se comportan de forma muy similar al resto del calendario. Salir al cierre de abril para evitar septiembre también implica perderse mayo, junio, julio y agosto.

Lo que realmente cuesta hacer el cambio

La brecha estacional es un dato bruto. Una regla debe superar sus propios costos de operación.

ConsultaCrecimiento de un dólar: mantener todo el año frente a mantener solo de noviembre a abril
El SQL exacto detrás de cada cifra
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 dólar mantenido durante todas las temporadas, desde finales de abril 2005 hasta finales de abril 2026, creció a $6.21. Ese mismo dólar invertido en el mercado solo de noviembre a abril, y en efectivo el resto del tiempo, creció a $3.14. Ambas líneas muestran únicamente el precio, sin descontar ningún costo, lo que favorece a la regla de cambio. Esto es lo que el gráfico no muestra.

  • Dos operaciones cada año, en cada una de las 21 temporadas. Actualmente, la operación no tiene comisión en la mayoría de los brokers. Pero el spread entre bid y ask de cada ida y vuelta no es gratuito.
  • Impuestos. En una cuenta gravable, la venta de abril materializa cualquier ganancia acumulada desde noviembre. Por construcción, una posición de noviembre a abril dura menos de un año, por lo que para un contribuyente estadounidense la ganancia tributa a tasas de corto plazo.
  • Efectivo ocioso. La línea que solo permanece invertida durante el invierno asigna un rendimiento de cero al dinero que queda fuera del mercado. Un inversor real lo colocaría en algún instrumento, y dónde colocar el efectivo ocioso explica cuáles se utilizan para ese fin.
  • Dividendos, que el siguiente panel cuantifica.
ConsultaDistribuciones de SPY por mes ex-dividendo: dentro de la ventana de mayo a octubre frente a fuera de ella
El SQL exacto detrás de cada cifra
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

Las fechas ex-dividendo de SPY caen en marzo, junio, septiembre y diciembre. Por tanto, dos de las cuatro ocurren durante los seis meses en que el inversor permanece fuera. En 2025, las distribuciones de $3.592 por acción tuvieron fecha ex-dividendo entre mayo y octubre, frente a $3.689 en los otros seis meses. Las dos columnas se mueven de forma paralela durante todo el gráfico. Permanecer fuera del mercado la mitad del año implica renunciar aproximadamente a la mitad de los ingresos del fondo cada año, además de cualquier variación del precio durante esos meses. La fecha ex-dividendo determina quién recibe el pago.

Hay otro costo que no aparece como una partida separada. Las rentabilidades de los índices se concentran en determinados periodos, y perderse los mejores días muestra cómo unas pocas sesiones ausentes afectan un saldo de largo plazo. Seis meses fuera del mercado cada año representan muchas sesiones ausentes. Ese es el mismo principio matemático que sustenta el promedio del costo en dólares como disciplina para permanecer invertido, en lugar de intentar acertar el momento de entrada y salida.

Por qué una regla de calendario famosa merece cautela

Doce meses admiten 4,095 formas no vacías de elegir un subconjunto para invertir. Si se busca en ese espacio utilizando un solo historial de precios, alguna combinación parecerá llamativa. Esa es una propiedad de la búsqueda.

Sell in May tiene una ventaja legítima frente a una regla descubierta la semana pasada: era famosa mucho antes de que comenzara esta muestra. Por eso, los años de esta página funcionan como una prueba fuera de muestra, no como un resultado ajustado a los datos. La prueba muestra una brecha modesta, concentrada en un mes, asociada con una regla de rotación que queda por detrás de comprar y mantener durante el mismo periodo. El sesgo de anticipación explica las formas en que un backtest aprende silenciosamente la respuesta de antemano. Las reglas de calendario son el ejemplo clásico: los meses se eligen después de conocer los rendimientos.

Preguntas frecuentes

¿Sigue funcionando vender en mayo y retirarse del mercado?

En los precios de SPY entre abril de 2005 y abril de 2026, el periodo de noviembre a abril promedió 6.06%, frente a 3.88% entre mayo y octubre. Por lo tanto, la brecha estacional se mantiene en la muestra completa. El semestre de verano también registró una ganancia promedio: 16 de los 21 veranos terminaron al alza respecto de su inicio.

¿Cuáles son realmente los meses débiles?

En este periodo, la debilidad se concentra en septiembre, que promedió -0.75% y terminó al alza en 12 de 21 años. Julio, otro mes excluido por la regla, promedió 2.63% durante el mismo periodo.

¿Vender en mayo supera a comprar y mantener?

No en esta muestra. Un dólar invertido de forma continua desde el cierre de abril 2005 creció hasta $6.21 en abril 2026, frente a $3.14 con el cambio estacional que solo mantiene la inversión durante el invierno. Esta comparación no incluye costos de operación, impuestos ni dividendos.

¿Qué ocurre con los dividendos si se vende en mayo?

Las fechas ex-dividendo de un fondo no se detienen durante el verano. Dos de las cuatro fechas ex-dividendo trimestrales de SPY caen entre mayo y octubre. Un tenedor que no mantiene el fondo en una fecha ex-dividendo no recibe esa distribución.

¿Es lo mismo un patrón estacional que una predicción?

No. Un promedio histórico de 21 temporadas describe lo ocurrido durante un periodo determinado. Los años individuales muestran una dispersión amplia alrededor de ese promedio, como indica el primer gráfico, y la elección del periodo también influye.


Cada panel aquí corresponde a una consulta almacenada con su SQL adjunto. Cambia el ticker, modifica el periodo y comprueba si la brecha estacional se mantiene en la terminal de Strasmore.

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