Inicio › Documentación › Construir estrategias
Bloque 6 · bis

Modos de generación

El selector Modo (panel superior del Testeo Masivo) decide cómo se recorre el espacio de combinaciones. Cuando el espacio es pequeño conviene probarlo entero; cuando es astronómico (millones o billones de combos) se muestrea al azar.

No confundir el modo Aleatorio (Monte Carlo) de generación con la Simulación Monte Carlo del Performance Report: aquí Monte Carlo significa construir combinaciones al azar; allí significa barajar los trades de una estrategia ya elegida.

EXHAUSTIVO

Prueba TODAS las combinaciones posibles, sin tope ni muestreo. Enumeración perezosa por bloques: el consumo de memoria es constante aunque el espacio sea enorme.

Probadas 2.280.294 de 2.280.294
// 100% — espacio COMPLETO
Ideal cuando el nº de combos posibles es abordable (cabe en tiempo razonable).
ALEATORIO · MONTE CARLO

Construye cada combo al azar: dirección, nº de condiciones (k), condiciones, TP y SL. Da oportunidad justa a las estrategias simples (1-2 condiciones), que suelen ser las más robustas.

k := 1 + aleatorio(MaxAnd)
condiciones distintas al azar del pool
// + TP/SL aleatorios del rango
Recomendado para espacios gigantes. Es el "random search" de los generadores comerciales.
ALEATORIO · UNIFORME

Elige un índice global al azar y lo "des-rankea" al combo exacto (sistema numérico combinatorio). Matemáticamente uniforme: cada combo de todo el espacio es igual de probable.

r := aleatorio(0 .. Total)
des-ranking → combo exacto
// tiende a combos de muchas condiciones
Cuando quieres una muestra estadísticamente uniforme del espacio completo.
GENÉTICO

No dispara a ciegas: evoluciona. Cría estrategias como un ganadero — conserva las mejores, las cruza y muta, y repite generación tras generación. Cada ronda parte de lo mejor de la anterior, así que acumula progreso en vez de empezar de cero.

// cada generación:
evaluar → seleccionar → cruzar + mutar
// los campeones sobreviven (elitismo)
El más eficiente para espacios enormes: explora amplio y luego refina hacia lo bueno.

Modo Genético en profundidad

Los modos aleatorios disparan a ciegas: cada muestra es independiente, no aprende nada del pasado. El genético es distinto — acumula progreso. Toma prestada la idea de la selección natural: mantiene una población de estrategias, se queda con las mejores, las combina entre sí (cruce) e introduce pequeños cambios (mutación), y repite. Generación a generación, la población entera deriva hacia estrategias cada vez mejores.

Su filosofía: explorar amplio (como el aleatorio) y luego explotar y refinar hacia las zonas buenas. Para espacios de millones o billones de combinaciones es mucho más eficiente que muestrear al azar, porque cada ronda apunta mejor gracias a lo aprendido en la anterior.

El ciclo evolutivo (una generación)
1 · Evaluar
Backtest de cada individuo → su fitness
2 · Seleccionar
Los mejores tienen más hijos (torneo)
3 · Cruzar
Mezclar dos padres → un hijo
4 · Mutar
Pequeños cambios al azar
5 · Repetir
Nueva generación → vuelta a 1

La Generación 0 es una población aleatoria. Cada individuo es una estrategia = {dirección, condiciones de entrada, condiciones de salida, TP, SL} — su "ADN". Cruzar y mutar manipulan ese ADN, siempre produciendo estrategias válidas.

Los parámetros, uno a uno
Población

Cuántas estrategias hay en cada generación (individuos que se backtestean por ronda). Más población = más diversidad y mejor exploración, pero cada generación cuesta más. Típico 200–1000.

Generaciones

Máximo de rondas de evolución. Más generaciones dan más tiempo para refinar, pero llega un punto en que ya no mejora (converge). Típico 30–100.

Torneo

Para elegir cada padre se cogen N individuos al azar y gana el de mejor fitness. N grande = más presión selectiva (los buenos dominan rápido, riesgo de perder diversidad); N pequeño = más azar. Típico 2–5.

Elite %

