99 lines
4.0 KiB
Python
99 lines
4.0 KiB
Python
"""
|
|
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
|