indicatore di swing con backtrader

Indicatore di Swing con Backtrader

In questo articolo descriviamo come creare un indicatore di swing con backtrader per le nostre strategie di trading algoritmico. Identificare gli swing (noti anche come pivot) può essere molto utile per vari stili di trading. Un semplice esempio è quando si vuole seguire i trend dove vogliamo entrare in un ritracciamento o impostare gli stop appena sotto lo swing più recente.

Nota: questo post presuppone un certo livello di familiarità con Backtrader e Python. Presumiamo le conoscenze di base e come inizializzare un indicatore in una strategia. Se sei nuovo su Backtrader, potresti trovare utile l’introduzione descritta in Setup di base per Python e BackTrader.

Indicatore di Swing con backtrader

Come suggerisce il nome, l’indicatore di swing produce un segnale quando determina la presenza di uno swing. Data la natura degli swing, possiamo identificare uno swing solamente dopo che lo swing è avvenuto. Dobbiamo aspettare che appaiano altre candele prima di poter essere sicuri che si tratti di uno swing. Con questo in mente, l’indicatore di swing deve essere abbastanza flessibile in modo che la “sensibilità” possa essere modificata in base alle preferenze personali.

La logica dell’indicatore prevede di:

  • Analizzare una candela storica e le candele circostanti per determinare se si è verificato uno swing.
  • L’indicatore lo considererà uno swing se:
    1. La candela che viene controllata è il massimo più alto del periodo considerato, sia prima che dopo di essa.
    2. La candela che viene controllata è il minimo più basso del periodo considerato, sia prima che dopo di essa.
  • Una volta identificato, crea un segnale:
    1. Swing High = 1
    2. Swing Low = -1
    3. Nota: possiamo anche invertirli, come descritto nel paragrafo dei risultati.
  • utilizziamo una seconda linea “Indicatore” per segnalare quando è avvenuto lo swing (non quando è stato segnalato). Questo è utile per verificare che l’indicatore funzioni come previsto.

Il codice

				
					import backtrader as bt

class SwingInd(bt.Indicator):
    '''
    Un semplice indicatore di swing che misura le oscillazioni (il valore più basso/più alto)
    in un determinato periodo di tempo.
    '''
    lines = ('swings', 'signal')
    params = (('period', 7),)

    def __init__(self):
        # Imposta l'intervallo dello swing: il numero di barre prima e dopo lo swing
        # necessarie per identificare uno swing
        self.swing_range = (self.p.period * 2) + 1
        self.addminperiod(self.swing_range)

    def next(self):
        # Calcolo gli highs/lows nel periodo
        highs = self.data.high.get(size=self.swing_range)
        lows = self.data.low.get(size=self.swing_range)
        # Controllo se la barra nel centro del ragne è più grande delle alte
        if highs.pop(self.p.period) > max(highs):
            self.lines.swings[-self.p.period] = 1  # aggiunge un nuovo swing
            self.lines.signal[0] = 1  # crea il segnale
        elif lows.pop(self.p.period) < min(lows):
            self.lines.swings[-self.p.period] = -1  # aggiunge un nuovo swing
            self.lines.signal[0] = -1  # crea il segnale
        else:
            self.lines.swings[-self.p.period] = 0
            self.lines.signal[0] = 0
				
			

Commento al codice

Notiamo che creare un indicatore  di swing con backtrader non è molto complesso. Tuttavia, vale la pena descrivere ulteriormente un paio di righe:

				
					
        self.swing_range = (self.p.period * 2) + 1

				
			

Dobbiamo analizzare i dati storici sia PRIMA che DOPO la candela che stiamo controllando. Quindi l’intero intervallo è il doppio del periodo che specifichiamo. Il + 1, assicura che abbiamo una quantità uguale di candele su entrambi i lati della candela che viene analizzata. Quindi dobbiamo calcolare i dati:

				
					highs = self.data.high.get(size=self.swing_range)
lows = self.data.low.get(size=self.swing_range)

				
			

Vale la pena ricordare che a causa del modo in cui Backtrader indicizza i dati in una riga, non possiamo suddividere i dati nello stesso modo in cui lo faremmo normalmente in Python. Per questo motivo abbiamo bisogno di utilizzare uno speciale metodo get()  del framework per restituire i dati che vogliamo controllare.

Infine con pop() estraiamo dalla lista la candela da analizzare e la confrontiamo con il resto delle candele nella lista. Se abbiamo un massimo più alto o un minimo più basso rispetto al resto delle candele, allora abbiamo uno swing!

Risultati

Il primo risultato mostra un periodo impostato come 7.

Nota: la linea rossa è la linea dello swing e la linea blu è la linea del segnale. Possiamo agire solo sulla linea del segnale poiché la linea dello swing viene modificata dopo che il swing si è verificato.

Backtrader-Swing-Ind-P7-Zoom-Web

Con un periodo così breve possiamo vedere che vengono generati molti segnali. Ingrandiamo per uno sguardo più da vicino:

Backtrader-Swing_Ind_p7_Zoom_In-Skitch-web

Ingrandendo, possiamo vedere che catturiamo le buone oscillazioni e generiamo un segnale abbastanza presto per catturare buona parte del movimento successivo. Il rovescio della medaglia è che rileviamo anche swing discutibili e insignificanti.

Ora che stiamo esaminando il grafico in modo più dettagliato, possiamo menzionare il motivo per cui potremmo voler cambiare i valori del segnale. Finora abbiamo identificato con -1 è uno swing low e con 1 uno swing high. Se si desidera utilizzare questo indicatore all’interno di uno script di soli segnali, avrebbe più senso capovolgerli. In questo modo abbiamo -1 per uno swing high che indica un segnale short. Al contrario, abbiamo 1 per uno swing low, che indica un segnale low.

Infine confrontiamo i risultati con un periodo di 14:

Backtrader-Swing_Ind_p14_Zoom_Skitch-web

Come possiamo vedere nell’immagine, non abbiamo il problema di segnalare swing di bassa qualità. Tuttavia, con un periodo così lungo, i segnali che generiamo arrivano parecchio tempo dopo lo swing.

Quindi, in conclusione, è necessario trovare un compromesso tra  la necessità di generare segnali rapidamente e la necessità di  individuare solo gli swing significativi. Con un periodo troppo lungo, il prezzo potrebbe aver già effettuato gran parte del movimento di ritracciamento. Con un periodo troppo breve, potremmo intercettare troppo rumore. Personalmente ritengo che un periodo più breve possa essere adatto a coloro che cercano di capitalizzare il movimento del prezzo subito dopo uno swing. D’altra parte, un periodo più lungo può essere adatto a coloro che vogliono semplicemente fermarsi dopo uno swing significativo e non vogliono essere colti di sorpresa dal rumore.

Codice completo

In questo articolo abbiamo descritto come creare un indicatore di swing con backtrader per le nostre strategie di trading algoritmico. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/BackTrader

Scroll to Top