Qué fracción de los mejores pasa intacta a la siguiente generación, sin cruzar ni mutar. Garantiza que nunca se pierde el mejor hallazgo — por eso la curva nunca baja. Típico 5–10%.

Mut %

Probabilidad de que un hijo sufra una mutación (cambiar una condición, ajustar TP/SL, voltear la dirección…). Poca mutación converge rápido pero puede estancarse; mucha explora más pero es más caótico. Típico 10–20%.

Inmig %

Sangre nueva: cada generación se inyecta esta fracción de individuos totalmente aleatorios. Combate el "colapso de diversidad" (que toda la población se vuelva clones y deje de explorar). Típico 3–5%.

Parada (convergencia)

Si el mejor fitness no mejora durante N generaciones seguidas, el motor para solo: ha convergido y seguir sería malgastar cálculo. Ponlo a 0 para agotar siempre todas las generaciones. Típico 10–15.

Siembra

En vez de empezar con una Generación 0 aleatoria, hace un casting previo: evalúa N candidatos al azar y arranca con los mejores. Así el genético parte de un plantel decente y converge antes/mejor. Típico 20.000; 0 = Gen 0 aleatoria clásica. También puedes sembrar desde tus Bibliotecas (botón «🧬 Sembrar en el genético»).

Robustez anti-sobreajuste

Cambia lo que busca el genético: de «gana más en backtest» a «gana y aguanta». (1) Optimiza sobre el 70% inicial (holdout: el 30% final queda como validación no vista). (2) Penaliza la complejidad (menos condiciones). (3) Premia la muestra (más operaciones = más creíble). El ranking muestra el In-Sample; lleva el ganador a Walk-Forward / Análisis 360 para ver el Out-of-Sample.

El fitness — cómo se mide "bueno"

Cada individuo se puntúa con el mismo criterio de ranking que elijas al pie de la ventana (Bº $, Profit Factor, Bº %, Win %). Un guardarraíl importante: las estrategias con menos operaciones que "Mín. Trades" reciben la puntuación mínima y no se seleccionan → el genético no converge en "flukes" de 3 operaciones afortunadas.

La curva de convergencia

Durante la ejecución aparece una gráfica junto a la tabla de resultados: el eje X es la generación y el eje Y el mejor fitness de esa generación. Los puntos naranjas dibujan cómo mejora la población ronda a ronda, en directo.

Gracias al elitismo, la curva es una escalera ascendente (sube o se queda plana, nunca baja). La forma típica: saltos grandes al principio (mejoras fáciles) y aplanamiento al final (converge). Si se aplana pronto, la búsqueda ya encontró su óptimo en ese espacio.

Reproducible

La Semilla controla todo el azar (población inicial, cruces, mutaciones). Misma semilla + misma config ⇒ misma evolución. Con Semilla 0 se genera una nueva y se muestra junto al campo.

Mismo destino

Los campeones caen en la misma tabla de resultados (top-N) que los demás modos, con idénticos hand-offs: Performance, Portafolio, Walk-Forward, Análisis 360…

Por CPU

Corre en CPU (multihilo): necesita los resultados de cada generación para poder seleccionar, así que no se acelera por GPU.

⏱️
¿Cómo alargar (o hacer más exhaustivo) el testeo?

Que el genético acabe rápido no es un defecto: es que converge deprisa hacia lo bueno. Pero si quieres que explore más a fondo, tienes cuatro palancas, de mayor a menor impacto:

1
Parada = 0. Es la causa principal de que termine pronto: por defecto (12) corta en cuanto el mejor no mejora en 12 generaciones seguidas. Ponlo a 0 y agotará TODAS las generaciones sin cortar por convergencia.
2
Sube Generaciones y Población. El trabajo total ≈ Población × Generaciones backtests. De 300×40 (12.000) a, por ejemplo, 1500 × 200 = 300.000 estrategias evaluadas.
3
Sube Mut% e Inmig% (diversidad). Clave para que el tiempo extra sirva: si solo subes generaciones y la población ya convergió, las rondas de más solo pulen el mismo campeón. Con más mutación (25-35%) e inmigrantes (10-15%), la población sigue explorando territorio nuevo en vez de estancarse en clones.
4
Amplía el espacio. Si converge al instante es que hay poco que explorar: marca más indicadores o rangos de períodos más amplios → búsqueda más larga y rica.
// Receta para un testeo largo y exhaustivo:
Población 1500 · Generaciones 200 · Torneo 3 · Elite% 8 · Mut% 30 · Inmig% 12 · Parada 0

