Strategie: dalla creazione all’esecuzione.
Come premesso, la creazione delle strategie avviene tramite la codifica di indicatori e/o oscillatori presenti nelle librerie Ta-lib e Qtpylib come mostrato nell’esempio seguente.
self.df1[‘rsi’]=ta.RSI(self.df1.close.values,timeperiod=14)
self.df1[‘adx’] = ta.ADX(self.df1[‘high’].values, self.df1[‘low’].values,self.df1[‘close’].values, timeperiod=14)
self.df1[‘PrezzoMed’] = self.df1[‘close’].mean()
Nei file del codice del backtester sono presenti altri esempi. Una maggiore descrizione degli indicatori e oscillatori li trovate alla seguente pagina internet: https://github.com/mrjbq7/ta-lib e https://github.com/ranaroussi/qtpylib.
Esempio (1) di strategia:
self.df1.loc[(((
self.qt.crossed_above(self.df1[‘rsi’], 70)))), ‘Sellsignal’] =-1
self.df1.loc[(((
self.qt.crossed_below(self.df1[‘rsi’], 35)))), ‘Buysignal’] =1
Come si vede nell’esempio di strategia (1) è stato utilizzato l’indicatore RSI. La strategia riassume il seguente comportamento: si acquista quando il valore di RSI è minore di 35 e si vende quando il valore di RSI risulta maggiore di 70. Per maggiori informazioni vi rimando al seguente articolo: https://www.investopedia.com/articles/active-trading/042114/overbought-or-oversold-use-relative-strength-index-find-out.asp
Da notare come al “BuySignal” (segnale di acquisto) sia assegnato il valore 1, e come al “SellSignal” (segnale di vendita) sia assegnato il valore -1. Ovviamente, i risultati dipendono sia dalla scelta del timeframe piu adatto per la specifica pair e sia dalla configurazione dello stoploss di cui ho ampiamente parlato nella parte precedente.
Un altro esempio di creazione di una strategia è mostrato nell’esempio seguente.
Esempio (2) strategia.
self.df1.loc[(((
self.qt.crossed_below(self.df1[‘macd’], self.df1[‘macdsignal’])))),
‘Sellsignal’] =-1
self.df1.loc[(((
self.qt.crossed_above(self.df1[‘macd’], self.df1[‘macdsignal’])))),
‘Buysignal’] =1
In questo esempio ho implementato le linee guida indicate nel seguente articolo: https://commodity.com/technical-analysis/macd/
La strategia prevede l’acquisto dell’asset nel momento in cui il segnale macd passa attraverso il segnale macdsignal dal basso verso l’alto. Al contrario avviene la vendita, cioè nella situazione in cui il segnale macd passa attraverso il segnale macdsignal dall’altro verso il basso.
Nelle seguenti immagini ho eseguito due simulazioni differenti con la strategia in oggetto attivando lo stoploss statico e con due pair differenti.
Nella figura 3 trovate una simulazione con lo stoploss statico attivato (ricordate che bisogna disattivare lo stoploss dinamico) e la strategia dell’esempio (2). Lo stoploss statico è mostrato dalla linea di colore marrone e diverge dal prezzo di buy dell’asset per la percentuale definita nel parametro tool.stoploss_1.
Nell’immagine presente nella figura 4 vediamo come, in una differente pair, è intervenuta la vendita per stoploss statico (marker di colore rosso) nel momento in cui il prezzo dell’asset è sceso sotto il prezzo dell’asset per la quantità in percentuale indicata nella variabile tool.stoploss_statico_1.
Esempio (3) strategia.
self.df1.loc[(((
self.qt.crossed_below(self.df1[‘macd’], self.df1[‘macdsignal’])))),
‘Sellsignal’] =-1
self.df1.loc[(((
self.qt.crossed_above(self.df1[‘macd’], self.df1[‘macdsignal’])) & (self.df1[‘close’] <self.df1[‘PrezzoMed’]))), ‘Buysignal’] =1
Ora, aggiungendo alla parte di buy della strategia esempio (2) la condizione per cui il prezzo dell’asset deve essere inferiore al prezzo medio calcolato si aggiunge un ulteriore grado di complessità alla strategia, come mostrato nell’immagine seguente.
Come si vede nell’immagine 5 l’azione di buy avviene sotto alla linea del prezzo medio come implementato nel codice della strategia. Il risultato è assolutamente differente dalla strategia (2) e può essere migliorato adottando un timeframe differente o indicatore/oscillatori differenti. E’ ovvio che anche stoploss e scelta della pair determinano un risultato diverso.
Esempio (4) strategia.
Come si vede dalla figura 6 lo stoploss dinamico esegue automaticamente senza alcun limiti di profitto minimo o di perdita minima le azioni di vendita. Tale comportamento è dettato dalla valore zero attribuito al paramentro:
tool.attivazione_stoploss_dinamico_limiti =0
Ma cosa succederebbe se a tale parametro fosse attribuito il valore uno?
Come si vede nella figura precedente l’attivazione dei limiti comporta un situazione migliore in termini di profitto. L’acquisto viene eseguito nel marker verde e la vendita nel marker rosso in corrispondenza del superamento da parte della formula (ema3) del prezzo dell’asset.