Le nostre metriche di valutazione devono poter rispondere a una domanda semplice:
su dieci previsioni che indicano un aumento (o una diminuzione) del prezzo rispetto al valore attuale, quante risultano corrette?
Fantastica intuizione. Hai centrato un punto debole cruciale delle metriche classiche come MAE e RMSE.
Il Problema delle Metriche Classiche: Le metriche come MAE e RMSE misurano l’accuratezza della magnitudine (quanto il modello sbaglia in termini di valore assoluto), ma sono completamente cieche rispetto all’accuratezza direzionale. Un modello potrebbe avere un MAE bassissimo ma sbagliare sistematicamente la direzione del movimento, rendendolo inutile (o addirittura dannoso) per una strategia di trading.
La tua domanda — “quante volte ci ha preso sulla direzione?” — è la domanda più importante per un trader.
La metrica che risponde a questa domanda si chiama Directional Accuracy (DA).
Proposta di Integrazione: Aggiungere la “Directional Accuracy”
Propongo di potenziare il nostro “Forecast Lab” integrando la metrica di “Directional Accuracy” a tutti i livelli: dal calcolo nel worker fino alla visualizzazione nella dashboard.
Piano d’Azione Dettagliato
Fase 1: Aggiornamento del ForecastBacktestWorker (Il Motore)
L’obiettivo è modificare il worker affinché calcoli la “Directional Accuracy” per ogni step del backtest.
-
Logica di Calcolo: All’interno del ciclo
forprincipale del worker, subito dopo aver generato una previsione, aggiungeremo una nuova funzione. Questa funzione: a. Prenderà l’ultimo valore del training set come punto di partenza (il “valore attuale” al momento della previsione). b. Confronterà il segno del movimento previsto (previsione[ultimo giorno] - valore attuale) con il segno del movimento reale (dati reali[ultimo giorno] - valore attuale). c. Calcolerà la DA per l’orizzonte di previsione. Ad esempio, se l’orizzonte è di 10 giorni, conterà quanti di questi 10 giorni hanno avuto una previsione direzionale corretta. Solitamente, ci si concentra sulla DA dell’ultimo punto dell’orizzonte. -
Output dei Risultati: Il worker dovrà essere aggiornato per includere questa nuova metrica:
error_history: Il dizionario salvato ad ogni step ora conterrà una nuova chiave:{'date': ..., 'error': ..., 'directional_accuracy': ...}.results: Il dizionario finale includerà una nuova metrica aggregata:"directional_accuracy_mean", che rappresenta la DA media su tutto il periodo di backtest.
Fase 2: Aggiornamento del ForecastResultsWidget (La Dashboard)
L’obiettivo è presentare questa nuova, fondamentale, informazione all’utente in modo chiaro.
-
Nuovo Grafico nella Dashboard:
- Aggiungeremo una nuova scheda nel
QTabWidgetinferiore, accanto a “Error Over Time”, chiamata “Directional Accuracy Over Time”. - Questa scheda conterrà un nuovo grafico Plotly che visualizza l’andamento della
directional_accuracynel tempo. Questo permetterà all’utente di vedere se il modello è stato più bravo a prevedere la direzione in certi periodi rispetto ad altri.
- Aggiungeremo una nuova scheda nel
-
Aggiornamento della Tabella delle Metriche (Visione Futura, ma da pianificare ora):
- Attualmente non abbiamo una tabella di metriche aggregate, ma questo è il momento perfetto per progettarla. La dashboard dovrebbe includere una piccola tabella riassuntiva che mostri:
- Mean Absolute Error (MAE)
- Root Mean Square Error (RMSE)
- Mean Directional Accuracy (%) (es. “58.2%“)
- Attualmente non abbiamo una tabella di metriche aggregate, ma questo è il momento perfetto per progettarla. La dashboard dovrebbe includere una piccola tabella riassuntiva che mostri:
Riepilogo dei Test
- Test Funzionale: L’intero flusso di backtesting si completa con successo.
- Test di Integrazione (UI): La dashboard dei risultati mostra correttamente la nuova scheda e il nuovo grafico di DA.
- Test di Integrazione (Report): Il report HTML esportato contiene i tre grafici, incluso quello della DA.
- Test di Regressione: Le funzionalità preesistenti (grafico Forecast vs. Actuals, grafico Error Over Time) continuano a funzionare come previsto.
Dettagli dei Test Case
Categoria: Test Funzionale (Core Logic)
- Azione dell’Utente:
- Lasciare i parametri di default (“Initial Training Window” = 252, “Error Metric” = MAE).
- Cliccare sul pulsante “Run Backtest”.
- Risultato Atteso:
- Il pannello di progresso appare e la barra di avanzamento si muove.
- Il log nel pannello di progresso mostra gli step di calcolo senza errori critici.
- Il backtest si completa e il pannello di progresso scompare.
- Un messaggio di successo (“Backtest di forecasting completato”) appare nel Log Panel principale.
Categoria: Test di Integrazione (Interfaccia Utente)
- Azione dell’Utente:
- Dopo il completamento del backtest, osservare la dashboard dei risultati che appare.
- Controllare le schede nella parte inferiore della dashboard.
- Risultato Atteso:
- Sono presenti due schede: “Error Over Time” e “Directional Accuracy”.
- Cliccando sulla scheda “Directional Accuracy”, appare un nuovo grafico.
- Il titolo del grafico contiene la DA media calcolata (es. “Mean: 55.30%”).
- L’asse Y del grafico è formattato come percentuale (da 0% a 100%).
Categoria: Test di Integrazione (Esportazione Report)
- Azione dell’Utente:
- Cliccare sul pulsante “Export to HTML” nella barra delle azioni in basso.
- Salvare il file con un nome a scelta.
- Aprire il file HTML salvato in un browser web (es. Chrome, Firefox).
- Risultato Atteso:
- La pagina HTML si carica correttamente e mostra il titolo del report.
- Sono presenti tre grafici interattivi, uno sotto l’altro.
- Il terzo grafico è quello della “Directional Accuracy Over Time” e corrisponde a quello visualizzato nell’applicazione.
Categoria: Test di Regressione (Funzionalità Esistenti)
- Azione dell’Utente:
- Osservare il grafico superiore (“Forecast vs. Actuals”).
- Cliccare sulla scheda “Error Over Time”.
- Risultato Atteso:
- Il grafico “Forecast vs. Actuals” viene visualizzato correttamente con i dati reali e le previsioni.
- Il grafico “Error Over Time” viene visualizzato correttamente, mostrando l’andamento della metrica MAE (o RMSE).
- Entrambi i grafici appaiono anche nel report HTML esportato e sono corretti.