feat(fitness): multi-objective combined = alpha*IS + (1-alpha)*OOS opt-in
Aggiunti due meccanismi per selection multi-objective: 1) Helper compute_combined_fitness(fit_train, fit_oos, alpha): formula = alpha*IS + (1-alpha)*OOS, fallback a IS se OOS è None/NaN. 2) RunConfig.eval_oos_during_loop (default False) + fitness_combined_alpha (default 0.5). Quando True E wfa_train_split attivo, ogni genome con fitness IS > 0 viene rivalutato su test_ohlcv DURANTE il loop GA e la fitness usata per tournament_select/elite_select è quella combinata. 2x costo backtest engine (richiede 2 evaluation per genome). 3) CLI flags --eval-oos-during-loop e --fitness-combined-alpha. Motivazione: il run phase2-7-max7y-v2-wfa-001 ha mostrato che il top by fitness_IS (4e1be9fa, ratio OOS 0.31) NON è il top per performance OOS reale (634111992702, ratio 1.42, ret_OOS +105% / 2.2y). Selezionare durante GA con combined fitness orienta l'evoluzione verso strategie OOS-robust by design invece di filtrarle a posteriori. Backward compat: default eval_oos_during_loop=False → comportamento invariato per run senza il flag. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -81,6 +81,21 @@ def parse_args() -> argparse.Namespace:
|
||||
default=5,
|
||||
help="Walk-forward: quanti top genomi rivalutare OOS (default 5)",
|
||||
)
|
||||
p.add_argument(
|
||||
"--eval-oos-during-loop",
|
||||
action="store_true",
|
||||
help=(
|
||||
"Multi-objective: eval ogni genome anche su test_ohlcv durante "
|
||||
"il loop e usa combined = alpha*IS + (1-alpha)*OOS per selection. "
|
||||
"Richiede --wfa-train-split. 2x costo backtest engine."
|
||||
),
|
||||
)
|
||||
p.add_argument(
|
||||
"--fitness-combined-alpha",
|
||||
type=float,
|
||||
default=0.5,
|
||||
help="Multi-objective: peso IS (1-alpha = OOS). 1.0=solo IS, 0.5=bilanciato, 0.0=solo OOS",
|
||||
)
|
||||
return p.parse_args()
|
||||
|
||||
|
||||
@@ -144,6 +159,8 @@ def main() -> None:
|
||||
fitness_adversarial_soft_penalty=args.fitness_soft_penalty,
|
||||
wfa_train_split=args.wfa_train_split,
|
||||
wfa_top_k=args.wfa_top_k,
|
||||
eval_oos_during_loop=args.eval_oos_during_loop,
|
||||
fitness_combined_alpha=args.fitness_combined_alpha,
|
||||
)
|
||||
|
||||
run_id = run_phase1(cfg, ohlcv=ohlcv, llm=llm)
|
||||
|
||||
Reference in New Issue
Block a user