Schemi di Commissioni con Backtrader

Schemi di Commissioni con Backtrader

In questo articolo descriviamo come applicare gli schemi di commissioni con backtrader per creare e verificare strategie di trading algoritmico.

Dopo aver creato le prime strategie di base, il successivo passo logico è aggiungere un livello di realismo ai backtest attraverso le commissioni. Alcune strategie che prevedono frequenti operazioni possono sembrare ottime in un backtest iniziale, tuttavia, se si aggiungo i costi delle commissioni la performance può subire un calo considerevole! In questo articolo descriviamo come implementare alcuni semplici schemi di commissioni e quando abbiamo bisogno di farlo.

 Il framework Backtrader supporta nativamente due schemi di commissioni molto comuni. Il primo tipo è uno schema di commissioni per le azioni. Il secondo è mirato al trading di strumenti futures. Ciascuno di questi schemi di commissioni è ben definito con una buona documentazione di supporto. Detto questo, a mio avviso, l’implementazione è un po’ rigida (di cui parleremo più avanti).

Come vengono applicate le commissioni

Una cosa importante da sottolineare prima di iniziare è l’applicazione delle commissioni sia in acquisito che in vendita. A volte possiamo dimentare questo passaggio e non capire gli importi quando controlliamo il capitale e il profitto lordo.

  • Quando si utilizza uno schema di commissioni che detrae una percentuale, può sembrare che l’importo in dollari detratto sia leggermente diverso dalla percentuale impostata in cerebro. Questo è probabilmente causato da un prezzo differente tra il momento dell’acquisto dello strumento rispetto al prezzo al momento della vendita (e viceversa). In altre parole, non stiamo detraendo una percentuale dal profitto lordo, ma la stiamo detraendo dal valore di ogni transazione.
  • Se applichiamo una commissione fissa, dobbiamo ricordarci di conteggiare il costo totale (round trip) dell’acquisto e della vendita, quindi dimezzare la commissione finale totale che desideri amo detrarre dal PnL.

Semplice configurazione

Se vogliamo operate sulle azioni e il broker prevede commissioni su base percentuale, il modo più semplice per aggiungere  le commissioni è durante l’inizializzazione  di cerebro con il comando: cerebro.broker.setcommission(commission=0.01). In questo modo aggiungiamo una commissione dell’1% sia per l’acquisto che per la vendita. Quindi il 2% in totale. Nella mia esperienza, non ho mai operato con un broker che applichi una percentuale fissa costante alle azioni. In questo caso la configurazione predefinita  non è di grande utilità.

E i future?

Per i futures, possiamo usare lo stesso metodo del broker setcommission() e popolarlo con alcuni valori aggiuntivi, come segue ad esempio cerebro.broker.setcommission(commission=10, margin=2000, mult=10). In questo caso, commission prevede una commissione fissa per  ogni contratto. In altre parole se la nostra size è pari a 1, la commissione è di 10 sia sul lato di acquisto che su quello di vendita. Con una size = 5, la commissione è pari a 50 su ogni lato del commercio. Il parametro margin tiene conto del deposito di  margine che dobbiamo pagare per aprire la posizione. Non è lo stesso tipo di margine che abbiamo nel mondo FX, spread betting e CFD. Ulteriori informazioni sull’implementazione del margine per il mercato Forex sono descritte nell’articolo relativo alla gestione del margine e leva di Oanda con Backtrader. Infine, il mult, cioè “moltiplicatore”, permette di moltiplicare i profitti e/o le perdite finali per questo numero.

Selezione di azioni o futures

Da notare che lo stesso parametro commission è usato per assegnare una commissione fissa per gli strumenti futures e una commissione percentuale per le azioni. Backtrader riesce a capire lo strumento e il tipo di commissione da applicare tramite il parametro margin. Se il parametro margin è valorizzato, backtrader presuppone che stiamo negoziando un contratto futures e imposta una commissione fissa. E’ comunque possibile impostare uno schema di commissioni fisse senza  prevedere un margine iniziale. Impostando margin=0, questo viene valutato come falso e  backtrader applica uno schema basato sulla percentuale.

Non è corretto per i broker che addebitano commissioni fisse?

Certo, ed è per questo motivo che questa l’implementazione di backtrader è un po’ rigida. Potrebbe essere utile assegnare una commissione fissa senza richiedere un deposito di margine. Fortunanamente il framework è statao progettato molto bene ed è aperto alla creazione di schemi commissionali personalizzati. Di seguito è riportato un semplice esempio che permette di aggiungere una commissione fissa ad ogni transazione.

Schemi di commissioni con backtrader

 

Commissioni Fisse

L’esempio seguente fornisce il codice necessario per impostare una commissione fissa sia sul lato di acquisto che su quello di vendita.

				
					
class FixedCommisionScheme(bt.CommInfoBase):
    """
    Questo è un semplice schema di commissioni fisse
    """
    params = (
        ('commission', 5),
        ('stocklike', True),
        ('commtype', bt.CommInfoBase.COMM_FIXED),
        )

    def _getcommission(self, size, price, pseudoexec):
        return self.p.commission
				
			

Descrizione del codice

Nel codice precedente creiamo una classe di schema commissionale ereditando l’oggetto CommInfoBase di Backtrader. Tutto quello che dobbiamo fare è sovrascrivere il metodo _getcommission() e definire cosa restituire quando viene chiamato dal l’oggetto broker. Alcuni parametri predefiniti, come commissionstocklike commtype, sono stati impostati per questo schema. Per un elenco completo di tutti i parametri disponibili possiamo consultare alla documentazione Backtrader CommInfoBase Docs . Nella documentazione di backtrader, stocklike indica se lo strumento oggetto di negoziazione è un’azione e commtype permette di forzare il parametro commission a valore fisso invece che una percentuale. Ogni volta che viene calcolata una commissione, si richiama  il metodo _getcommission(). Quando viene chiamato, si passano i parametri size e price dello strumento. In questo metodo possiamo implemetare i calcoli delle commissioni e restituire un valore return. Da notare che possiamo usare  i parametri definiti sopra il  metodo _getcommission(). Ad esempio possiamo definire un parametro maxcommission (o con un nome a piacere) da usare per limitare a un valore massimo la commissione basata su una percentuale.

Dopo avere definito lo schema delle commissioni, possiamo aggiungerlo a cerebro con le seguenti righe di codice:

				
					
# Imposto commissioni
comminfo = FixedCommisionScheme()
cerebro.broker.addcommissioninfo(comminfo)
				
			

In questo modo applichiamo valori predefiniti allo schema e quindi applichiamo una commissione forfettaria a ciascuna operazione di acquisto/vendita

Codice completo

In questo articolo abbiamo descritto come applicare gli schemi di commissioni con backtrader per creare e verificare 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