Questa è un’ottima direzione. Stai spostando il focus dall’esecuzione di una “singola previsione” (tattica) alla validazione sistematica (strategia). È esattamente quello che farebbe un Quantitative Analyst (Quant).
Quello che descrivi è il passaggio dal Backtesting all’Optimization/Sensitivity Analysis.
Ecco il mio brainstorming strutturato su come potremmo evolvere il Forecast Lab per rispondere a queste domande.
1. La Soluzione al Tuo Problema: “Sensitivity Analysis Mode”
Attualmente il tuo test è un “punto singolo” nello spazio dei parametri. Tu vuoi tracciare una curva.
A. Horizon Sensitivity (La “Curva di Decadimento”)
- Domanda: “Fino a quanti giorni nel futuro il mio modello è affidabile?”
- Come realizzarlo: Invece di un singolo input
Horizon, l’utente seleziona un set (es.[1, 3, 7, 14, 30]giorni). - Il Workflow: Il sistema lancia un batch di backtest. Per ogni horizon, calcola le metriche.
- L’Output Visivo (Cruciale): Un grafico a linea.
- Asse X: Giorni di orizzonte (1, 3, 7…).
- Asse Y: Directional Accuracy (o RMSE).
- Interpretazione: Vedrai tipicamente una curva che scende. Il punto dove l’accuratezza scende sotto il 50% (random guess) è il “Limite di Visibilità” del modello per quel ticker. Oltre quel punto, non dovresti tradare.
B. Ticker Benchmark (La “Leaderboard”)
- Domanda: “Su quale asset questo modello funziona meglio?” (Magari TimesFM è un genio su ENEL ma un disastro su BITCOIN).
- Come realizzarlo: Invece di un singolo ticker, selezioni un’intera Watchlist (es. FTSE MIB).
- Il Workflow: Il
BatchWorkeritera su ogni ticker della lista con gli stessi parametri. - L’Output Visivo:
- Tabella Ordinabile: Ticker ordinati per Directional Accuracy decrescente.
- Heatmap: Una mappa di calore dove verde scuro = alta predicibilità, rosso = bassa.
- Valore: Ti permette di fare “Cherry Picking”: tradi solo i 3 asset che il modello storicamente capisce meglio.
2. Metodi Standard di Analisi (Best Practices dei Quant)
Oltre a cambiare i parametri, ci sono metriche standard per valutare la qualità di un forecaster probabilistico (come TimesFM/Prophet).
C. Calibration Plot (Analisi dell’Affidabilità)
- Il Concetto: I nostri modelli producono bande di confidenza (es. “80%”).
- La Verifica: Se il modello dice “c’è l’80% di probabilità che il prezzo stia qui dentro”, nella realtà storica il prezzo ci è rimasto davvero l’80% delle volte?
- Se ci è rimasto il 95% delle volte → Il modello è Sottostimato (troppo prudente).
- Se ci è rimasto il 50% delle volte → Il modello è Overconfident (pericoloso, crede di sapere ma sbaglia).
- Perché implementarlo: È fondamentale per il Risk Management. Se il modello è overconfident, i tuoi stop loss verranno presi troppo spesso.
D. Profitability Analysis (Simple Trading Strategy)
- Il Concetto: MAE e RMSE sono metriche da data scientist. Al trader interessa il P&L (Profit & Loss).
- La Simulazione: Aggiungiamo un layer semplice sopra il backtest:
- Regola: Se
Previsione(t+1) > Prezzo(t) + Threshold, COMPRA. - Regola: Se
Previsione(t+1) < Prezzo(t) - Threshold, VENDI.
- Regola: Se
- L’Output: Una Equity Curve.
- Perché è critico: Un modello potrebbe avere un’ottima Directional Accuracy (55%), ma sbagliare clamorosamente i grandi movimenti (crash), facendoti perdere soldi. Vedere l’Equity Curve smaschera questi casi.
3. Proposta Concreta per FIRE: Il “Forecast Optimizer”
Potremmo creare una nuova tab (o estendere quella attuale) chiamata “Optimizer”.
Input:
- Universo: Ticker Singolo vs Watchlist Intera.
- Parametro Variabile:
- Nessuno (Test Singolo).
- Horizon (es.
Step range: 5-30, step 5). - Initial Window.
Architettura Tecnica (Senza impazzire): Non serve riscrivere tutto. Possiamo usare il pattern Composite Worker.
- Creiamo un
BatchForecastWorker. - Questo worker non fa calcoli. Al suo interno, istanzia in sequenza N
ForecastBacktestWorker(quelli che abbiamo appena fixato!). - Raccoglie i risultati in un
pandas.DataFrameaggregato. - Passa il DataFrame finale alla UI per fare i grafici comparativi (con Plotly, che è perfetto per questo).
Cosa ne pensi? Quale di queste analisi (“Curva di Decadimento”, “Leaderboard Ticker”, o “Profitability”) senti che darebbe più valore immediato al tuo trading oggi?
Analisi Critica: UI e UX
La risposta è netta: Nuova Tab.
Motivazione Tecnica:
- Divergenza degli Input: La tab “Model Backtester” accetta scalari (un numero per Horizon, un numero per Window). L’Optimizer richiede vettori o range (Min, Max, Step). Mischiare questi controlli creerebbe una UI confusa (“Sto lanciando un test o una serie?”).
- Divergenza degli Output:
- Backtester: Restituisce una time-series (Prezzo vs Previsione) e metriche puntuali.
- Optimizer: Restituisce una curva di tendenza (Metrica vs Parametro).
- Visualizzare una curva di decadimento (Decay Curve) nello stesso spazio dove ci si aspetta un grafico di prezzo violerebbe il principio di minima sorpresa.
- Flusso Operativo: L’ottimizzazione è un’attività “preparatoria”. Prima trovi i parametri migliori (Optimizer), poi esegui il backtest di verifica (Backtester), poi passi al Live. Sono fasi distinte.
Piano d’Azione: Implementazione “Decay Curve”
Chiameremo questa nuova funzionalità Forecast Optimizer.
Componenti da Sviluppare:
-
Backend:
SensitivityAnalysisWorker(Nuovo)- Responsabilità: Eseguire un ciclo di backtest variale.
- Logica: Invece di riscrivere la logica di backtest, questo worker agirà da “Orchestratore Batch”.
- Input:
param_name(es. “horizon”),range(start, stop, step),base_params. - Loop: Per ogni valore nel range, istanzia la logica di calcolo (possiamo riutilizzare la logica core di
ForecastBacktestWorkero estrarla in una funzione pura per evitare overhead di QThread multipli). - Output: Un Dizionario/DataFrame:
{ parameter_value: [MAE, RMSE, DirAccuracy] }.
- Input:
-
Frontend:
ForecastOptimizerTab(Nuovo)- Controlli:
- Selettore Modello (TimesFM, Prophet, ecc.).
- Selettore Parametro da testare (iniziamo solo con Horizon).
- Input Range: Min (es. 1), Max (es. 30), Step (es. 1).
- Visualizzazione:
- Un grafico
QCPlotlyChartWidgetconfigurato per linee semplici (Scatter/Line plot). - Asse X: Horizon (Giorni).
- Asse Y: Metrica (es. Directional Accuracy %).
- Un grafico
- Controlli:
-
Integrazione:
ForecastLabWidget- Aggiunta della terza scheda.
Passo 1: Creazione del Worker di Sensibilità
Poiché vogliamo evitare di lanciare 30 thread pesanti in sequenza (overhead eccessivo), la strategia migliore è refactorizzare leggermente la logica di calcolo.
Tuttavia, per rispettare la regola del “POC First” (visto che stiamo introducendo un loop su calcoli pesanti che potrebbe bloccare o saturare la memoria), ti propongo di creare prima il Worker e testarlo.
Richiesta:
Dammi il via libera per creare il file fire/workers/forecasting/sensitivity_worker.py.
Lo strutturerò per accettare un range di horizon e restituire i dati grezzi per la curva.
Se approvi, procedo con la scrittura del codice del Worker.