Text Size
Thursday, October 29, 2020
Area

Gandalf Store

Coding

Formazione

Consulenza

Neural Trading System con Python

Una analisi di mercato

Mi occupo di progettazione di trading system dal lontano 2003, dapprima in C e C++, successivamente su Metastock e Tradestation2000i, poi sulle prime versioni di Visual Trader ed infine su Tradestation (nuovo paradigma), Muticharts ed Amibroker. In questo percorso posso affermare di avere avuto un osservatorio privilegiato sul mondo del trading algoritmico, cogliendo le necessità che sono nate di volta in volta e gli sforzi delle varie software house per rimanere al passo con i tempi. Ma siamo appunto figli dei nostri tempi e, senza voler puntare il dito su nessuna di queste piattaforme in particolare (che continuiamo ad utilizzare sia per parte dell’operatività che in ambito formativo), la scelta di pagare poco team di programmatori, il cui numero spesso non supera le tre unità, si è declinato in una scarsa stabilità di prodotto e nella troppo lenta reazione ai cambiamenti (chi mi conosce sa quanto mi stia a cuore la battaglia per riportare l'ingegneria al comando delle aziende).
Con l’avvento dell’Intelligenza Artificiale, l’attenzione di piccoli gruppi (una vera nicchia inizialmente) si è spostata verso prodotti che consentissero, ad esempio, l’integrazione di algoritmi genetici e reti neurali per la costruzione di sistemi di compravendita evoluti e soprattutto “adattivi”. Sto parlando dei vari Adaptrade Builder di Michael Bryant, Trading System Lab di Michael Barna, di Strategy Quant e Genetic System Builder, per finire con la blasonata NeuroShell. Quasi tutti ottimi prodotti, capiamoci, ma che non consentono risultati degni di nota senza una adeguata preparazione nel settore e dunque una buona dose di consapevolezza di fronte a “cruscotti” spesso criptici.
Se a questo aggiungiamo che tutti i prodotti citati sono legati a gruppi privati (quindi a pagamento e soggetti alle esigenze di business e alle decisioni dei relativi dirigenti) potete comprendere come nel mondo, dapprima con la lentezza degna delle grandi rivoluzioni, sia nato un nuovo rinascimento tecnologico. Con la crescita tecnologica, che ha superato le più rosee aspettative della legge di Moore, algoritmi prima soltanto appannaggio di centri di ricerca universitari e di pochi gruppi privati opportunamente finanziati, sono diventati fruibili sui personal computer retail creando, di fatto, una spaccatura epocale non soltanto nell’industria, ma anche nella percezione delle persone.
Mancava soltanto un ingrediente: un linguaggio di programmazione che non fosse più soltanto preda del solito ingegnere informatico di turno, ma che permettesse l’accesso al coding anche a tutti coloro che provenissero da ambiti molto distanti. L’ascesa di Python (e prima di altri linguaggi come Ruby, ad esempio) è stata e tuttora rappresenta una ascesa implacabile che fonda le proprie ali nel connubio tra rapidità di accesso e semplicità.
Per spiegare a chi non lo conosca, perché Python sia stato scelto anche in ambito economico principale strumento di analisi, vanno chiariti alcuni aspetti: il mondo della programmazione ha subito e ancora subirà continue rivoluzioni, dettate da una sopraggiunta maturità di alcune tecnologie e dall’introduzione di nuove esigenze: il dominio di Java (mondo Oracle), il mondo DotNet (mondo Microsoft) e la creazione di Swift (mondo Apple), sono l’esempio di come la tecnologia si sia mossa nelle varie direzioni in un processo di miglioramento continuo. Quelli citati sono tutti ottimi linguaggi, ognuno più adatto a determinati ambiti di applicazione. Sono tutti velocissimi, certo, ma hanno una complessità di sicuro non alla portata di tutti. Python permette di creare modelli di complessità impensabile in pochi minuti e poche righe di codice, senza rinunciare alla velocità di colossi come quelli citati, grazie alle librerie scritte in C su cui poggia. Per onestà intellettuale va detto che, una volta modellizzato il problema e compreso come possa essere descritto, un programmatore esperto può sempre pensare di scendere su un linguaggio di più basso livello per ottimizzare determinati processi, ma questo non è un limite per chi voglia analizzare in profondità i dati, realizzare portafogli di trading system e addirittura automatizzare l’esecuzione degli ordini. Ma dato che un esempio spesso vale più di mille parole, desidero condividere con voi una delle applicazioni che è possibile realizzare con Python in ambito Analisi Quantitativa.

Alziamo l'asticella: un esempio concreto

Come primo esempio desidero condividere con voi la realizzazione di un predittore giornaliero a rete neurale per prendere o meno posizione al rialzo sulla serie di SPY (l’ETF sull’S&P500).

Per prima cosa carichiamo la serie storica in formato .csv con un codice di un’unica riga che esegua anche il riconoscimento delle date e degli orari relativi (“parsing”):

Abbiamo ottenuto una matrice di righe e colonne, ordinate per data, sulla quale ora sarà semplicissimo operare. Se infatti dovessimo voler aggiungere la serie di un secondo strumento o ad esempio il Put/Call Ratio relativo a ciascuna giornata (sto parlando del rapporto tra le opzioni put e le opzioni call sull’S&P500 scambiate quel determinato giorno), ci penserà direttamente la libreria Pandas (una delle principali librerie di Python) ad effettuare l’allineamento. Potremo anche gestire i dati mancanti associando, ad esempio, la media del valore mancante in quell’intervallo temporale, sempre in un’unica riga di codice.

Utilizzando la libreria grafica Matplotlib, grafichiamo l'andamento delle chiusure della serie (“Close”):


E la sua distribuzione, ossia quante volte il prezzo transita in ciascun range:

 

A questo punto aggiungiamo una serie di indicatori che descrivano la variazione nel tempo dei prezzi e creiamo una colonna ”Price_Rise” che associ 1 nel caso in cui la prossima chiusura sia superiore a quella attuale per più di una soglia e 0 in caso contrario:

Sarà quest'ultimo campo l'obiettivo di previsione della nostra rete. A questo punto la base dati è completa. Visualizziamo soltanto la distribuzione delle colonne che rappresentano le serie rese stazionarie dei prezzi (la stazionarietà può essere certificata mediante il test di Dickey-Fuller, sempre con una riga di codice Python utilizzando la libreria SciKitLearn):

Come possiamo notare le distribuzioni assomigliano vagamente a distribuzioni gaussiane, anche se manifestano degli skew piuttosto asimmetrici. Per ovviare a questo problema, che andrebbe ad inficiare la capacità di astrazione di una rete neurale, operiamo una operazione di “deskew” che abbiamo formalizzato in una apposita funzione Python che utilizza i percentili di variazione. Di seguito il risultato:

Per concludere la sezione relativa alla pre-elaborazione dei dati (la più importante in ambito Machine Learning per poter ambire ad ottenere risultati congruenti e stabili), effettuiamo una “standardizzazione” delle singole colonne (vedere articolo di approfondimento).

Ora potremmo chiedere ad una rete neurale MLP (Multi Layer Perceptron, una di quelle utilizzate per applicazioni legate a problemi di regressione e classificazione), di prevedere se la prossima chiusura sarà appunto più elevata della precedente o meno. Ma facciamo un ulteriore passo in avanti e orientiamoci verso le reti RNN (Recurrent Neural Network) e più in particolare la classe LSTM (Long Short Term Memory), la cui architettura risulta particolarmente adatta a problemi di Time Series Forecasting (quindi alla previsione di serie storiche, proprio come quelle dei prezzi).

L’accesso a tale tipologia di rete richiede una lavorazione dei dati che, senza Python, risulterebbe particolarmente complessa e che invece grazie a Python può essere svolta in due semplici passaggi: dapprima popoliamo diverse temporizzazioni (“time_steps”, ad esempio le ultime 5 osservazioni) dei dati di partenza (13 colonne di input dette “features”) e successivamente mutiamo la geometria di tali dati da 2 a 3 dimensioni:

[raws, columns] -> [raws, time_steps, features]

Questo permette alla rete LSTM (dette “Vanilla” se composte da un unico hidden layer o “Stacked” se contiene almeno due hidden layer) di estrapolare un eventuale contenuto informativo (effetto memoria) legato all’ordine di arrivo dei campioni (per chi volesse approfondire questi temi ricordo il Python BootCamp 2019 in programma a Giulianova, in Abruzzo, dal 29 giugno al 2 luglio 2019).

Di seguito la formalizzazione della rete neurale (versione “Stacked”) incapsulata all’interno di una funzione, utilizzando la libreria Python “Keras” che si basa sul motore per il Deep Learning TensorFlow di Google (uno dei tanti che possiamo intercettare con Python):

 

Ogni elemento punta ad algoritmi la cui comprensione deve essere totale: il metodo didropout” per abbassare la probabilità di overfitting tra hidden layer, la funzione di attivazioneSigmoid” o “Linear”, il metodo di ottimizzazione adam” e la funzione di costo che descriva l’adattamento della rete al problema che deve descrivere. Di seguito la rete all’opera durante alcune epoche di addestramento:

Come si nota, in generale, di epoca in epoca, ci si aspetta un aumento crescente dell’ “accuracy” (percentuale di campioni correttamente previsti) ed uno decrescente del loss (funzione di costo che cumula gli errori commessi). Ricordo che l’intera elaborazione deve avvenire soltanto su un periodo di addestramento dei dati (“in sample period”), che nel nostro caso andava dal 1 gennaio 2000 al 1 ottobre 2015.

Una volta terminato tale addestramento chiediamo alla rete di prevedere il periodo di test successivo (dal 2 ottobre 2015 ad oggi) e mettiamo a confronto il frutto di una strategia buy & hold su SPY sul medesimo periodo (in rosso) con il trading system a rete neurale che prenda posizione soltanto quando la rete preveda un futuro rialzo della chiusura (in verde):

Per la realizzazione di questo grafico, completamente interattivo, abbiamo utilizzato le librerie Python Plotly & Cufflinks.

Il risultato appare subito evidente: la curva non elimina tutte le irregolarità, ma risulta più armonica abbattendo molti dei periodi di draw down originari:


Python ci permette infine di spacchettare i risultati su base mensile ed annuale con una singola riga di codice, generando una heatmap dinamica mediante la libreria Python Seaborn:

Non ci rimane che fare un confronto dei dollari guadagnati per ogni lotto di SPY acquistato nel caso buy & hold e nel caso della nostra strategia:

Se esaminate il codice con cui abbiamo effettuato questa ultima operazione, potrete comprendere perché meta-linguaggi in uso sulle principali piattaforme commerciali, possano risultare difficilmente più comprensibili di Python. E aggiungo come a mio avviso un investimento in formazione possa acquisire un valore differente se il linguaggio appreso non vive e muore soltanto all’interno di una piattaforma, ma consente di realizzare qualsiasi cosa anche all’esterno, aumentando le proprie competenze ed il proprio valore professionale.

Se avete apprezzato questo articolo, ma non avete compreso tutti i passaggi e tutti i termini utilizzati, sappiate che esistono due percorsi targati Gandalf Project per diventare Analisti Quantitativi ed esperti di Machine Learning in Python:

1. Python Academy

2. Python BootCamp 2019

Qui potete leggere un articolo che vi spiega in dettaglio le differenze tra i due percorsi e approfondisce i temi trattati.

Per contattarci e capire se uno o entrambi i percorsi possano fare per voi, potete scrivere una email ad This email address is being protected from spambots. You need JavaScript enabled to view it. e verrete contattati da uno dei nostri docenti.

Have a good trade!


Giovanni Trombetta

Head of Research & Development Gandalf Project

Privacy & Cookies Policy

Questo sito utilizza i Cookies per migliorare la navigazione. Utilizzando questo sito e continuando nella navigazione si intende accettata la Privacy Policy e la Cookies Policy. Puoi bloccare in ogni momento questa raccolta di informazioni seguendo le istruzioni contenute in queste pagine.

 


 

Topics

Intelligenza Artificiale

L' Intelligenza Artificiale e le più moderne tecnologie di Ingegneria Genetica al servizio del Trading...

Read more...

Consulenza

Gandalf Project è sia un Laboratorio di Finanza Quantitativa che una Società di Consulenza...

Read more...

Python

La scelta di Python come codice elementare per la modellizzazione di ambienti complessi...

Read more...