Sobreajuste en backtesting: por qué tu backtest miente (con Python) | Quantum Club

Etapa 3 de 4 · Nivel hedge fund

Por qué tu backtest miente: sobreajuste y cómo evitarlo

Por qué la mayoría de estrategias que brillan en el backtest fracasan con dinero real: sobreajuste, el problema de las pruebas múltiples, el Sharpe deflactado y una lista de comprobación para validar estrategias, con Python.

En este artículo
  1. El experimento: 1.000 estrategias que no valen nada
  2. El problema de las pruebas múltiples
  3. El Sharpe deflactado
  4. Otras formas en que un backtest miente
  5. Cómo validan los profesionales
  6. Resumen

Si has hecho algún backtest, conoces la sensación: pruebas una idea, no funciona; cambias un parámetro, mejora un poco; añades un filtro y, de repente, la curva de capital sube como un cohete. Sharpe de 2,5. Parece que has encontrado algo.

Casi siempre, no. Lo que has encontrado es ruido que se ajusta a tus datos. Es el sobreajuste (overfitting), y es la razón número uno por la que las estrategias que brillan en el backtest fracasan con dinero real. En este artículo vas a verlo con tus propios ojos y a aprender cómo se protegen los fondos profesionales.

El experimento: 1.000 estrategias que no valen nada

Vamos a generar 1.000 «estrategias» cuyas rentabilidades diarias son ruido puro: su rentabilidad esperada es exactamente cero. Ninguna tiene ventaja alguna. Después, como haría cualquiera, nos quedamos con la que mejor lo haya hecho en tres años de backtest.

Python
import numpy as np
from scipy.stats import norm

rng = np.random.default_rng(0)
N, años = 1_000, 3
dias = 252 * años

# 1.000 "estrategias" que son ruido puro: rentabilidad esperada cero
r = rng.normal(0, 0.01, size=(N, dias))
sharpe = r.mean(axis=1) / r.std(axis=1) * np.sqrt(252)

mejor = np.argmax(sharpe)
print(f"Sharpe medio de las {N}: {sharpe.mean():.2f}")
print(f"Sharpe de la mejor:       {sharpe[mejor]:.2f}")

r_nuevo = rng.normal(0, 0.01, size=252 * 2)       # dos años más de la "mejor"
print(f"La mejor, con datos nuevos: {r_nuevo.mean() / r_nuevo.std() * np.sqrt(252):.2f}")

Sharpe medio de las 1000: 0.02 Sharpe de la mejor: 1.83 La mejor, con datos nuevos: 0.02

La mejor de mil estrategias sin ninguna ventaja tiene un Sharpe de 1,8 en el backtest, una cifra que muchos fondos firmarían. Con datos nuevos, vuelve a cero. No ha dejado de funcionar: nunca funcionó.

0 1 2 3 4 5 Años (estrategias aleatorias simuladas) 0,5 1,0 1,5 2,0 2,5 3,0 Valor de 1 € hoy Mejor de 1.000: en el backtest La misma, con datos nuevos
La mejor de 1.000 estrategias aleatorias (azul) parece una máquina de hacer dinero durante el backtest. A partir de «hoy», con datos que no se usaron para elegirla, se comporta como lo que es: ruido. En gris, otras 30 de las 1.000.

El problema de las pruebas múltiples

Lo que acabamos de ver tiene nombre: el problema de las pruebas múltiples. Cada vez que pruebas una variante (otro parámetro, otro activo, otro filtro) estás lanzando una moneda más. Si lanzas suficientes, alguna saldrá cara diez veces seguidas.

En la práctica nadie prueba mil estrategias a propósito, pero es muy fácil hacerlo sin darse cuenta: diez ventanas de media móvil por cinco umbrales por cuatro activos por cinco filtros ya son 1.000 combinaciones.

Bailey y López de Prado dieron una aproximación del Sharpe máximo que cabe esperar por puro azar después de probar \( N \) estrategias sin ventaja alguna:

\[ \mathbb{E}\left[\max \widehat{SR}\right] \approx \frac{1}{\sqrt{T}}\left[(1-\gamma)\,\Phi^{-1}\!\left(1-\tfrac{1}{N}\right) + \gamma\,\Phi^{-1}\!\left(1-\tfrac{1}{N e}\right)\right] \]

donde \( T \) son los años de datos, \( \gamma \approx 0{,}5772 \) es la constante de Euler-Mascheroni y \( \Phi^{-1} \) la inversa de la normal. El factor \( 1/\sqrt{T} \) es, aproximadamente, el error típico de un Sharpe anual estimado con \( T \) años.

Python
def sharpe_maximo_esperado(N, años):
    g = 0.5772156649                                 # constante de Euler-Mascheroni
    z = (1 - g) * norm.ppf(1 - 1 / N) + g * norm.ppf(1 - 1 / (N * np.e))
    return z / np.sqrt(años)                         # error típico del Sharpe ≈ 1/√años

for n in [10, 100, 1_000, 10_000]:
    print(f"{n:>6} estrategias probadas -> Sharpe máximo esperado por azar: {sharpe_maximo_esperado(n, años):.2f}")

10 estrategias probadas -> Sharpe máximo esperado por azar: 0.91 100 estrategias probadas -> Sharpe máximo esperado por azar: 1.46 1000 estrategias probadas -> Sharpe máximo esperado por azar: 1.88 10000 estrategias probadas -> Sharpe máximo esperado por azar: 2.23

