In questo articolo descriviamo come leggere ed interpretare il riepilogo delle prestazioni dello strategy tester di Tradingview per il trading algoritmico. In particolare descriviamo il significato dei singoli dati del report e come usarli per determinare le prestazioni di una strategia.
Per completezza, l’articolo descrivere ogni metrica con un breve commento, anche se la metrica sembra autoesplicativa. Per ulteriori tutorial e contenuti rivolti ai neofiti è possibile leggere gli altri articoli relativi a Tradingview su DataTrading.info.
Riepilogo delle prestazioni – Codice di test
Per capire come interpretare i report prodotti da Tradingview, usiamo un codice per fare dei backtest e verificare come influisce su ogni metrica. A tale scopo usiamo il seguente codice che semplicemente prevede di aprire e chiudere un trade a specifiche date preimpostate. Dato che possiamo controllare le date di ingresso e di uscita, possiamo misurare, controllare e verificare i risultati.
//@version=3
strategy("Metrics Investigation", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=20)
T1_On = input(true, title='Trade 1')
T1_Enter_Year = input(defval = 2018, title = "Trade 1 Entry Year")
T1_Enter_Month = input(defval = 1, title = "Trade 1 Entry Month", minval = 1, maxval = 12)
T1_Enter_Day = input(defval = 1, title = "Trade 1 Entry Day", minval = 1, maxval = 31)
T1_Exit_Year = input(defval = 2018, title = "Trade 1 Exit Year")
T1_Exit_Month = input(defval = 2, title = "Trade 1 Exit Month", minval = 1, maxval = 12)
T1_Exit_Day = input(defval = 1, title = "Trade 1 Exit Day", minval = 1, maxval = 31)
T1_Enter = timestamp(T1_Enter_Year, T1_Enter_Month, T1_Enter_Day, 00, 00) // backtest start window
T1_Exit = timestamp(T1_Exit_Year, T1_Exit_Month, T1_Exit_Day, 00, 00) // backtest finish window
T2_On = input(false, title='Trade 2')
T2_Enter_Year = input(defval = 2018, title = "Trade 2 Entry Year")
T2_Enter_Month = input(defval = 3, title = "Trade 2 Entry Month", minval = 1, maxval = 12)
T2_Enter_Day = input(defval = 1, title = "Trade 2 Entry Day", minval = 1, maxval = 31)
T2_Exit_Year = input(defval = 2018, title = "Trade 2 Exit Year")
T2_Exit_Month = input(defval = 4, title = "Trade 2 Exit Month", minval = 1, maxval = 12)
T2_Exit_Day = input(defval = 1, title = "Trade 2 Exit Day", minval = 1, maxval = 31)
T2_Enter = timestamp(T2_Enter_Year, T2_Enter_Month, T2_Enter_Day, 00, 00) // backtest start window
T2_Exit = timestamp(T2_Exit_Year, T2_Exit_Month, T2_Exit_Day, 00, 00) // backtest finish window
T3_On = input(false, title='Trade 3')
T3_Enter_Year = input(defval = 2018, title = "Trade 3 Entry Year")
T3_Enter_Month = input(defval = 5, title = "Trade 3 Entry Month", minval = 1, maxval = 12)
T3_Enter_Day = input(defval = 1, title = "Trade 3 Entry Day", minval = 1, maxval = 31)
T3_Exit_Year = input(defval = 2018, title = "Trade 3 Exit Year")
T3_Exit_Month = input(defval = 6, title = "Trade 3 Exit Month", minval = 1, maxval = 12)
T3_Exit_Day = input(defval = 1, title = "Trade 3 Exit Day", minval = 1, maxval = 31)
T3_Enter = timestamp(T3_Enter_Year, T3_Enter_Month, T3_Enter_Day, 00, 00) // backtest start window
T3_Exit = timestamp(T3_Exit_Year, T3_Exit_Month, T3_Exit_Day, 00, 00) // backtest finish window
T1 = T1_On ? time >= T1_Enter and time <= T1_Exit : false
T2 = T2_On ? time >= T2_Enter and time <= T2_Exit : false
T3 = T3_On ? time >= T3_Enter and time <= T3_Exit : false
bgcolor(T1 or T2 or T3 ? green : na, transp=75)
strategy.entry("Trade 1", strategy.long, when=T1)
strategy.close("Trade 1", when=not T1)
strategy.entry("Trade 2", strategy.long, when=T2)
strategy.close("Trade 2", when=not T2)
strategy.entry("Trade 3", strategy.long, when=T3)
strategy.close("Trade 3", when=not T3)
Profitto netto
Il formale significato di Net Profit su Internet è:
Il net profit è il profitto dopo che sono state pagate le spese di lavoro non incluse nel calcolo dell’utile lordo
Tuttavia, possiamo pensare più semplicemente pensare al net profit come il profitto (o perdita) finale dopo aver pagato le commissioni. Le commissioni sono le nostre uniche spese durante il backesting.
Possiamo verificare questa modifica:
- Inserire il codice di test sul grafico dell’oro
- Aprire la scheda delle proprietà della strategia
- Aggiungere una commissione
Utile lordo
Il Gross Profit è spesso oggetto di confusione. Per la maggior parte delle persone, il termine profitto lordo è l’opposto di utile netto, cioè il profitto totale realizzato prima di sottrarre le commissioni. Questo è implicito anche dalla definizione formale di Net Profit
. In realtà, il Gross Profit in Tradingview è la SOMMA dei profitti di tutti i trade vincenti. Inoltre, questa è la SOMMA dei Net Profit
di tutti i trade vincenti!
Carichiamo il nostro codice di esempio su un grafico e aggiungiamo una commissione come abbiamo fatto nel primo esempio per produrre il riepilogo delle prestazioni dello strategy tester di Tradingview. Vediamo che l’utile lordo e l’utile netto sono uguali, nonostante sia stata pagata una commissione.
Nel secondo esempio, attiviamo il nostro secondo trade. A causa dell’elevata commissione, abbiamo aggiunto un 1%, il secondo trade si traduce in una perdita. È qui che possiamo vedere come viene effettivamente calcolato il Gross Profit su Tradingview.
Perdita lorda
Il Gross Loss
è esattamente l’opposto del Gross Profit
, cioè è la SOMMA del PNL o di tutti i trade in perdita, incluso il costo della commissione.
Drawdown massimo
Il drawdown è generalmente definito come segue:
Un drawdown è la distanza dal picco più alto al picco più osservato di un investimento, conto o capitale durante uno specifico periodo di tempo. Un drawdown è solitamente indicato come la percentuale tra il picco e il successivo minimo.
Fonte: https://www.investopedia.com/terms/d/drawdown.asp
Quindi un drawdown è una differenza tra il valore del conto prima dell’inizio del drawdown (cioè quando perdiamo uno o più trade) e il valore del conto alla fine dell’ultimo trade perdente. Possiamo mostrarlo sul grafico usando il parametro strategy.max_drawdown
integrato in Tradingview e confrontarlo con l’elenco dei trade.
Per dimostrare il funzionamento, modifichiamo il codice precedente. Non ha abbastanza trade per fornire una buona panoramica. Invece, usiamo una strategia della semplice media mobile integrata nel modello che appare ogni volta che facciamo clic su “nuovo script di strategia vuota”:
Quindi visualizziamo il grafico del strategy.max_drawdown
, limitando la data di inizio del trading per aiutare a dimostrare la logica. Ciò si tradurrà nel seguente grafico:
Come possiamo vedere dal grafico, il Max Drawdown
indica lo cifra del periodo di perdite più grande. Altri drawdown minori sono ignorati.
Sottolineiamo che nel 2018 Tradingview ha cambiato il modo in cui si calcola il Max Drawdown.
D’ora in poi, la variabile strategy.max_drawdown e i campi Max Drawdown nel report sono calcolati tramite una nuova formula basata sul NetProfit.
Si noti che in passato includevamo anche l’OpenProfit .
Fonte: https://blog.tradingview.com/en/maximum-drawdown-calculation-formula-changed-7535/
Infine, dobbiamo essere consapevoli che può essere più difficile creare un buon collegamento tra la lista dei trade e il Max Drawdown
se ridimensioniamo le posizioni (effettuiamo più entrate). Questo perché ogni entrata è riportata separatamente nell’elenco delle operazioni. Inoltre, ogni entrata è eseguita a diversi livelli di prezzo. Alcune potrebbero essere in profitto mentre altre no. Tuttavia, il principio generale rimane lo stesso.
Rendimento Buy & Hold
Il Buy & hold return
è un benchmark molto utile da inserire nelle prestazioni dello strategy tester di Tradingview. Questo valore può aiutarci a decidere la bontà della strategia. Misura quale sarebbe il PNL se avessimo acquistato un asset e lo avessimo tenuto fino alla fine del test. Se non riusciamo a battere il rendimento del buy & hold, non ha senso implementare dal vivo la strategia di trading. Naturalmente, come con qualsiasi cosa, ci sono alcuni avvertimenti. Il primo consiste nel vedere come un vantaggio il rischio ridotto di rimanere intrappolato in una grande recessione se la strategia trascorre pochissimo tempo sul mercato. Inoltre, a seconda della durata del test, possiamo scegliere di ignorare i rendimenti buy e hold in quanto potrebbero non rappresentare un chiaro confronto della performance attraverso diversi regimi/cicli di mercato.
Per confrontare più accuratamente la strategia con una strategia di buy & hold, Tradingview misura il buy & hold dallo stesso istante dove la nostra strategia esegue il primo trade fino alla fine del set di dati (indipendentemente da quando termina l’ultimo trade della nostra strategia). Sarebbe un confronto ingiusto se acquistasse all’inizio del feed di dati e detenesse fino alla fine. Questo è particolarmente vero se lavoriamo con periodi temporali molto lunghi dove i dati possono coprire un decennio o anche più.
Possiamo testarlo con il seguente esempio di codice:
- Posizionare il codice sui grafici.
- Spostare in avanti e indietro le date di inizio/fine del primo trade: notiamo che i rendimenti buy & hold cambiano.
Sharpe Ratio
Nel riepilogo delle prestazioni dello strategy tester di Tradingview una delle metriche più importanti è il Sharpe Factor
, più comunemente noto come Sharpe Ratio. Confronta i rendimenti generati con i rendimenti che potremmo ottenere da un asset privo di rischio. Un asset privo di rischio è un asset che ha un rendimento futuro garantito o un rendimento virtualmente garantito (come i titoli di stato statunitensi: nessuno si aspetta che vadano in default). Lo Sharpe Ratio considera anche della volatilità dei rendimenti generati. Considera specificamente la volatilità come un modo per misurare il rischio. Il motivo è che stiamo assumendo rischi extra, quindi dovremmo ricevere ricavi extra! In quanto tale, l’indice di Sharpe può dirci se il profitto vale il rischio extra che ci assumiamo. La parola d’ordine per questo è rendimenti “aggiustati per il rischio”.
Per interpretare il risultato, questa simpatica regola empirica di Investopedia è eccellente:
un rapporto di 1 o migliore è considerato buono; 2 o meglio è molto buono; e 3 o superiore è considerato eccellente.
Fonte: https://www.investopedia.com/articles/07/sharpe_ratio.asp
Fattore di profitto
Il Profit Factor
è un semplice rapporto tra i valori di Gross Profit e Gross Loss.
Per verificarlo, possiamo inserire il codice di esempio sul grafico giornaliero del XAUUSD e quindi abilitare i trade 1 e 3. In questo modo abbiamo una operazione vincente e una perdente. Usiamo quindi i valori del profitto lordo e della perdita lorda per verificare facilmente questo rapporto:
- $ 482,17 / $ 156,31 = 3,0847 che viene arrotondato a 3,085
Max Contracts Held
Questa è la posizione singola più grande che abbiamo mai avuto in un singolo momento. Possiamo verificarlo scorrendo l’elenco delle operazioni e confrontandolo con la colonna dei contratti di ciascuna operazione.
Nota: se abbiamo attivato la piramidazione e abbiamo più entrate long o shoer, la cifra Max Contracts Held
corrisponde alla somma di tutte le singole entrate sull’operazione più grande. In questo caso, non possiamo confrontare la colonna dei contratti in quanto elenca separatamente ogni entrata.
Open PL
Se abbiamo ancora una posizione aperta alla fine del backtest, l’attuale PnL per quella posizione sarà contenuto in questo valore.
Commissione pagata
Questa è la somma di tutte le commissioni pagate. A meno di aver previsto una commissione durante il backtesting, questo valore sarà $0. Per testare questa metrica, dobbiamo posizionare la strategia di test su un grafico, aprire la scheda delle proprietà della strategia e aggiungere una commissione. Per rendere le cose ancora più facili da verificare, possiamo inserire una commissione fissa di x dollari per ogni ordine. Possiamo quindi vedere chiaramente un collegamento tra il valore in $ e il numero di operazioni effettuate.
Da notare che un trade è composto da 2 ordini. Uno per aprirlo e uno per chiuderlo!
Operazioni chiuse totali
Il Total Closed Trades
è il numero totale di operazioni chiuse. Invece di fornire un’unica metrica di “trade totali”, Tradingview prevde di dividere in trade chiusi e aperti poiché, per definizione, uno trade aperto non è ancora completato e non sappiamo come influenzerà sul resto delle nostre statistiche.
Operazioni totali aperte
Il Total Open Trades
è il numero di posizioni aperte che abbiamo alla fine del backtest. Se abbiamo chiuso tutti i trade, questo valore sarà 0. In caso contrario, considera ogni entrata come una posizione aperta. Questo è applicabile solo se abbiamo attivato la piramidazione e abbiamo inserito più entrate. In caso contrario, il valore sarà 1.
Numero di operazioni vincenti
Il Number Winning Trades
è il numero totale di operazioni vincenti!
Numero di operazioni in perdita
Il Number Losing Trades
è il numero totale di operazioni in perdita.
Trade medio
Un altro valore molto importante nel riepilogo delle calcolare le prestazioni dello strategy tester di Tradingview è il trade medio o average trade. Il Avg Trade
è la somma di tutte le tue operazioni divisa per il numero di operazioni. Per verificarlo possiamo posizionare il codice di esempio sul grafico, caricare XAUUSD su timeframe giornaliero e abilitare tutti i 3 trade. Il Avg Trade
ottenuto è 231,25$, verifichiamolo:
Trade 1 (482,18$) + Trade 2 (367,88$) + Trade 3 (-156,32$) = 693,74$
693,74$ / 3 = 231,2466$
che arrotondato per eccesso è pari a 231,25$
Media Trade Vincenti
Il Avg Win Trade
è la somma delle sole operazioni vincenti diviso il numero delle operazioni vincenti. Quindi possiamo facilmente verificare che:
Trade 1 (482,18$) + Trade 2 (367,88$) / 2 = 425,03$
Media Trade Perdenti
Il Avg Los Trade
è la somma delle sole operazioni perdenti diviso il numero delle operazioni perdenti. Quindi nelk nostro esempio l’Avg Los Trade è la sola operazione in perdita a 156,32$
Rapporto vittoria media / perdita media
Proprio come il Profit Factor
fornisce il rapporto tra i valori Gross Profit
e Gross Loss
, il Ratio Avg Win / Avg Loss
fa la stessa cosa per le rispettive metriche. Possiamo vederlo dividendo il Avg Win
per il Avg Los
e quindi otteniamo:
425,03$ / 156,32$ = 2,71897
Il trade vincente più grande
Il Largest Win Trade
non ha bisogno di presentazioni, restituisce il trade vincente con valore più grande dall’intero elenco dei trade. Possiamo verificarlo scorrendo l’elenco dei trade e controllando che il numero corrisponda a quello più grande. Nel caso del codice di esempio, la più grande operazione vincente giornaliera su XAUUSD è stata di 482,17$.
Nota: da notare che nell’esempio il riepilogo delle prestazioni indica 482,17$ e l’elenco dei trade indica 482,18$. Possiamo solo supporre che si tratti di un bug di arrotondamento di Tradingviews. Se stai leggendo questo in futuro e corrispondono, probabilmente è stato risolto!
Il trade perdente più grande
Il Largest Losing Trade
è l’importo dell’operazione in perdità più grande tra tutte le operazioni nella lista dei trade.
Numero medio di barre per trade
Il Avg # Bars in Trades
è il numero medio di barre per le quali siamo a mercato. Questo è misurato dalla barra in cui entriamo alla barra in cui usciamo. Non limitarti a credermi sulla parola, verifica! Possiamo farlo usando lo strumento di disegno dell’intervallo di date e posizionando il nostro codice di esempio sul grafico giornaliero XAUUSD. Misurando le operazioni e otteniamo qualcosa che assomiglia a questo:
Come possiamo vedere, abbiamo 22, 21 e 23 barre rispettivamente nei 3 trade. Quindi con un semplice calcolo si ottiene il valore finale di 66/3 = 22.
Uh oh… Qualcosa non sembra corretto. Cosa sta succedendo qui? Se ingrandiamo l’immagine e ci concentriamo sull’ultimo trade, contando ogni candela nell’intervallo otteniamo 24 candele. Questo significa 2 cose:
- La barra di uscita è considerata una barra del trade anche se usciamo al prezzo di apertura.
- Lo strumento date range di Tradingview restituisce il numero di barre fino alla fine dell’intervallo esclusa la barra iniziale.
Numero medio di barre per i trade vicenti
La stessa formula si applica al Avg # in Winning Trades
. In questo caso considera solo i trade vincenti e si escludo i trade in perdita.
Numero medio di barre per i trade perdenti
Infine Avg # Bars in Losing Trades
fornisce l’ultima metrica. Questo valore considera solo i trade perdenti nel calcolo della media.
Codice completo
In questo articolo abbiamo descritto come il riepilogo delle prestazioni dello strategy tester di Tradingview per trading algoritmico. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/TradingView