Strategie di trading: la creazione di un algoritmo

Redazione

20 Novembre 2019 - 15:51

Parte 6 - Strategie di trading: la creazione di un algoritmo

Strategie di trading: la creazione di un algoritmo

Nell’ultimo articolo abbiamo installato il pacchetto Zipline e scritto ed eseguito un semplice algoritmo di trading.

Il tutto era ancora relativamente superficiale e serviva a darvi una panoramica dell’intera procedura.

In questa parte finale della nostra serie Phyton, approfondiremo l’argomento e creeremo un nuovo algoritmo di trading basato su una strategia momentum.

L’approfondimento è a cura di TRADERS’ Magazine Italia

Introduzione

Il presupposto di base della strategia momentum è che la performance passata abbia un potere esplicativo per il futuro. Quindi, se il prezzo di un titolo è salito in passato, dovrebbe continuare a salire in futuro. Questa idea viene sfruttata e investita in titoli che sono andati bene precedentemente.

In questo articolo ci concentreremo sull’esempio di Microsoft. Se il titolo è superiore del due percento rispetto alla sua media di 5 giorni, lo acquisteremo con una ponderazione del sei percento del nostro portafoglio. Se il prezzo è nuovamente inferiore alla media di 5 giorni, allora venderemo i nostri titoli. Questa semplice strategia è solo long, il che significa che non venderemo il titolo short quando è in una tendenza al ribasso.

Documentazione Quantopian

Poiché questo è l’ultimo articolo della serie, lavoreremo su esempi algoritmici concreti che sono simili a quelli nella documentazione di Quantopian. Ciò ha il vantaggio che, a posteriori, è possibile ottenere una spiegazione sull’algoritmo anche da un’altra fonte. È importante capire che l’algoritmo presentato è solo un esempio.

È possibile utilizzare la documentazione Quantopian per strutturare l’algoritmo individualmente. Ad esempio, ci sono vari modi in cui un titolo può essere tradato. Non si deve necessariamente spendere una determinata percentuale del proprio portafoglio su di esso, ma è possibile specificare numeri di unità separatamente. È vantaggioso utilizzare allo stesso tempo la documentazione Quantopian.

Sul sito web quantopian.com a sinistra potete vedere una panoramica di tutti gli argomenti trattati. Nella parte superiore c’è “Quantopian Overview”, subito sotto “Important Concepts”. Scorrendo più in basso, troverete l’argomento “API Documentation”. Quest’area è molto importante per voi se volete continuare a lavorare con Quantopian.

Ad esempio, ci occuperemo delle funzioni di base di inizializzazione, handle_data e before_trading_start (scriviamo “funzioni,” non “metodi” perché i metodi di “programmazione orientata agli oggetti” non sono stati da noi trattati). Ad esempio, se si desidera acquistare un titolo, sotto “Order Methods” sono disponibili diverse funzioni che è possibile utilizzare per acquistare titoli. Uno di questi è “order (asset, amount, style = orderType)” (vedi figura 1).

Dalla descrizione risulta immediatamente evidente cosa fa questa funzione: acquista un certo numero di azioni o future. Si vede anche che, quando si chiama questa funzione, è necessario passare un valore almeno ai parametri “asset” e “amount”.

Il terzo parametro è un parametro facoltativo, che è l’impostazione predefinita. Naturalmente si può sovrascriverlo. Quindi, se si desidera acquistare 50 azioni di Apple, ad esempio, si potrebbe teoricamente farlo in questo modo: “Order (asset
= Apple, amount = 50 pezzi)”.

Il problema è che bisogna mettere in pratica questa teoria. Python non capirà cosa si intende per “Apple” e “50 pezzi”. Pertanto, si possono solo passare valori che Python conosce già. Lo faremo con il nostro algoritmo. L’ultimo argomento principale è “Sample Algorithms”. Da questa area creiamo un algoritmo simile. A scopo di confronto e apprendimento, è utile confrontare il nostro algoritmo con gli algoritmi di Quantopian.

Programmare la strategia

L’algoritmo da programmare può essere diviso in tre aree. Nella prima sezione importiamo i pacchetti richiesti. Nella seconda lavoriamo con la funzione di inizializzazione che già conoscete. L’ultima sezione contiene la definizione di una funzione separata, che viene quindi richiamata.

La funzione appositamente sviluppata nasconderà anche l’elemento centrale dell’algoritmo. All’interno della funzione di inizializzazione, si vede che all’inizio della variabile “context.titolo” passiamo l’oggetto chiamato dalla funzione “symbol(,msft’)”. Ciò significa che ora si può accedere al titolo Microsoft all’interno dell’algoritmo ogni volta che si scrive “context.titolo”.