La fórmula da 1,88 para mil pruebas, prácticamente lo que obtuvimos en la simulación. Lo que dice es muy incómodo: un Sharpe de 1,5 en un backtest de tres años no significa nada si has probado cien variantes.

1 10 100 1.000 Estrategias probadas (todas son ruido puro) 0,0 0,5 1,0 1,5 2,0 Ratio de Sharpe Sharpe del mejor, en el backtest Sharpe del mismo, con datos nuevos
Cuantas más estrategias sin ventaja pruebas, mejor parece la mejor de ellas en el backtest. Con datos nuevos, su Sharpe sigue en cero. La distancia entre las dos líneas es sobreajuste puro.

El Sharpe deflactado

La conclusión práctica es que el Sharpe de un backtest hay que compararlo con lo que darías por azar, no con cero. Es la idea del Deflated Sharpe Ratio de Bailey y López de Prado: ajusta el Sharpe observado por el número de pruebas, la longitud del backtest y la forma de la distribución (asimetría y curtosis), y devuelve la probabilidad de que el Sharpe real sea positivo.

No hace falta implementarlo entero para aprovechar la idea. Basta con una regla sencilla: apunta cuántas variantes has probado y compara tu mejor Sharpe con el máximo esperado por azar para ese número. Si no lo supera con holgura, no tienes nada.

Otras formas en que un backtest miente

El sobreajuste no es el único problema. Estos errores son igual de frecuentes:

  • Sesgo de anticipación (look-ahead bias): usar información que no estaba disponible en ese momento. Por ejemplo, operar al cierre de hoy con una señal calculada con ese mismo cierre, o usar datos contables antes de su fecha de publicación.
  • Sesgo de supervivencia: probar la estrategia solo con las empresas que existen hoy, olvidando las que quebraron o salieron del índice.
  • Costes irreales: ignorar comisiones, diferenciales entre compra y venta e impacto en el precio. Muchas estrategias de alta rotación solo ganan antes de costes.
  • Régimen único: un backtest que solo incluye un mercado alcista no dice nada sobre lo que pasa en una crisis.
  • Parámetros afinados a mano: si has mirado el periodo de prueba aunque sea una vez para decidir algo, ya no es de prueba.

Cómo validan los profesionales

  1. Hipótesis antes que datos. Una estrategia debería tener una razón económica: quién pierde el dinero que tú ganas y por qué. Si la única justificación es «el backtest sale bien», desconfía.
  2. Datos fuera de muestra de verdad. Reserva un periodo que no toques hasta el final, y úsalo una sola vez.
  3. Validación walk-forward. Optimiza con una ventana, prueba en la siguiente, avanza y repite a lo largo de toda la historia. Mide solo los tramos de prueba.
  4. Pocas variantes y registradas. Lleva la cuenta de todo lo que pruebas; es el \( N \) de la fórmula.
  5. Robustez ante los parámetros. Si la estrategia solo funciona con una media de 37 días y no con 35 o 40, es sobreajuste. Las buenas ideas funcionan en un rango amplio.
  6. Costes pesimistas. Si sigue funcionando con el doble de costes, es mejor señal.
  7. Empezar pequeño con dinero real. El último test es el mercado, con un tamaño que puedas permitirte perder.

La regla de oro: un backtest no sirve para demostrar que una estrategia funciona. Sirve para descartar las que no funcionan. Si tu proceso está diseñado para intentar romper la estrategia y no lo consigue, entonces empieza a merecer tu confianza.

Resumen

  • Probar muchas variantes y quedarse con la mejor fabrica Sharpes altos a partir de ruido.
  • El Sharpe máximo esperado por azar crece con el número de pruebas y baja con la longitud del backtest.
  • El Sharpe deflactado corrige por todo ello; como mínimo, cuenta tus pruebas.
  • Look-ahead, supervivencia y costes son las otras tres grandes trampas.
  • Walk-forward, datos fuera de muestra usados una vez, hipótesis económica y robustez: así se valida en serio.

Si quieres ver el caso extremo de un modelo en el que todo el mundo confió demasiado, sigue con la cópula gaussiana y la crisis de 2008.

Fuentes

  • D. H. Bailey y M. López de Prado (2014), «The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality», The Journal of Portfolio Management.
  • D. H. Bailey, J. Borwein, M. López de Prado y Q. J. Zhu (2014), «Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance», Notices of the AMS.
Quantum Pablo

Sobre Quantum Pablo

Físico de partículas y quant. Enseño finanzas cuantitativas en español desde la intuición y con código: más de 400 alumnos en más de 25 países se han formado en Quantum Club. También en YouTube e Instagram.

Etapa 3 de 4 · Nivel hedge fund

  1. 10Optimización de carteras de Markowitz y frontera eficiente en Python
  2. 11El modelo GARCH: cómo predecir la volatilidad (con Python)
  3. 12Pairs trading y cointegración en Python: de la idea al backtest
  4. 13El filtro de Kalman en trading: un hedge ratio que se adapta (con Python)
  5. 14Por qué tu backtest miente: sobreajuste y cómo evitarlo
  6. 15La cópula gaussiana y la crisis de 2008: la fórmula que hundió Wall Street
Ver el recorrido completo →