Golden SkyGolden SkyGuía Técnica

Referencia técnica · Paso 7a · Combinaciones — interacciones

Interacciones y roles

Cómo se arman los combos antes de puntuarlos: las tres medidas de interacción entre reglas, la generación de los AND con sus guardas de solape y soporte, la jerarquía trigger/context multi-timeframe, y el modo de regla atómica.

§0Notación

P(A)frecuencia de la regla A
P(A∩B)co-ocurrencia de A y B
P(A∪B)unión de A y B
ttrigger (regla del TF base)
ccontext (TF superior)
corrcorrelación de señales

§1Medidas de interacción

Tres formas de mirar la relación entre dos reglas — cada una responde una pregunta distinta.

overlap   = P(A∩B)min( P(A), P(B) )  // contención: → 1 si una regla es subconjunto de la otra
assoc_lift = P(A∩B)P(A) · P(B)  // independencia: = 1 si independientes, > 1 si co-ocurren
jaccard   = P(A∩B)P(A∪B)  // similaridad simétrica de las señales

overlap se usa como guarda (descarta pares donde una regla contiene a la otra → el AND no aporta grado de libertad). assoc_lift es diagnóstico (target-agnóstico — mide co-ocurrencia, no edge). jaccard se usa en el dedup final (7b).

§2Generación de combos AND

Un combo se enciende solo donde todas sus reglas están activas. Dos guardas por par lo filtran antes de puntuarlo.

combo AND: señal = 1  ⟺  todas las reglas del combo = 1
soporte = Σ( AND ) ≥ min_support (30)
overlap por rol: (trigger, trigger) < 0.7  ·  (context, trigger) < 0.95

El filtro viejo assoc_lift > 1.1 se eliminó: era redundante con min_support (si el AND dispara ≥30 veces, la potencia está garantizada) y contradecía el objetivo — reglas casi independientes del target son justo las candidatas a interacción genuina.

§3Jerarquía trigger / context

Al mezclar timeframes, no todas las reglas cumplen el mismo rol. La distinción evita combinar dos condiciones lentas que no aportan al timing de entrada.

trigger = regla del TF de operación (base_tf) — dispara la entrada
context = referencia al menos un TF > base_tf (en cualquier posición) — filtra régimen

Reglas estructurales (rechazo duro)

n_wayAceptarRechazar
2(t,t)   (c,t)(c,c) *
3(t,t,t)   (c,t,t)   (c,c,t)(c,c,c)

* (c,c) se acepta solo con allow_context_only_combos (opt-in, para gates macro / hedges). El threshold de overlap laxo 0.95 en (context, trigger) es correcto: overlap alto ahí significa "el trigger cae dentro del régimen" → es un filtro efectivo, no redundancia.

Colinealidad entre contexts · 3-way (c,c,t)

| corr( c1, c2 ) | > 0.85  →  rechazar  // dos contexts colineales = un único context disfrazado

Aceptar dos contexts colineales daría grados de libertad aparentes (sobreajuste) sin poder discriminador real. Un context_only_ratio > 0.30 emite un warning de selection bias (el pool está sesgado a context).

§4Modo n_way = 1 · regla atómica

Una estrategia puede ser una sola regla. En ese modo, este paso es un pass-through: no hay interacciones que medir ni combos que generar.

n_way = 1 → score_singles (pass-through)
no llama a interactions / generator / dedup
overlap · assoc_lift · jaccard · synergy = None

La regla ya pasó FDR + Katz + MI + dedup en el paso de lift, así que no hay nada que combinar ni volver a filtrar. El scoring (7b) se le aplica igual — el combo_lift se reinterpreta como el lift de la regla suelta. El n_way se pre-registra antes de ver resultados (no correr el mismo dataset con varios n_way y elegir).

Continúa en 7b: combo_lift, FDR con m_total = combos evaluados, sinergia (Friedman-Popescu), composite z_norm puro y dedup Jaccard.

Fuentes:
· domain/combinations/interactions.py — measure_interactions (overlap, assoc_lift, jaccard)
· domain/combinations/generator.py — generate_combinations, roles, overlap por rol, colinealidad
· domain/combinations/constants.py — overlap 0.7 / ct 0.95, min_support 30, allow_context_only
· domain/combinations/pipeline.py — branch n_way=1 (score_singles)