Construí una plataforma que entrena 72 modelos de machine learning (aprendizaje automático) para predecir la dirección del S&P 500. Ejecuta un pipeline de datos diario, reentrena cada modelo una vez al mes y hace backtest (simulación retrospectiva con datos históricos) de cada predicción con costes de transacción reales. Está desplegada en producción y puedes usarla ahora mismo.
Ninguno de los modelos superó al baseline.
Publico ese resultado en lugar de esconderlo, porque el camino hasta llegar ahí es más interesante que cualquier cifra que hubiera podido presentar si hubieran funcionado.
Qué es en realidad "el baseline"
El baseline (modelo de referencia) es deliberadamente tonto. Ignora todas las variables — cada medida de volatilidad, cada indicador de momentum, cada variable macro — y siempre predice el rendimiento medio observado durante el entrenamiento.
Suena trivial de superar. No lo es, por una razón: el mercado bursátil sube. De los 6,641 días de negociación de mi conjunto de datos, el 54.1% cerraron en positivo. Un modelo que siempre predice "sube" y no mira nada acierta el 54% de las veces antes incluso de empezar.
En la práctica, predecir siempre un rendimiento medio positivo equivale a mantener una posición larga de forma permanente. Así que el baseline es, en efecto, comprar y mantener (buy and hold) — de ahí el título de este artículo —, aunque su nombre técnico en el código sea baseline_mean.
Así de exigente es ese listón, medido en Sharpe ratio (ratio de rentabilidad ajustada al riesgo):
| Frecuencia de entrenamiento | 1 periodo adelante | 5 periodos | 21 periodos |
|---|---|---|---|
| Diaria | 0.721 | 0.781 | 0.797 |
| Semanal | 1.620 | 1.724 | 2.168 |
| Mensual | 3.825 | 4.653 | — |
El Sharpe ratio mide la rentabilidad por unidad de riesgo: cuánto ganaste, dividido entre cuánto osciló el valor de tu cartera mientras lo ganabas, anualizado. Cuanto más alto, mejor. Un Sharpe alrededor de 1 se considera bueno para una estrategia real. Un Sharpe de 2 es muy bueno.
Entonces, ¿por qué el baseline mensual muestra 3.825? Porque casi nunca opera. Toma una posición al mes y la mantiene en un índice que tiende a subir con el tiempo. Pocas decisiones, baja volatilidad medida, exposición permanente a un mercado alcista. Esa cifra no es una señal de habilidad: es una señal de que la métrica premia no hacer nada en un mercado que tiende a subir. Cualquier modelo que compita en ese segmento tiene que ser drásticamente mejor, no marginalmente mejor, para justificar su existencia.
Cómo se evaluaron los modelos
72 modelos significa nueve algoritmos — regresión ridge y lasso, random forests, XGBoost, un ensemble de stacking, redes neuronales LSTM y GRU, y sus variantes de clasificación — combinados con ocho combinaciones de frecuencia de entrenamiento y horizonte de predicción.
El método de evaluación importa más que los algoritmos, así que esto es lo que hace:
Validación walk-forward (que respeta el orden temporal). No se pueden barajar datos financieros y dividirlos al azar. Si entrenas con datos de 2020 y evalúas con datos de 2015, el modelo ha visto el futuro. Por eso los datos avanzan en el tiempo: se entrena con un bloque temprano, se evalúa con el bloque inmediatamente posterior, se desliza hacia adelante y se repite. Cada periodo de evaluación es estrictamente posterior a los datos de entrenamiento que produjeron la predicción.
Un hueco entre entrenamiento y evaluación. Cuando predices la suma de rendimientos de los próximos 21 días, el objetivo del último día de entrenamiento se solapa con los primeros días del periodo de evaluación. Un modelo puede aprender de ese solapamiento sin que nadie se dé cuenta. Por eso la división fuerza un hueco igual al horizonte de predicción.
Un fallo duro, no un aviso. Cada partición comprueba que la última fecha de entrenamiento sea estrictamente anterior a la primera fecha de evaluación, y lanza un error en tiempo de ejecución si no lo es. No es un test unitario: es un invariante que se ejecuta en producción. La fuga de información es la razón más habitual por la que un backtest financiero parece brillante y luego pierde dinero, y quería que fuera imposible de desplegar por accidente, no solo improbable.
Costes reales. Cada operación se carga con 5 basis points (puntos básicos) de comisión y 2 basis points de slippage (diferencia entre el precio esperado y el precio real de ejecución) — un 0.07% por operación. Estos costes se restan dentro del propio Sharpe ratio, así que una estrategia que opera constantemente es penalizada por ello automáticamente. Asumir que se ejecuta al precio medio es una fantasía, incluso para el ETF más líquido del mundo.
Sin cherry-picking. Cuando existen varias ejecuciones de entrenamiento del mismo modelo, el código elige entre ellas por tipo de ejecución y marca temporal — nunca por la puntuación out-of-sample (fuera de la muestra de entrenamiento). Elegir la ejecución con mejor puntuación es la forma de engañarte a ti mismo y acabar publicando ruido.
En los 27 segmentos diarios que no son baseline, ningún modelo lo superó.
Los dos que parecían funcionar
Dos segmentos sí quedaron por delante:
| Segmento | Modelo | Sharpe | vs. baseline | R² out-of-sample |
|---|---|---|---|---|
| Semanal, 1 periodo | LSTM (parámetros por defecto) | 1.832 | +0.212 (+13%) | −0.038 |
| Mensual, 1 periodo | Clasificador de stacking | 3.904 | +0.079 (+2%) | — |
Una mejora del 13% sobre el baseline gracias a una red neuronal suena a hallazgo. No lo es, y hay dos razones.
El R² es negativo. El R² mide qué parte de la variación del resultado explica tu modelo. Cero significa que no lo haces mejor que predecir siempre la media. Negativo significa que lo haces peor que predecir siempre la media. Así que esta LSTM predice la magnitud de los rendimientos semanales peor que una constante, aunque acierte la dirección con suficiente frecuencia como para producir un Sharpe decente. Esa es la firma de un modelo que ha capturado un ligero sesgo direccional y nada más.
La muestra es diminuta. Son modelos semanales y mensuales, así que las ventanas out-of-sample contienen entre 50 y 100 observaciones aproximadamente. No 50,000: cincuenta. Con tan pocos datos, un exceso del 2% al 13% sobre un baseline es perfectamente compatible con la variación propia del muestreo aleatorio. Si lanzas una moneda ligeramente trucada cien veces, a veces obtendrás una racha que parece habilidad.
El caso mensual es aún más débil: una ventaja del 2% sobre un baseline cuyo Sharpe ya es 3.825, medida a lo largo de unas pocas docenas de meses.
Cuando evalúas 72 modelos, algunos parecerán buenos por azar. Eso no es un defecto de los modelos: es aritmética. La respuesta honesta es tratar una pequeña ventaja sobre una muestra pequeña como ruido hasta que se demuestre lo contrario, no escribir una nota de prensa sobre tu red neuronal.
La parte que nadie publica
Este es el hallazgo que más me sorprendió, y no tiene nada que ver con la precisión predictiva.
Comprobé qué producen realmente los modelos desplegados, haciendo que cada uno generara predicciones sobre las últimas 252 observaciones. Ocho de ellos producen un único valor constante. Desviación típica cero. El mismo número cada día, para siempre.
El peor caso: XGBoost, frecuencia diaria, horizonte de 21 días. Su Sharpe out-of-sample anidado era 0.606 — una cifra de aspecto perfectamente respetable. Pero el modelo final, reentrenado con el conjunto de datos completo para el despliegue, colapsó. Su parámetro de regularización L1 era lo bastante fuerte como para aplanar cada árbol hasta convertirlo en una sola hoja al ver los datos completos, aunque no lo había hecho con los bloques de entrenamiento más pequeños usados durante la validación.
Los modelos lasso hicieron lo mismo, por una razón más limpia: con su penalización ajustada, todos los coeficientes se van exactamente a cero con el conjunto de datos completo. El modelo es, matemáticamente, una constante.
La lección es incómoda y merece decirse sin rodeos: las métricas de validación out-of-sample no te dicen qué hace tu modelo desplegado. El modelo que validas y el modelo que despliegas se entrenan con cantidades de datos distintas, y esa diferencia basta para cambiar el comportamiento por completo. Comprobar si el artefacto final degenera no es opcional. Solo lo descubrí porque fui a buscarlo.
¿Qué significa todo esto?
Significa que la hipótesis del mercado eficiente en su forma débil se sostuvo, que es la respuesta aburrida y esperable. SPY está entre los instrumentos más líquidos del planeta. Mis variables son públicas: indicadores técnicos que cualquiera puede calcular, series macro que cualquiera puede descargar, sentimiento de noticias de una API pública. La idea de que unas pocas miles de filas de entrenamiento de datos públicos fueran a revelar un patrón explotable en el índice más analizado del mundo nunca fue plausible.
La literatura avisa exactamente de esto. La mayoría de los backtests positivos en machine learning financiero son artefactos del overfitting (sobreajuste a los datos de entrenamiento) o de probar muchas cosas y reportar la mejor. Un pipeline con aislamiento temporal adecuado y contabilidad de costes honesta produce el resultado que predice la teoría, y el mío lo hizo.
Eso no es un proyecto fallido. El objetivo nunca fue demostrar rentabilidades anómalas, sino construir una infraestructura capaz de medir la pregunta con honestidad y darte de verdad la respuesta. Un sistema que informa "esto no funciona" vale más que uno que reporta una cifra bonita que no puedes reproducir.
La verdad incómoda sobre la mayoría de los resultados de machine learning en finanzas no es que los modelos sean malos. Es que la evaluación lo es.
STAIR es una plataforma de investigación construida como trabajo de fin de grado en la Universidade da Coruña. No constituye asesoramiento financiero. Cada cifra de este artículo procede del registro de modelos del propio sistema y puede consultarse en la plataforma.