In questo articolo descriviamo come implementare il codice per dimensionare una posizione Forex con Backtrader. Questo codice ha richiesto un po’ più di tempo per capire come gestire correttamente il position sizing, quindi ho pensato che sarebbe stato utile condividere i miei risultati.
Scopo
Lo scopo di questo codice è restituire la corretta dimensione della posizione in base alla percentuale di capitale che siamo disposti a rischiare e alla distanza dello stop loss dal prezzo corrente.
Da notare che il codice è progettato per il trading su Oanda dove non ci sono lotti minimi. Su Oanda posso effettuare ordini da 10, 105 o 2.810.245 unità invece di essere vincolato da step fissi di 1.000 (Microlotti), 10.000 (Minilotti) o 100.000 (lotti interi) e così via. Questo è ottimale per chi ha account di piccole dimensioni.
Se vogliamo utilizzare questo codice con i vincoli di dimensioni minime del lotto, dobbiamo aggiungere un codice per arrotondare le unità al lotto minimo più vicino.
Requisiti
Questo script utilizza il framework di backtesting Backtrader, dove possiamo ricavare l’attuale capitale nel conto di trading tramite le chiamata alla seguente funzione:
self.broker.getvalue()
Il codice
def size_position(self, price, stop, risk, method=0, exchange_rate=None, JPY_pair=False):
'''
Funzione di supporto per calcolare la dimensione della posizione
data una quantità nota di rischio.
*Args*
- price: Float, il prezzo corrente dello strumento
- stop: Float, livello di prezzo dello stop loss
- risk: Float, l'ammontare del capitale da rischiare
*Kwarg*
- JPY_pair: Bool, se lo strumento negoziato fa parte di una coppia JPY. Il moltiplicatore
utilizzato per i calcoli verrà modificato di conseguenza.
- method: Int,
- 0: la valuta Acc e la controvaluta coincidono
- 1: la valuta Acc è la stessa della valuta di base
- 2: la valuta Acc non è la stessa della valuta di base o della controvaluta
- exchange_rate: Float, è il tasso di cambio tra la valuta del conto e la controvaluta.
Obbligatorio per il metodo 2.
'''
if JPY_pair == True: # Controllo se il cross contiene lo YEN e quindi modificare il multiplicatore
multiplier = 0.01
else:
multiplier = 0.0001
# Calcolo della quantità da rischiare
acc_value = self.broker.getvalue()
cash_risk = acc_value * risk
stop_pips_int = abs((price - stop) / multiplier)
pip_value = cash_risk / stop_pips_int
if method == 1:
# pip_value = pip_value * price
units = pip_value / multiplier
return units
elif method == 2:
pip_value = pip_value * exchange_rate
units = pip_value / multiplier
return units
else: # se method=0
units = pip_value / multiplier
return units
Dimensionare una posizione Forex
Abbiamo implementato una funzione per calcolare il position sizing. Per rendere riutilizzabile questa funzione, abbiamo aggiunto una logica per le coppie giapponesi e la valuta di base del conto. È qui che entrano in gioco gli argomenti method, exchange_rate e JPY_pair. Per le coppie giapponesi, il valore in pip sulla coppia ha solo a 2 cifre decimali. Ciò influisce sul moltiplicatore utilizzato nei calcoli.
La considerazione successiva è la valuta del conto. A seconda di quale sia la valuta del conto e di quali coppie si sta negoziando, abbiamo un effetto sul calcolo. Di seguito sono riportati esempi sulla logica di calcolo del valore dei pip. Questi esempi sono utili per capire il calcolo dei pip in modo da poter poi capire come calcolare la dimensione della posizione richiesta (unità).
Calcolo del valore del pip
- Scenario 1: se la valuta del conto è la stessa della controvaluta (ad es. un conto in USD che scambia EUR/USD), il calcolo è il più semplice. La posizione è il valore del trade diviso per il moltiplicatore.
- Scenario 2: quando la valuta del conto è la valuta di quotazione. (Es. Un conto in EUR che scambia EUR/USD) dobbiamo aggiungere un passaggio in più.
- Scenario 3: nel caso dove la valuta del conto non è presente nelle coppie del cross (ad esempio un conto in EUR che negozia USD/JPY) dobbiamo ottenere il tasso di cambio tra la valuta del conto e la controvaluta. Una volta ottenuto il valore in pip, lo dividiamo per il tasso di cambio (come nel secondo esempio, utilizzando il tasso di cambio della valuta del conto). Questo lo rende potenzialmente il più complicato da implementare in una strategia poiché dobbiamo monitorare una coppia di valute extra.
Calcolo della dimensione della posizione
Codice completo
In questo articolo abbiamo descritto come dimensionare una posizione Forex con Backtrader. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/BackTrader