Questo funziona anche al di fuori della funzione di inizializzazione, ma fintanto che viene utilizzato “context”. Quindi basta scrivere “titolo = symbol(,msft’)”: questo sarebbe utilizzabile solo all’interno della funzione di inizializzazione. Il secondo comando che troveremo all’interno della funzione di inizializzazione è “schedule_function (...)”.

Questo comando è importante se si desidera scrivere la propria funzione e, ad esempio, chiamarla una volta al giorno. La frequenza e quando viene chiamata questa funzione personalizzata è determinata dalla funzione “schedule_function (...)”. Questa funzione ha parametri predefiniti che si possono o si devono chiamare per determinare come viene chiamata la propria funzione sviluppata. I parametri sono i seguenti:

  • “func”: Qui si specifica come si chiama la funzione che dovrebbe essere richiamata.
  • “date_rule”: Qui si determina in quale giorno specifico viene richiamata la funzione.
  • “time_rule”: Qui si determina l’ora in cui viene richia- mata la funzione.
  • “calendar”: Qui è possibile determinare quale calen- dario deve essere utilizzato per la propria funzione, ad esempio per tenere conto delle festività.

Nel nostro caso specifico scriviamo: “Schedule_function (func = propria funzione, date_rule = date_rules.every_day ())”. Ciò significa che vogliamo richiamare la funzione con il nome “funzione personalizzata” una volta al giorno. Non abbiamo specificato ulteriori dettagli, quindi vengono applicate le impostazioni predefinite per “time_rule” e “calendar”.

Finora abbiamo determinato nell’algoritmo il titolo a cui siamo interessati e che vorremmo avere la nostra funzione una volta al giorno. Ciò che manca ora è la strategia momentum. Sarà in una funzione separata.

Come nei precedenti articoli di questa serie, ora definiamo semplicemente una funzione con “def propria funzione (context, data)”. Per il nostro algoritmo, ora abbiamo bisogno di dati in modo che sappia, ad esempio, se un titolo è al di sopra del prezzo medio. Per questo definiamo la variabile “prezzo_storia”. La funzione “data.history (...)” ci fornisce i dati dal database.

Per questo dobbiamo solo spiegare alla funzione “data.history (...)” di quali dati abbiamo bisogno. Ancora una volta, lo facciamo come “schedule_function”, con parametri. In particolare, abbiamo definito questo come segue: “Prezzo_storia = data.history (symbols = context.titolo, fields = ‘price’, bar_count = 5, frequency = ‘1d’). Ciò significa che vorremmo avere prezzi giornalieri per il titolo “context. titolo” per cinque giorni.

Per il nostro algoritmo, abbiamo bisogno del prezzo medio degli ultimi cinque giorni e dell’attuale prezzo del titolo. A tale scopo rimandiamo alla variabile “prezzo_storia” precedentemente definita. Quindi definiamo due variabili “prezzo_medio” e “prezzo_attuale” da utilizzare all’interno della “Funzione IF”. La prima “Funzione IF” utilizza “data.can_ trade (context.titolo)” per determinare se la condivisione “context.titolo” era o è tradabile.

In tal caso, passa alla “Funzione IF” successiva, che vuole sapere se l’attuale prezzo dei titoli è del due percento superiore al tasso medio. In tal caso, il titolo sarà acquistato al sei percento del valore del portafoglio: “Order_target_per- cent (context.titolo, 6)” successivamente viene restituita l’informazione relativa all’acquisto del titolo.

All’interno della seconda “funzione if”, tuttavia, esiste anche la possibilità che il prezzo corrente possa scendere al di sotto del prezzo medio, il che significa che tutte le partecipazioni nel titolo saranno annullate. Il vostro secondo algoritmo è terminato.

Esecuzione

Come descritto nell’ultimo articolo, è necessario il pacchetto Zipline per eseguire il backtest di tale strategia. È anche importante avviare il file Python, che contiene l’algoritmo, nell’ambiente Python in cui Zipline è già installato. Dopo aver scritto l’algoritmo, è utile eseguirne il backtest con Zipline per vedere come sono state le performance in passato.

Per fare ciò, riaprire il terminale e l’ambiente Python, che ha già Zipline installato, e avviare il backtest con il seguente comando: “zipline run -f C:/Utente/alank/ Desktop/ traders-momentum.py —start 2010-1-1 —end 2018- 1-1–b quantopian-quandl”. Questo backtest va dall’inizio del 2010 fino all’inizio del 2018. I risultati non sono esattamente inebrianti. Il backtest offre quindi l’opportunità di valutare criticamente la propria strategia di investimento.

Conclusioni

Anche se la nostra serie di base termina con questo articolo, è importante che continuiate a programmare nonostante i problemi di programmazione che sono perfettamente evidenti.

Iscriviti a Money.it

Trading online
in
Demo

Fai Trading Online senza rischi con un conto demo gratuito: puoi operare su Forex, Borsa, Indici, Materie prime e Criptovalute.