Il mondo del trading delle cryptovalute (Bitcoin & Company) rappresenta un ottima opportunità per “sperimentare” i propri algoritmi di backtesting (simulazioni di trading) senza dover per forza investire del denaro. Per lo stesso motivo, il trading vero e proprio è diventato più facile e più appetibile per migliaia di persone, non più relegato ad un élite e ad un mondo esclusivamente finanziario.
Crypto_1_Backtester scritto in linguaggio Python è un simulatore delle operazioni di trading che vi permetterà di trovare la strategia migliore per le vostre operazioni di trading. A tal proposito, il software, utilizza due delle librerie più importanti presenti nel web per oscillatori e indicatori: Ta-lib e Qtpylib. Per quanto concerne la gestione dello stoploss il software utilizza uno stoploss statico e uno stoploss dinamico.
Download & Installazione del Backtester
E’ possibile eseguire il download del backtester al seguente indirizzo: https://github.com/Megalinux/Crypto_1_Backtester. Una volta raggiunta la pagina basta eseguire il download premendo il tasto “Download”.
Oppure, per chi utilizza git, è possibile eseguire la clonazione con il seguente link: https://github.com/Megalinux/Crypto_1_Backtester.git
Come già detto Il software di backtesting è stato scritto in codice python e per eseguirlo bisogna utilizzare una versione maggiore di python 3.4. Per quanto concerne l’installazione del backtester sui sistemi operativi Windows vi consiglio di seguire le indicazioni presenti al seguente link per l’installazione di python:
https://gist.github.com/ricpol/2ca0ae46f02bfddf08036fa85519aa97
Una volta verificato il funzionamento dell’ambiente python, utilizzate pip per eventuali installazioni o aggiornamenti dei pacchetti del backtester con la seguente sintassi dalla cartella principale di installazione.
#pip install -r requirements
Configurazione del backtester.
La prima cosa che dovrete fare prima di eseguire (avviare) il codice, è quella di configurarlo. Per far questo, dovrete modificare il codice sorgente. Per modificarlo potete utilizzare qualsiasi editor, dal blocco note di Windows all’editor Vi di qualsiasi distribuzione GNU/Linux.
Direttamente nel codice avete la possibilità di abilitare e disabilitare alcune opzioni del backtester presenti nel file strategia.py come di seguito elencato.
1) tool.attivazione_stoploss_statico = 0
2) tool.attivazione_stoploss_dinamico = 1
3) tool.profitto = 0.7
4) tool.stoploss_1 = 0.8
5) tool.stoploss_2 = 2.0
6) tool.commissioni = 0.25
7) tool.nrtransizioni = 2000
8) tool.stoploss_dinamico_moltiplicatore = 0.994
9) tool.stoploss_dinamico_formula = “row.close * tool.stoploss_dinamico_moltiplicatore”
10) tool.attivazione_stoploss_dinamico_limiti = 1
11) tool.stoploss_dinamico_min_profitto = 0.8
12) tool.stoploss_dinamico_max_perdita = 2
13) tool.hours = 36
14) tool.periodo = ‘5m’
Lo stoploss statico: configurazione
Lo stoploss statico rappresenta in termini di percentuale il limiti minimo oltre il quale avviene una vendita forzata (sell per stoploss). Facciamo un esempio: se acquisto un asset ad un prezzo di 10 euro e imposto lo stoploss statico a 10, significa che la vendita forzata avverrà quando il prezzo scenderà sotto i 9 euro poiché il 10% di 10 è 1 e quindi, quando il prezzo sarà inferiore a 9 (10-1) avverrà la sell forzata per stoploss statico. Nel software, è previsto che l’attivazione dello stoploss statico avvenga attribuendo il valore 1 al parametro “parametri.attivazione_stoploss_statico” come di seguito mostrato e questo non può essere attivato in contemporanea al parametro parametri.attivazione_stoploss_dinamico.
tool.attivazione_stoploss_statico = 1
La percentuale di stoploss statico, sarà attribuita al parametro parametri.stoploss_1 come di seguito mostrato:
tool.stoploss_1 = 10
In questo caso come da esempio abbiamo attribuito il valore 10 che corrisponde in termini di percentuale al 10%.
Lo stoploss dinamico: configurazione
Passiamo all’attivazione dello stoploss_dinamico. Tale azione avviene tramite l’attribuzione del valore 1 al parametro parametri.attivazione_stoploss_dinamico come di seguito descritto:
tool.attivazione_stoploss_dinamico = 1
Mentre, nello stoploss statico vi è la possibilità di impostare una percentuale del prezzo di buy sotto la quale avviene la vendita “forzata”, nello stop loss dinamico è una formula che determina la vendita “forzata” come mostrato nell’esempio successivo.
tool.stoploss_dinamico_formula = “row.ema3”
Il termine ema3 fa riferimento al calcolo automatico della media mobile esponenziale come descritto nel seguente link https://www.tradingview.com/wiki/Moving_Average#Exponential_Moving_Average_.28EMA.29
e definito all’interno del programma dalla seguente riga di codice.
self.df1[‘ema3’] = ta.EMA(self.df1[‘close’].values,timeperiod=48)
In sintesi, la formula funziona in questo modo: se il valore del prezzo scende al disotto del prezzo calcolato con la formula su citata allora il software eseguirà una vendita “forzata” di stoploss dinamico.
tools.attivazione_stoploss_dinamico_limiti = 1
Inoltre, attivando l’opzione tools.attivazione_stoploss_dinamico_limiti assegnando il valore 1 come indicato, si abiliteranno i limiti minimo di profitto e massimo di perdita in condizione di stoploss dinamico. Come funzionano tali limiti? Pur mantenendo il ragionamento dello stoploss dinamico (vendita secondo formula), la vendita forzata in condizioni di profitto verrà eseguita soltanto nel momento in cui il valore del prezzo sarà superiore al valore in percentuale impostato dal parametro:
tool.stoploss_dinamico_min_profitto = 0.8
Allo stesso modo la vendita in perdita verrà eseguita quando il prezzo scenderà al disotto del valore in percentuale impostato dal seguente parametro:
tool.stoploss_dinamico_max_perdita = 2
Gli esempi successivi mostrano tali condizioni con lo stoploss dinamico attivato e l’opzione limiti attivati.
Come si vede nella figura 1, il “Sellsignal” e quindi la vendita forzata avviene sempre in corrispondenza di un superamento per formula del prezzo dell’asset, ma superiore al limite minimo di profitto impostato.
Parimenti al ragionamento appena fatto, l’acquisto avviene in corrispondenza del buy signal come designato nella strategia, e la vendita nel momento in cui avviene la vendita “forzata” determinata dalla formula dello stoploss dinamico in rispetto del limite minimo di profitto impostato.
Parimenti al ragionamento appena fatto, l’acquisto avviene in corrispondenza del buy signal come designato nella strategia, e la vendita nel momento in cui avviene la vendita “forzata” determinata dalla formula dello stoploss dinamico in rispetto del limite minimo di profitto impostato.
Le commissioni: in acquisto e in vendita!
Infine, per simulare effettivamente la vendita e l’acquisto in un Exchange, bisogna tenere in considerazione anche le commissioni nel caso di vendita e di acquisto. Le commissioni vengono espresse in percentuali rispetto al prezzo di vendita e di acquisto e possono essere, per ora, configurate modificando la seguente variabile presente nella classe Strategia come di seguito descritto.
tool.commissioni = 0.25
Come potete vedere al parametro commissioni viene attribuito il valore 0.25%. Questo significa, che, nel caso di vendita verrà attribuita una percentuale di commissione dello 0.25% al prezzo di vendita e così anche nel caso di un acquisto. Nelle prossime versioni, verranno attribuite le commissioni in maniera differente nel caso di vendita e di acquisto.
Da quando inizia la simulazione?
E’ possibile a seconda dell’exchange utilizzato impostare il numero di ore dal quale partire per la simulazione. Il calcolo verrà eseguito così: ora – il numero di ore impostato. Lo start della simulazione avverrà alle ora (ora – self.hours impostato). Il valore da impostare è il seguente:
tool.hours = 36
E’ importante che il numero delle ore per eseguire la simulazione sia all’interno dell’intervallo consentito dall’Exchange. Per tale motivo vi consiglio di provare prima con intervalli minori di ore (circa 12) e poi aumentarne il valore.
L’impostazione del timeframe.
Uno dei parametri più importanti per ottenere dei buoni risultati è l’attribuzione del timeframe più corretto. Di default lo abbiamo impostato a ‘5m’, ma in realtà lo si può impostare ad altri valori. La variabile a cui si assegna il time frame è la seguente:
tool.periodo = ‘5m’
Per maggiori informazioni sull’assegnazione del timeframe leggete il seguente articolo: https://news.tradimo.com/glossary/time-frame
In particolare la scelta del timeframe insieme alla strategia costituisce una parte importante alla riuscita o meno della stessa.