Golden SkyGolden SkyGuía Técnica

Referencia técnica · Paso 5 · Reglas binarias

Umbrales y correlación

Del catálogo de indicadores a una matriz binaria depurada: cómo se generan las reglas de umbral y cruce, cómo se deduplican por lógica y por cercanía de umbral, y los dos filtros que recortan el conjunto — frecuencia y correlación de Pearson.

§0Notación

stepthreshold_step del estilo
opoperador de comparación
ratefracción de barras activas
Xmatriz binaria (barras × reglas)
corrmatriz de correlación
|·|valor absoluto

§1Umbrales por indicador

El column_map define los valores candidatos por indicador. El step viene del estilo; de él se derivan ibs_step = step/100 y aroon_osc_step = step·2.

IndicadorRango de umbrales
osciladores{0, step, 2·step, …, 100}   (rsi, adx, ±di, stoch, mfi)
williams %R{0, −step, …, −100}
ibs{0, ibs_step, …, 1.0}
aroon osc{−100, …, 100}   paso aroon_osc_step
cci{−300, …, 300}   paso max(step·10, 25)
zscore{−3.0, −2.5, …, 3.0}   paso 0.5 fijo

Solo las columnas sin _sft_N reciben entrada en el map; las desfasadas sirven como related / possible_values de las base, evitando la explosión combinatoria de reglas equivalentes.

§2Generación de reglas

Dos tipos por columna: contra un valor fijo (umbral) o contra otra columna (cruce). El set de operadores depende del tipo de columna.

umbral : col op value   ∀ value ∈ possible_values
cruce  : col op related_col   ∀ related ∈ related_columns
op ∈ { ≥, ≤ }  // columnas continuas
op ∈ { >, <, ==, ≥, ≤ }  // columnas temporales (day/month/year/hour…)

Excluir >/< en continuas evita duplicar señales cerca del umbral exacto (menor sensibilidad al ruido). Dedup interno vía set; salida ordenada alfabéticamente.

§3Deduplicación lógica

Se descartan reglas lógicamente equivalentes llevándolas a una forma canónica única.

normalize_rule un lado numérico → el número va a la izquierda
ambos columnas → orden alfabético
con inversión de operador si hace falta: ≥↔≤ , >↔< , ==↔==
rsi_14 ≥ 30 ≡ 30 ≤ rsi_14  ·  close > open ≡ open < close

Se conserva la primera regla vista por cada forma canónica.

§4Deduplicación de umbrales

Umbrales cercanos del mismo (indicador, operador) se agrupan y se promedian. El clustering es secuencial sobre los valores ordenados.

deduplicate_thresholds denom = max( |prev|, |curr| )
pct_diff = | curr − prev |denom · 100  // 0 si denom == 0
pct_diff ≤ similarity_threshold → mismo cluster ; si no → nuevo cluster
cluster de >1 →   indicador op mean(valores del cluster)

similarity_threshold default 5.0%. El denom = max(|prev|,|curr|) evita agrupar mal cerca de cero (0 y 0.01 no se funden). Las cross-rules (columna vs columna) no se tocan.

§5Binarización + filtro de frecuencia

Cada regla se evalúa con df.eval() (en lotes, por memoria) produciendo una columna 0/1. El filtro de frecuencia se aplica en el mismo paso, antes de sumar la columna a la matriz.

rate = #{ regla = 1 }nbarras  = mask.mean()
descartar si   rate < min_signal_rate (0.05)   ∨   rate > max_signal_rate (0.85)

Requisito 0 ≤ min < max ≤ 1. Aplicar el filtro inline evita construir una matriz enorme con reglas triviales (siempre activas o casi nunca).

Estructura de la matriz resultante — filas = velas, columnas = reglas que pasaron los filtros, valores 0/1:

velarsi_14 ≥ 70sma_20 ≥ sma_50adx_14 ≥ 25zscore_20 ≥ 2
2023-01-02 09:001010
2023-01-02 10:000011
2023-01-02 11:000100
2023-01-02 12:001110

Cada columna es una regla que superó los filtros de frecuencia y (más adelante) de correlación; cada celda es la evaluación de esa regla sobre esa vela. Es la entrada del paso de lift, que mide cuáles de estas columnas apuntan a los momentos ganadores.

§6Filtro de correlación

Elimina reglas redundantes por correlación de Pearson, calculada vectorizada sobre la matriz binaria. Para datos 0/1, Pearson y Spearman coinciden; Pearson por producto de matrices es mucho más rápido.

filter_by_correlation subsampling: si N > 15.000 → muestra uniforme (paso N // 15000)
norm = X − meanstd  // std = 1 en columnas constantes → evita /0
corr = normᵀ · normnfilas

Selección greedy en el triángulo superior (k=1):

pares con |corr| ≥ corr_threshold (0.85)  // |·| capta correlación positiva Y negativa
recorriendo en orden: si ambos presentes → eliminar el segundo (j)

El orden de inserción de las columnas es significativo: define cuál regla de cada par redundante sobrevive (siempre la primera encontrada).

Fuentes:
· domain/binary_rules/column_map.py — get_threshold_config, rangos de umbrales
· domain/binary_rules/rule_generator.py — generate_rules (umbral/cruce, operadores)
· domain/binary_rules/rule_cleaner.py — normalize_rule, deduplicate_logic, deduplicate_thresholds
· domain/binary_rules/rule_evaluator.py — evaluate_rules, filtro de frecuencia
· domain/binary_rules/rule_filter.py — filter_by_correlation