4. Cierre: la lista de comprobación, y hacia dónde seguir
Nivel 6: De los datos a la decisión
Aquí se cierra la primera mitad del curso, la de los datos, antes de entrar en los seis niveles de producción. El sitio adecuado para recoger los seis niveles en una herramienta que puedas usar el lunes, y para decir con claridad qué te falta todavía y dónde se consigue.
Los seis primeros niveles, en una frase cada uno
- Nivel 1, de dónde vienen los datos: qué te da cada tipo de proveedor, qué pagas cuando pagas, y por qué un identificador que se reutiliza destruye un histórico entero.
- Nivel 2, los sesgos que rompen un backtest: supervivencia, anticipación y selección del periodo, los tres errores que producen resultados espectaculares sin que nada falle.
- Nivel 3, ajustes y operaciones societarias: por qué el precio bruto miente después de un split o un dividendo, y qué hace una fusión con la continuidad de una serie.
- Nivel 4, limpieza y validación: cómo se detecta lo imposible, lo improbable y lo que falta, y por qué borrar no es siempre la respuesta.
- Nivel 5, almacenamiento y actualización: formatos columnares, particiones y una actualización incremental que no duplique ni pierda nada.
- Y este nivel: alineamiento sin futuro, datos alternativos con los pies en el suelo, y trazabilidad de principio a fin.
La lista de comprobación
Aplícala a cualquier conjunto antes de creerte un backtest hecho sobre él, sea tuyo o te lo enseñe otro. Los seis primeros puntos son bloqueantes: si alguno falla, el resultado no se discute, se descarta y se rehace. Del séptimo en adelante no invalidan por sí solos, pero cada uno que falle es una pregunta que no podrás responder el día que las cifras cambien.
- 1. ¿El universo incluye a las empresas que quebraron, se fusionaron o salieron del índice en cada fecha, o solo a las que hoy siguen ahí?
- 2. ¿Cada dato fundamental está unido por su fecha de publicación y no por el fin del periodo que describe?
- 3. ¿Cada serie macro está guardada por versión, con la cifra que se publicó entonces y no con la revisada hoy?
- 4. ¿Hay al menos un día entre la fecha de la señal y la de ejecución, y el retorno cobrado corresponde al tramo posterior?
- 5. ¿Ninguna transformación mira la serie completa, ni normalización global, ni interpolación, ni relleno hacia atrás?
- 6. ¿Los precios están ajustados por splits y dividendos con factores de la fecha correcta?
- 7. ¿Existe el fichero bruto original, intacto, con su fecha de descarga y su huella criptográfica?
- 8. ¿El conjunto se reconstruye ejecutando un script entero desde el bruto, sin pasos manuales?
- 9. ¿Están escritas, en orden, todas las transformaciones aplicadas?
- 10. ¿Están escritas las decisiones sobre datos dudosos, con el criterio y la alternativa descartada?
- 11. ¿Se comprueba la cobertura por periodo, es decir, cuántos símbolos hay cada año y quién desaparece?
- 12. ¿Se comprueban duplicados de clave, fechas futuras, valores imposibles y saltos extremos?
- 13. ¿Los identificadores son estables en el tiempo y resisten un cambio de nombre o de ticker?
- 14. ¿Cuántas observaciones independientes hay de verdad detrás del resultado, y no cuántas filas?
- 15. ¿Cuántas variantes se probaron antes de quedarse con esta, y está escrito ese número?
La misma lista, en código
Los puntos mecánicos se automatizan y se ponen delante del backtest, no detrás.
def puerta(df, universo_pit, notas_decisiones, manifiesto):
"""Se ejecuta ANTES del backtest. Si devuelve False, no se ejecuta nada."""
controles = {
"universo_punto_en_el_tiempo": universo_pit is not None,
"fundamentales_por_publicacion": "fecha_publicacion" in df.columns,
"senal_desfasada": df["posicion"].equals(df.groupby("simbolo")["senal"].shift(1)),
"sin_fechas_futuras": df["fecha"].max() <= pd.Timestamp.today(),
"sin_claves_duplicadas": not df.duplicated(["simbolo", "fecha"]).any(),
"bruto_con_huella": all("sha256" in f for f in manifiesto["fuentes"]),
"decisiones_escritas": len(notas_decisiones) > 0,
}
for nombre, ok in controles.items():
print(("OK " if ok else "FALLA ") + nombre)
return all(controles.values())Los puntos 14 y 15 no se automatizan y son los que más resultados tumban. Se escriben a mano en el mismo fichero que el resto, antes de mirar la curva.
registro = {
"observaciones_independientes": "20 trimestres, no 6000 filas",
"variantes_probadas": 37,
"regimen_cubierto": "2016-2025, tipos cero y su normalizacion posterior",
}Lo que viene ahora
Con esto tienes una tabla en la que se puede confiar. Lo que no tienes todavía es un sistema: algo que se ejecute solo cada mañana, que sepa dónde se quedó ayer, que no duplique una orden si se reinicia a media faena y que avise cuando algo se tuerza. De eso van los seis niveles siguientes, del 7 al 12, y son la otra mitad de este curso.
Y tener los datos bien tampoco te dice si tu resultado significa algo. Eso está en otros sitios.
- Los tres cursos sin código: Teoría de mercados, para entender qué es un precio y quién está al otro lado; Macro, para saber a qué entorno está expuesta cualquier idea; y Costes, que explica por qué la diferencia entre el precio del backtest y el que consigues de verdad se come más estrategias que ninguna señal fallida.
- Los tres intermedios: Matemáticas y estadística, donde la pregunta 14 y la 15 de la lista se convierten en pruebas de significación, penalización por pruebas múltiples y validación fuera de muestra; Derivados, para entender opciones y futuros; y Riesgo y gestión de cartera, que responde cuánto poner en cada posición y cómo se combinan varias ideas.
- Las otras dos pistas difíciles, porque esta es una de las tres: Técnica y Python, que arranca en la programación básica y llega hasta conectar con un bróker real, gestionar órdenes y llevar posiciones vivas, y para la que estos seis niveles de datos son el cimiento, porque todo lo demás se apoya en que la tabla sea honesta; y Expectativas y ventaja, que no lleva una sola línea de código y es difícil por exigencia, porque va de qué está descontado en un precio y de dónde queda sitio para discrepar de él.
Un recordatorio a mitad de camino
Todo este material es formación, no asesoramiento financiero. Nada de lo que has leído es una recomendación de comprar o vender ningún activo, ni está adaptado a tu situación, tus objetivos ni tu tolerancia al riesgo. Un conjunto de datos impecable elimina una familia entera de errores; no convierte una idea en buena, no valida una estrategia y no predice nada. Invertir conlleva riesgo de pérdida, incluida la pérdida total del capital. Si vas a tomar decisiones con dinero real, hazlo con tu propio análisis y, si lo necesitas, con un profesional autorizado para ello.