""" scoring/constants.py — Scoring thresholds, scale factors, and reference values. All magic numbers in one place. Tune these via Phase 0 validation. """ # ── Price Structure ────────────────────────────────────────── # ADX thresholds ADX_TREND_THRESHOLD = 25 # ADX > 25 = trending ADX_STRONG_THRESHOLD = 40 # ADX > 40 = strong trend # EMA alignment EMA_ALIGNMENT_BULLISH = 1.0 # EMA20 > EMA60 > EMA120 EMA_ALIGNMENT_NEUTRAL = 0.5 # mixed EMA_ALIGNMENT_BEARISH = 0.0 # EMA20 < EMA60 < EMA120 # Volatility compression (BB width relative to 20d average) BB_COMPRESSION_LOW = 0.7 # < 70% of avg = compressing BB_COMPRESSION_HIGH = 1.5 # > 150% of avg = expanding # Momentum (ROC annualized) ROC_STRONG_BULLISH = 10.0 # % over period ROC_STRONG_BEARISH = -10.0 # Consecutive candle threshold CONSECUTIVE_CANDLES_SIGNAL = 4 # ── Breadth ────────────────────────────────────────────────── # Quantile boundaries for breadth buckets BREADTH_QUANTILES = [0, 0.1, 0.3, 0.7, 0.9, 1.0] # PANIC/WEAK/NORMAL/STRONG/EXTREME # Breadth score computation weights BREADTH_W_ADVANCE = 0.30 # advance/decline ratio BREADTH_W_EMA20 = 0.35 # % above EMA20 BREADTH_W_NEW_HIGHS = 0.20 # new highs count BREADTH_W_BTC_DOM = 0.15 # BTC dominance change (inverted) # ── OI Matrix ──────────────────────────────────────────────── OI_PRICE_THRESHOLD = 0.5 # min |price_change%| to classify OI_OI_THRESHOLD = 0.5 # min |OI_change%| to classify # Score mapping for OI states OI_STATE_SCORES = { "New Longs": 85, "Short Covering": 60, "New Shorts": 20, "Long Exit": 35, "Neutral": 50, } # ── Volatility Regime ──────────────────────────────────────── VOL_LOW = 2.0 # ATR/Close % below this = LOW_VOL VOL_HIGH = 5.0 # ATR/Close % below this = HIGH_VOL (above = EXPLOSIVE) HV_RATIO_LOW = 0.7 # HV(20)/HV(60) below this = compressing HV_RATIO_HIGH = 1.5 # HV(20)/HV(60) above this = expanding # Score mapping VOL_REGIME_SCORES = { "LOW_VOL": 40, # Low vol → neutral with breakout potential "NORMAL_VOL": 55, "HIGH_VOL": 75, "EXPLOSIVE_VOL": 90, } # ── Regime ─────────────────────────────────────────────────── REGIME_W_PRICE = 0.35 REGIME_W_BREADTH = 0.50 REGIME_W_VOL = 0.15 # PANIC: anti-trend + extreme vol (NO Fear/Liquidation) PANIC_W_ANTI_TREND = 0.60 PANIC_W_VOL_EXTREME = 0.40 # ── Trend (L2) ─────────────────────────────────────────────── TREND_W_PRICE = 0.30 TREND_W_BREADTH = 0.70 # ── Maturity ───────────────────────────────────────────────── MATURITY_W_TREND = 0.50 MATURITY_W_BREADTH = 0.30 MATURITY_W_VOL = 0.20 # ── Expectancy ─────────────────────────────────────────────── HALF_LIFE_DAYS = 180 SUFFICIENCY_MIN = 30 SUFFICIENCY_LOW = 50 SUFFICIENCY_MEDIUM = 100 LEVEL_MIN_SAMPLES = 50 KNN_MAX_DISTANCE = 0.35 KNN_K = 200 # ── Validation ─────────────────────────────────────────────── MIN_AVG_DURATION = 5 MAX_FLIP_RATE = 0.15 MIN_IC_THRESHOLD = 0.03 MIN_ICIR_THRESHOLD = 0.5 MIN_IG_THRESHOLD = 0.1 # Information Gain for regime factors MIN_KL_THRESHOLD = 0.5 # KL Divergence for regime separation