Referencia técnica · Paso 5 · Reglas binarias
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.
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.
| Indicador | Rango 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.
Dos tipos por columna: contra un valor fijo (umbral) o contra otra columna (cruce). El set de operadores depende del tipo de columna.
Excluir >/< en continuas evita duplicar señales cerca del umbral exacto (menor sensibilidad al ruido). Dedup interno vía set; salida ordenada alfabéticamente.
Se descartan reglas lógicamente equivalentes llevándolas a una forma canónica única.
Se conserva la primera regla vista por cada forma canónica.
Umbrales cercanos del mismo (indicador, operador) se agrupan y se promedian. El clustering es secuencial sobre los valores ordenados.
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.
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.
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:
| vela | rsi_14 ≥ 70 | sma_20 ≥ sma_50 | adx_14 ≥ 25 | zscore_20 ≥ 2 | … |
|---|---|---|---|---|---|
| 2023-01-02 09:00 | 1 | 0 | 1 | 0 | … |
| 2023-01-02 10:00 | 0 | 0 | 1 | 1 | … |
| 2023-01-02 11:00 | 0 | 1 | 0 | 0 | … |
| 2023-01-02 12:00 | 1 | 1 | 1 | 0 | … |
| … | … | … | … | … | … |
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.
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.
Selección greedy en el triángulo superior (k=1):
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