En resumen: que sea rápido y efectivo es buena señal — el genético es eficiente. Alargarlo tiene sentido cuando buscas más variedad de edges o exprimir espacios de búsqueda grandes.

Muestras

En los modos aleatorios, el campo Muestras fija cuántos combos se prueban (p. ej. 1.000.000) y el barrido para al alcanzarlos. En modo Exhaustivo se ignora y el campo aparece deshabilitado.

Semilla

Deja la Semilla a 0 y cada ejecución generará una semilla nueva automáticamente → cada pasada explora un subconjunto aleatorio distinto del espacio. La semilla empleada se muestra junto al campo (→ usada: N); escríbela en la casilla para reproducir ese mismo barrido.

Si escribes un valor fijo, los modos aleatorios se vuelven reproducibles: misma semilla + misma configuración ⇒ mismas muestras. En modo Exhaustivo no se usa (campo deshabilitado): la enumeración es determinista.

Memoria constante (top-N en streaming)

Sea cual sea el modo, AniQuant no acumula todos los resultados en RAM: mantiene únicamente el top-N según el criterio de ranking (campo MáxRes), descartando el resto al vuelo. Así el consumo de memoria es plano aunque el barrido dure horas o días.

// Por cada combo válido:
if valor_ranking > peor_del_topN then reemplazar; else descartar;

Aceleración por GPU (OpenCL)

OPCIONAL

Marca la casilla GPU para ejecutar el barrido en la tarjeta gráfica mediante OpenCL: un hilo GPU por combinación. En espacios grandes es típicamente 10-15× más rápido que la CPU. Si no hay GPU OpenCL compatible, AniQuant lo indica en el log y usa la CPU automáticamente.

Series residentes

Las barras y todas las series de indicadores se calculan y se suben a la GPU una sola vez; cada lote solo envía las combinaciones a evaluar.

Pipeline asíncrono

Mientras la GPU calcula un bloque, la CPU ya enumera y prepara el siguiente (doble buffer). Así la tarjeta no espera: la utilización sube de ~50% hasta cerca del 100%.

Tamaño de bloque

Ajustable en Configuración → Tamaño de bloque (combos por pasada). El óptimo depende del equipo; en pruebas ~25.000 fue el mejor. Lotes diminutos o gigantes van peor.

Diagnóstico en el log

Al iniciar muestra el motor real usado (GPU + nombre del dispositivo, o CPU + nº de hilos) y el motivo si la GPU no estaba disponible.

Mismos resultados

CPU y GPU producen las mismas métricas: la GPU solo cambia la velocidad, no la lógica del backtest.

Progreso en vivo

Una barra de progreso al pie de la ventana muestra el avance: durante la preparación (carga de datos y subida de series a la GPU) anima en modo marquee, y pasa a porcentaje real al arrancar el barrido. La barra de estado se actualiza cada bloque (~50.000 combos) y la lista de resultados se refresca en vivo:

  • →combos hechos / total y %
  • → nº de resultados válidos encontrados
  • →ritmo (combos/s) y ETA estimado

Si el ETA supera 10 años, el sistema avisa "¡reduce parámetros!": el espacio es demasiado grande aunque ya no agote memoria.

💡
Cuándo usar cada modo

Exhaustivo: cuando los combos posibles son pocos — garantiza el 100% del espacio.
Aleatorio (Monte Carlo): opción general para espacios grandes; favorece estrategias simples y robustas.
Aleatorio (Uniforme): cuando quieres una muestra estadísticamente representativa del espacio completo.
Genético: cuando el espacio es enorme y quieres que la búsqueda aprenda y refine hacia lo mejor, en vez de muestrear a ciegas. El más potente para descubrir estrategias.

Pruébalo tú mismo

AniQuant se prueba gratis durante 30 días, con todos los módulos y sin tarjeta.

← Anterior
Cómo funciona la optimización de estrategias
Siguiente →
Gráfico con indicadores visuales
Más en Construir estrategias