Programación Genética para Trading: Evolucionar Reglas, No Solo Parámetros
La mayoría de los traders que recurren a los "algoritmos genéticos" en realidad los usan para afinar los números de una estrategia que ya escribieron — el lookback, la distancia del stop, el umbral. Eso es optimización genética, y es útil. La programación genética (GP) es la prima más ambiciosa: en lugar de evolucionar los parámetros de una regla fija, evoluciona la regla misma. Este post va de qué te aporta eso y de por qué muerde más fuerte que cualquier otra cosa en este rincón del campo.
Parámetros vs estructura
Un algoritmo genético busca en un espacio de forma fija: "encuentra los 5 mejores números". La programación genética busca en el espacio de los programas — típicamente árboles de expresión. Un candidato es un árbol como ( (EMA(20) > EMA(50)) Y (RSI(14) < 30) ), y el algoritmo muta y recombina ramas enteras. La salida no es un conjunto de parámetros; es una condición de entrada/salida nueva que jamás se te habría ocurrido escribir.
Cómo funciona la evolución
El fitness es donde las estrategias viven o mueren
Si pones como fitness "el mayor retorno del backtest", la GP te entregará un monstruo barroco de 40 nodos que explica el pasado a la perfección y no predice nada. Defiéndete:
El problema del bloat y del sobreajuste
La GP sobreajusta de forma más agresiva que casi cualquier otro método porque el espacio de búsqueda es prácticamente infinito — siempre hay un árbol más elaborado que ajusta el ruido un poco mejor. Dos síntomas a vigilar: bloat (los árboles crecen enormes a cambio de ganancias minúsculas de fitness) y fragilidad (la regla evolucionada se desploma en cuanto cambia el régimen). Si tu regla campeona necesita ocho condiciones anidadas para funcionar, casi con seguridad no funciona.
Un flujo de trabajo sensato
En resumen
La programación genética es una de las pocas herramientas que puede sorprenderte de verdad con una regla que no habrías escrito a mano. Esa misma creatividad es justo la razón por la que sobreajusta con tanta facilidad. Trátala como un generador de hipótesis, no como un oráculo: deja que proponga y luego juzga sus propuestas con la misma disciplina brutal fuera de muestra que aplicarías a tus propias ideas.
¿Has probado a evolucionar reglas en lugar de parámetros? ¿Qué primitivas le diste y sobrevivió algo al contacto con datos reales? Cuéntanoslo abajo.
La mayoría de los traders que recurren a los "algoritmos genéticos" en realidad los usan para afinar los números de una estrategia que ya escribieron — el lookback, la distancia del stop, el umbral. Eso es optimización genética, y es útil. La programación genética (GP) es la prima más ambiciosa: en lugar de evolucionar los parámetros de una regla fija, evoluciona la regla misma. Este post va de qué te aporta eso y de por qué muerde más fuerte que cualquier otra cosa en este rincón del campo.
Parámetros vs estructura
Un algoritmo genético busca en un espacio de forma fija: "encuentra los 5 mejores números". La programación genética busca en el espacio de los programas — típicamente árboles de expresión. Un candidato es un árbol como ( (EMA(20) > EMA(50)) Y (RSI(14) < 30) ), y el algoritmo muta y recombina ramas enteras. La salida no es un conjunto de parámetros; es una condición de entrada/salida nueva que jamás se te habría ocurrido escribir.
Cómo funciona la evolución
- Bloques de construcción. Tú defines el alfabeto: indicadores (EMA, RSI, ATR, precio), operadores (>, <, Y, O, +, -) y constantes. La GP los compone en árboles.
- Fitness (aptitud). Cada árbol se compila en una señal y se backtestea. Su fitness es tu objetivo — pero, por favor, no el retorno bruto (mira más abajo).
- Cruce (crossover). Intercambia un subárbol de una regla por el de otra. Dos reglas mediocres pueden producir un hijo fuerte, o un disparate.
- Mutación. Reemplaza al azar un nodo o una rama para mantener la diversidad y escapar de óptimos locales.
- Selección. Conserva los árboles más aptos, cría la siguiente generación y repite durante N generaciones.
El fitness es donde las estrategias viven o mueren
Si pones como fitness "el mayor retorno del backtest", la GP te entregará un monstruo barroco de 40 nodos que explica el pasado a la perfección y no predice nada. Defiéndete:
- Multiobjetivo. Optimiza retorno y drawdown y número de operaciones a la vez — un enfoque como NSGA-II te da un frente de Pareto de compromisos en lugar de un único ganador sobreajustado.
- Presión de parsimonia. Penaliza el tamaño del árbol. Una regla corta y legible que generaliza vale más que una enorme que memoriza.
- Fitness fuera de muestra. Evalúa el fitness sobre datos en los que la evolución no cría, y reserva un conjunto final intacto que miras exactamente una vez.
El problema del bloat y del sobreajuste
La GP sobreajusta de forma más agresiva que casi cualquier otro método porque el espacio de búsqueda es prácticamente infinito — siempre hay un árbol más elaborado que ajusta el ruido un poco mejor. Dos síntomas a vigilar: bloat (los árboles crecen enormes a cambio de ganancias minúsculas de fitness) y fragilidad (la regla evolucionada se desploma en cuanto cambia el régimen). Si tu regla campeona necesita ocho condiciones anidadas para funcionar, casi con seguridad no funciona.
Un flujo de trabajo sensato
- Mantén el conjunto de bloques pequeño y con sentido económico. Primitivas basura evolucionan reglas basura.
- Lanza varias evoluciones independientes con semillas distintas; confía solo en las reglas que reaparecen en diferentes formas.
- Valida cada superviviente con análisis walk-forward antes de que toque dinero real — la evolución encuentra el pasado; el walk-forward pone a prueba el futuro.
En resumen
La programación genética es una de las pocas herramientas que puede sorprenderte de verdad con una regla que no habrías escrito a mano. Esa misma creatividad es justo la razón por la que sobreajusta con tanta facilidad. Trátala como un generador de hipótesis, no como un oráculo: deja que proponga y luego juzga sus propuestas con la misma disciplina brutal fuera de muestra que aplicarías a tus propias ideas.
¿Has probado a evolucionar reglas en lugar de parámetros? ¿Qué primitivas le diste y sobrevivió algo al contacto con datos reales? Cuéntanoslo abajo.