DESIGN DOC: Architettura Batch Backtest & Comparative Analysis

Stato: Draft per Revisione Obiettivo: Ridisegnare la Tab Backtest per supportare l’esecuzione, il confronto e l’analisi di molteplici strategie simultaneamente senza cluttering visivo.


1. Il Problema Attuale (UX/UI Mismatch)

L’attuale interfaccia è progettata per il Single-Run Paradigm:

  1. Spazio: Il StrategySelectorWidget “inline” ruba spazio prezioso al grafico e ai risultati.
  2. Ambiguità Dati: La tabella dei risultati mostra un solo set di metriche. Se eseguo 3 strategie, quale sto guardando?
  3. Caos Visivo: Sovrapporre i segnali di 3 strategie diverse sullo stesso grafico crea “rumore” illeggibile. Una Equity Line aggregata (somma di tutte) non ha senso statistico per la comparazione.

2. La Nuova Visione: “Leaderboard & Drill-Down”

Proponiamo un’architettura Master-Detail.

2.1. Workflow Utente

  1. Configurazione (Modale): L’utente clicca “Configure Batch…“. Si apre un dialogo (simile allo Scanner) dove seleziona le strategie (es. RSI, MACD, Bollinger) e i parametri.
  2. Esecuzione: Lancia il Batch.
  3. Leaderboard (Master): Al termine, appare una Tabella Comparativa (una riga per strategia).
    • Colonne: Nome Strategia | Net Profit % | Max DD | Win Rate | Profit Factor | # Trades.
    • Ordinamento: L’utente può ordinare per Profitto o Drawdown per trovare la migliore.
  4. Analisi (Detail):
    • L’utente clicca una riga nella Leaderboard (es. “RSI Strategy”).
    • Il Grafico si pulisce e mostra solo i segnali di quella strategia.
    • La Equity Line mostra solo la curva di quella strategia.
    • I Dettagli mostrano la tabella completa delle metriche per quella strategia.

3. Specifiche Tecniche dei Componenti

A. UI: Il Pannello di Controllo (BacktestTabWidget)

Deve essere ripulito drasticamente.

  • Top Bar:
    • Bottone “⚙️ Configure Strategies”: Apre il BatchConfigDialog (nuovo, basato su quello dello Scanner).
    • Bottone ”▶ Run Batch”: Lancia l’esecuzione sequenziale delle strategie selezionate.
    • Label riassuntiva: “3 Strategies Selected” (o simile).
  • Area Centrale (Splitter Orizzontale):
    • Sinistra (Risultati):
      • In alto: BatchResultsTable (La Leaderboard).
      • In basso: DetailedStatsTable (Le metriche dettagliate della riga selezionata).
    • Destra (Visualizzazione): Il Grafico (Chart + Equity).

B. Logica: Il Batch Orchestrator

Il BacktestOrchestrator deve evolvere per gestire un ciclo:

def run_batch(self, strategies_config: List[Dict]):
    self.batch_results = []
    for config in strategies_config:
        # 1. Esegui Backtest Headless (senza aggiornare il grafico)
        result = self.run_single_strategy(config)
        self.batch_results.append(result)
    
    # 2. Popola la Leaderboard con tutti i risultati
    self.ui.update_leaderboard(self.batch_results)
    
    # 3. Seleziona automaticamente la prima (o la migliore) per aggiornare il grafico
    self.ui.select_result(0)

C. Visualizzazione: Il Principio “Context Switch”

Il grafico non deve mai mostrare più di una strategia alla volta.

  • Quando l’utente seleziona una riga nella Leaderboard, viene emesso un segnale strategy_selected(result_id).
  • Il PlottingHandler riceve i dati di quella specifica run e ridisegna il grafico da zero (o aggiorna i marker).

4. Confronto Proposta vs Attuale

CaratteristicaImplementazione AttualeNuova Proposta (Batch Design)
SelezioneWidget ingombrante nella tab.Dialogo pulito a scomparsa.
MetricheSolo ultima esecuzione.Tabella Comparativa (Leaderboard).
GraficoSovrapposizione o confusione.Drill-Down: Mostra solo la strategia selezionata.
EquityAmbiguita.Specifica per la strategia selezionata.
ScopoTest singolo rapido.Ottimizzazione e Confronto.

5. Piano di Implementazione Rivisto

Se approvi questo design, il piano cambia:

  1. Step 1 (Configurazione): Creare BatchConfigDialog (copiando e adattando SignalConfigDialog dello Scanner) per selezionare le strategie fuori dalla tab principale.
  2. Step 2 (Modello Dati): Creare una struttura dati per tenere in memoria N risultati di backtest (List[BacktestResult]).
  3. Step 3 (Leaderboard UI): Implementare la QTableView per la Leaderboard.
  4. Step 4 (Interaction): Collegare il click sulla Leaderboard all’aggiornamento del grafico (Plotting).

Che ne pensi? Questo design risolve i tuoi 3 punti critici:

  1. Spazio: Il selettore è in un popup.
  2. Tabella: C’è una Leaderboard chiara.
  3. Grafico: Mostra solo una strategia alla volta (quella che stai analizzando nella tabella).