¿Qué es la máxima caída? Profundidad y recuperación
La máxima caída mide el mayor descenso de una serie desde un máximo hasta un mínimo. Conoce su profundidad y por qué recuperar un nuevo máximo puede tardar más.
La máxima caída es el mayor descenso desde un máximo hasta un mínimo en una serie de valores, medido como porcentaje del máximo acumulado. Una cuenta que sube a $120,000, cae a $84,000 y luego se recupera tiene una máxima caída de 30 %. Ese dato permanece para siempre porque la estadística registra el peor periodo de toda la historia, no la situación actual. La mayoría de las personas menciona la magnitud y se detiene ahí. Pero dentro de la misma estadística hay otros dos datos: el tiempo desde el máximo hasta el mínimo y el periodo, mucho más largo, desde ese mínimo hasta alcanzar un nuevo máximo.
¿Cómo se calcula la máxima caída?
Todo el cálculo consiste en recorrer la serie una sola vez. En cada observación se actualiza el máximo acumulado, se compara el valor actual con ese máximo y se conserva la peor lectura registrada hasta ese momento.
- Establece el máximo acumulado en el primer valor.
- Con cada nuevo valor, eleva el máximo si el valor es mayor.
- Calcula la caída en ese punto: valor dividido entre el máximo, menos uno.
- Conserva la lectura más negativa. Esa es la máxima caída.
No intervienen una serie de rendimientos, una estimación de volatilidad ni ningún supuesto sobre la distribución. El bucle se ejecuta sobre una lista simple de números con la biblioteca estándar de Python. En una instalación nueva de Ubuntu, instala primero el intérprete:
apt-get update && apt-get install -y python3
Guarda el bucle como maxdd.py. Los precios siguientes son una serie inventada de diez puntos, lo bastante pequeña para comprobarla manualmente:
prices = [100.0, 104.0, 98.0, 92.0, 95.0, 88.0, 90.0, 101.0, 99.0, 106.0]
peak = prices[0]
max_dd = 0.0
for price in prices:
if price > peak:
peak = price
drawdown = price / peak - 1.0
if drawdown < max_dd:
max_dd = drawdown
print(f"maximum drawdown: {max_dd * 100:.1f}%")
Ejecuta python3 maxdd.py y mostrará maximum drawdown: -15.4%. Compruébalo manualmente: el máximo antes del mínimo es 104, el mínimo es 88 y 88 dividido entre 104 equivale a 0.846. La serie termina después en 106, un máximo histórico, pero la caída de 15.4% sigue siendo la máxima registrada. La máxima caída es un registro permanente del peor momento de una muestra y no indica dónde se encuentra la serie actualmente. Dos variables adicionales en el mismo bucle permiten capturar el momento: el índice en el que se estableció el máximo y el índice en el que se registró la peor lectura.
Cómo se ve una curva de drawdown
Una curva de drawdown conserva el paso 3 en cada punto, en lugar de reducirlo a un único peor valor. La línea permanece en cero cada vez que la serie marca un nuevo máximo y se mantiene por debajo de cero entre un máximo y otro. Por eso, este intervalo se denomina “underwater”. Esta es la curva de SPY, un ETF que replica el S&P 500, con base en los cierres de fin de mes desde enero de 2016.
El SQL exacto detrás de cada cifra
WITH monthly AS (
SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY month_start
),
runs AS (
SELECT month_start,
close_px,
max(close_px) OVER (ORDER BY month_start
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM monthly
)
SELECT formatDateTime(month_start, '%Y-%m') AS month,
round(100 * (close_px / running_peak - 1), 2) AS drawdown_pct
FROM runs
ORDER BY month_startEn 127 observaciones de fin de mes, la línea pasa largos periodos cerca de cero y cae en algunos valles profundos. El último mes registrado se sitúa en -1.27% frente al máximo acumulado. La forma de la curva muestra dos aspectos importantes. Las recuperaciones son ascensos lentos, no rebotes pronunciados. Además, cada nuevo máximo restablece la curva en cero y borra la memoria visual de lo ocurrido antes.
¿Cuánto tiempo se necesita para recuperarse de una caída?
Una sola caída incluye tres cifras distintas. Tratarlas como una sola es el error más común al leer una tabla de desempeño:
- Profundidad: cuánto cayó el valor desde su máximo, en porcentaje.
- Tiempo hasta el mínimo: días calendario desde el máximo hasta el mínimo.
- Tiempo de recuperación: días calendario desde ese mínimo hasta un nuevo máximo.
La tercera suele ser la más larga. Además, es la que nunca muestra una cifra de portada. El panel siguiente reconstruye cada periodo completo bajo el agua de SPY desde 2016, con base en los cierres diarios. Un periodo comienza el día en que se establece un máximo y termina el día en que el fondo cierra por primera vez por encima de ese nivel.
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
runs AS (
SELECT session_date,
close_px,
max(close_px) OVER (ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM daily
),
episodes AS (
SELECT running_peak AS peak_px,
min(session_date) AS peak_date,
argMin(session_date, close_px) AS trough_date,
min(close_px) AS trough_px
FROM runs
GROUP BY running_peak
),
sequenced AS (
SELECT peak_px,
peak_date,
trough_date,
trough_px,
leadInFrame(peak_date, 1) OVER (ORDER BY peak_date
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS recovery_date
FROM episodes
)
SELECT formatDateTime(peak_date, '%b %Y') AS episode_label,
round(100 * (1 - trough_px / peak_px), 1) AS fall_from_peak_pct,
dateDiff('day', peak_date, trough_date) AS days_to_trough,
dateDiff('day', trough_date, recovery_date) AS days_to_new_high,
dateDiff('day', peak_date, recovery_date) AS days_underwater
FROM sequenced
WHERE recovery_date > trough_date
AND round(100 * (1 - trough_px / peak_px), 1) >= 5
ORDER BY fall_from_peak_pct DESC
LIMIT 8El periodo completo más profundo de la lista comienza en Feb 2020 y alcanza 34.2% por debajo del máximo anterior. Pasó 33 días calendario cayendo y 148 recuperándose, para un total de 181 días bajo el agua. La siguiente entrada, de Jan 2022, es menos profunda, con 25.4%, y mantuvo al fondo por debajo de su máximo anterior durante 746 días.
La profundidad y la duración pueden comportarse de forma completamente distinta. Una caída violenta con una recuperación rápida y un descenso moderado que se prolonga durante años quedan reducidos a un solo porcentaje. La caída de marzo de 2020 es el ejemplo clásico del primer caso, mientras que cómo se recuperan los mercados de las caídas aborda la segunda etapa del recorrido.
Por qué el drawdown máximo empeora cuanto más tiempo se mide
El drawdown máximo es un máximo, por lo que añadir historial solo puede mantenerlo sin cambios o hacerlo más profundo. El máximo acumulado en una ventana más larga es, como mínimo, igual de alto en cada punto que el máximo en una ventana más corta. Eso determina el resultado matemático. Medir el mismo fondo en cinco ventanas que terminan el 31 de julio de 2026 muestra el efecto.
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-07-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
scoped AS (
SELECT arrayJoin([1, 2, 3, 5, 10]) AS lookback_years,
session_date,
close_px
FROM daily
),
windowed AS (
SELECT lookback_years, session_date, close_px
FROM scoped
WHERE session_date >= subtractYears(toDate('2026-07-31'), lookback_years)
),
runs AS (
SELECT lookback_years,
session_date,
close_px,
max(close_px) OVER (PARTITION BY lookback_years ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM windowed
)
SELECT concat(toString(lookback_years), if(lookback_years = 1, ' year', ' years')) AS lookback,
round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
formatDateTime(argMax(session_date, 1 - close_px / running_peak), '%b %Y') AS worst_point
FROM runs
GROUP BY lookback_years
ORDER BY lookback_yearsEn la ventana móvil de 1 year, la peor caída medida fue de 9.1%. Al extender la misma serie a 10 years, el resultado es 34.2%, y el peor punto se produjo en Mar 2020. El fondo no se volvió más riesgoso. La muestra se hizo más larga.
La misma aritmética distorsiona las comparaciones entre estrategias. Un backtest de tres años y otro de veinte años pueden describir un comportamiento idéntico y aun así reportar drawdowns muy diferentes. Por eso, la cifra aporta poco si no se indica la ventana de medición. Sesgo de anticipación en backtesting explica otra forma en que un backtest de apariencia impecable puede favorecerse a sí mismo.
Máxima caída vs. volatilidad
La volatilidad mide el tamaño típico de un movimiento diario en cualquier dirección. La máxima caída mide una trayectoria bajista específica. Ambas son medidas de riesgo, pero responden preguntas distintas. El panel las presenta lado a lado para ocho acciones ampliamente conocidas durante los cinco años hasta el 31 de julio de 2026, con la volatilidad anualizada a partir de los cierres diarios.
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'KO', 'JNJ', 'CVX', 'VZ', 'PG')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
runs AS (
SELECT ticker,
session_date,
close_px,
max(close_px) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak,
lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily
)
SELECT ticker,
round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
round(100 * sqrt(252) * stddevSampIf(close_px / prev_close - 1, prev_close > 0), 1) AS annualized_volatility_pct
FROM runs
GROUP BY ticker
HAVING countIf(prev_close > 0) > 20
ORDER BY max_drawdown_pct DESCLea ambas columnas en conjunto. VZ registra la caída más profunda del grupo, de 45.4%, frente a una volatilidad anualizada de 22.6%. En el extremo de menor caída, KO retrocedió 20.9%, con una volatilidad de 16.7%. La volatilidad es un promedio de todos los días del periodo, y los promedios pueden ocultar una caída prolongada y gradual. La máxima caída refleja la peor trayectoria que recorrió realmente el precio. Una posición tranquila que baja lentamente durante dos años puede registrar una máxima caída profunda con una volatilidad poco llamativa.
La anomalía de baja volatilidad analiza el comportamiento de las acciones más estables a largo plazo, mientras que el dimensionamiento de posiciones según el criterio de Kelly muestra cómo la tolerancia a una caída se traduce en el tamaño de una posición.
Lo que el número no puede decirte
Conviene tener presentes cuatro limitaciones:
- Es una trayectoria realizada. El mismo proceso podría haber producido una cifra mucho peor con otra muestra.
- Depende de la longitud de la muestra. Por eso, dos drawdowns solo se pueden comparar en ventanas equivalentes.
- Depende de la frecuencia de muestreo. Los cierres de fin de mes ocultan los mínimos intradía y producen una cifra menor que los cierres diarios durante el mismo periodo.
- No aporta información sobre el futuro. Estar 30% por debajo de un máximo no dice nada sobre si el punto 31 llegará mañana.
Esta última limitación explica por qué un sistema automatizado necesita una política de drawdown y no solo un umbral de drawdown. «Detenerse en 20%» responde una pregunta y deja otras dos sin respuesta: qué ocurre con las posiciones abiertas al detenerse y qué evidencia permite volver a activar el sistema. Interruptores de circuito para bots de trading analiza la estructura de esa política. El costo de una regla plana y arbitraria aparece durante la recuperación, cuando un sistema que se detiene cerca del mínimo y se reinicia tarde queda fuera del repunte. Perderse los mejores días cuantifica ese efecto.
Hay un detalle de medición que importa antes de comparar dos cifras: el drawdown de la serie de precios de un fondo y el drawdown de una cuenta real difieren cuando entra o sale efectivo y cuando se reciben dividendos. cómo se miden los rendimientos mensuales explica este punto en detalle.
Preguntas frecuentes sobre la máxima caída
¿Cuál es una máxima caída aceptable?
No existe una cifra universal. Se necesita un punto de referencia y un periodo de medición. En los diez años hasta el 31 de julio de 2026, la peor caída de SPY desde un máximo previo, medida con cierres diarios, fue de 34.2%. Una estrategia que muestra una cifra menor en una muestra más corta no necesariamente ha sido más segura.
¿La máxima caída es lo mismo que la volatilidad?
No. La volatilidad describe el movimiento diario habitual. La máxima caída describe la peor trayectoria entre un máximo y un mínimo. Una posición de baja volatilidad que desciende de forma sostenida durante dos años puede registrar una caída más profunda que otra con movimientos bruscos que continúa marcando nuevos máximos.
¿Cuánto tarda en recuperarse una máxima caída?
Depende del caso. Además, la recuperación suele ocupar la mayor parte del periodo. Para SPY desde 2016, el tramo completo más largo por debajo de un máximo previo duró 181 días calendario desde el máximo hasta alcanzar un nuevo máximo. De ese periodo, 33 días transcurrieron con caídas.
¿La máxima caída permite predecir pérdidas futuras?
No. Describe una trayectoria que ya ocurrió. Además, una muestra más larga casi siempre produce una cifra mayor. Registra lo que una estrategia ha soportado hasta ahora, pero no establece ningún límite para lo que pueda ocurrir después.
Todos los paneles anteriores almacenan el SQL que los genera. Abra uno, cambie el ticker o el periodo y ejecute el mismo cálculo de caída en la terminal de Strasmore.