d159075182
Phase 1 v0 usava `max(0, dsr - 0.5*max_dd)` che azzerava brutalmente la fitness quando max_dd > 2*dsr. Real run v4 aveva 55/55 strategie a fitness=0 (DSR ~0.001, max_dd > 0.5), zero pressione selettiva sul GA. v1: base = 0.5*dsr + 0.5*0.5*(tanh(sharpe)+1) in [0,1], modulata da penalty moltiplicativa 1/(1+k*max_dd) in (0,1]. Hard kill (no-trade, HIGH adversarial) preservati. Fitness sempre >0 per strategie con almeno 1 trade -> il GA puo' preferire "meno cattivo" a "catastrofico" anche su sharpe negativo. Tests: +3 nuovi (continuous mediocre, bounded, monotonic drawdown), 4 esistenti restano verdi. Suite 138 -> 141 passed. ruff + mypy strict puliti. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>