Primo script con QuantConnect

Primo Script con QuantConnect

Benvenuto nel primo tutorial su QuantConnect. Questo articolo vuole guidare i lettori attraverso ogni fase per la creazione del primo script con Quantconnect tramite una semplice strategia RSI per il trading algoritmico. Ci concentriamo nel fornire un script base per comprendere i concetti fondamentali e usarlo come template per costruire strategie più complesse in futuro.

Obiettivo di questo tutorial per QuantConnect

Come primo script con Quantconnect vogliammo replicare la stessa strategia che abbiamo sviluppato sia per Backtrader che per Tradingview nei loro primi script. E’ una semplice strategia con un indicatore RSI (Relative Strength Index) che tenta di acquistare un titolo quando il titolo è ipervenduto e semplicemente vendere il titolo quando l’RSI indica che il titolo è ipercomprato.

In questo articolo descriviamo i seguenti concetti fondamentali:

  • Creazione di un nuovo script e accesso all’editor
  • Creazione di una nuova classe di strategia
  • Aggiunta di un indicatore
  • Accesso ai valori dell’indicatore
  • Acquistare le azioni con la funzione SetHoldings()
  • Vendere le azioni con la funzione Liquidate()

Naturalmente, possiamo arricchire l’algoritmo con molte altre features (come tracciare, registrare, eseguire il debug, ecc.) ma credo che iniziare sia opportuno mantenere le cose semplici e concentrarci sui concetti chiave.

Primo accesso

Per creare il nostro primo script con Quantconnect, per prima cosa dobbiamo collegarci su QuantConnect.com e registrare un account. Facciamo clic sul pulsante “Accedi” nell’angolo in alto a destra del sito. Verranno presentate alcune opzioni di registrazione. Non credo sia necessario descrivere i passaggi per la registrazione al sito! Scegli l’opzione di registrazione che fa per te, segui le istruzioni e accedi!

Dopo aver effettuato il primo accesso, siamo indirizzati alla pagina del “terminale”. Questa pagina è la stessa che vediamo premendo il link “Algorithm Lab” del menu. È il luogo principale per lo sviluppo di algoritmi e test.

Nota: questo collegamento viene spesso abbreviato in “Lab” se non si lavora su un monitor widescreen/ad alta risoluzione.

Nel menu principale sono presenti i collegamenti alle altre funzionalità principali offerte da QuantConnect, come la documentazione, il bootcamp e il forum della community. Di questi tre collegamenti, la documentazione e la community sono autoesplicativi. Tuttavia, il bootcamp è una feature interessante e merita qualche parola in più.

In sintesi, il BootCamp è un luogo in cui apprendere in modo interattivo alcuni concetti chiave. Ogni corso fornisce un’introduzione a uno o più concetti chiave e mette alla prova le capacità con un test interattivo finale. È un’ottima idea in linea di principio, ma l’ho trovato incostante. Sebbene sia fantastico disporre di tutorial guidati su alcuni dei concetti chiave, può essere complicato per QuantConnect verificare che il codice superi il test. Dopotutto, ci sono spesso molti modi per ottenere la stessa cosa durante la programmazione. Detto questo, consiglio comunque ai nuovi utenti di prendersi un po’ di tempo per esaminare i corsi disponibili perché contengono molte buone informazioni!

Creare un nuovo algoritmo

È ora di sporcarsi le mani. Prima di tutto, dobbiamo creare un nuovo script. Facciamo clic sul pulsante “Crea nuovo algoritmo”, come mostrato di seguito:
datatrading

Dopo avere premuto il pulsante, viene creato automaticamente un nuovo algoritmo. Questo apparirà nella tua cartella “I miei progetti” sotto il nome che è stato generato casualmente per la classe nel modello. Sul lato sinistro dello schermo, abbiamo la descrizione e le caratteristiche del progetto. In questa sezione è possibile definire il nome del progetto, aggiungere librerie, definire quale versione di python utilizzare ed addirittura condividere il workspace con altri utenti di quantconnect. L’idea è quella di promuovere la riutilizzabilità del codice e consentire agli utenti di concentrarsi su aree specifiche come la gestione del rischio o la selezione dei titoli.

Cambiamo il nome del progetto in qualcosa di più adatto. Ho chiamato il mio “Primo script: strategia RSI”. Puoi farlo facendo clic sul nome nel riquadro a sinistra:

quantconnect - main-window

Il codice

Ora che abbiamo il nostro progetto aperto e pronto, possiamo implementare il primo script con Quantconnect. Eliminiamo tutto nel riquadro centrale e copiamo il codice sottostante.

				
					### <summary>
### Semplice strategia RSI che vuole fornire un esempio di un algoritmo
### usando un indicatore
### </summary>
from AlgorithmImports import *

class RSIAlgorithm(QCAlgorithm):

    def Initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
        
        # Impostazione parametri strategia
        self.SetStartDate(2013,1, 1)   # Data inizio
        self.SetEndDate(2015,1,1)      # Data Fine
        self.SetCash(10000)            # Capitale iniziale
        
        RSI_Period    = 14                # periodo del RSI
        self.RSI_OB   = 60                # Livello overcomprato
        self.RSI_OS   = 40                # Livello overvenduto
        self.Allocate = 0.25              # Percentuale di capitale allocato
        
        # Altri ticker sono disponibili in https://www.quantconnect.com/datasets/
        self.AddEquity("AAPL", Resolution.Daily)
        
        self.RSI_Ind = self.RSI("AAPL", RSI_Period)
        
        # Verifica che ci siano abbastanza dati per calcolare l'indicatore prima del trading...
        self.SetWarmUp(RSI_Period)
        
    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.

        Arguments:
            data: Slice object keyed by symbol containing the stock data
        '''
        
        # Verifica se siamo a mercato
        if not self.Portfolio.Invested:
            # Se siamo flat verifichiamo l'RSI
            if self.RSI_Ind.Current.Value < self.RSI_OS:
                # Compriamo Apple
                self.SetHoldings("AAPL", self.Allocate)
        else:
            if self.RSI_Ind.Current.Value > self.RSI_OB:
                # Vendiamo Apple 
                self.Liquidate("AAPL")
				
			

Dov’è il pulsante salva?

Non c’è un pulsante di salvataggio, il progetto dovrebbe essere salvato automaticamente ogni volta che creiamo una build o chiudiamo il progetto. A proposito, la piattaforma creerà automaticamente lo script ogni volta che apporti una modifica al codice. Se la compilazione fallisce, è generalmente a causa di un errore di sintassi.

Tutto questo è carino, ma ci sono un paio di potenziali aree di confusione:

  • Poiché il progetto verrà compilato automaticamente, a volte può essere compilato prima che  abbiamo finito di scrivere il codice causando alcuni errori non intenzionali.
  • Quando risolviamo un problema, verrà comunque evidenziato come errore fino al completamento della build successiva. Questo può creare un po’ di confusione all’inizio quando riteniamo di aver risolto il problema ma mostra ancora un errore. Il feedback non è immediato come si potrebbe trovare in un ambiente di sviluppo locale. In tutta onestà, va sottolineato che non  ci lascia aspettare a lungo, ma non è un feedback immediato come abbiamo negli IDE locali.

Primo script con Quantconnect

Poiché questo è il primo articolo della serie, descriviamo le righe di codice del primo script con Quantconnect una sezione alla volta.

class RSIAlgorithm(QCAlgorithm):

La nostra prima riga crea il nostro algoritmo. L’abbiamo chiamato RSIAlgorithm ma puoi rinominarlo come preferisci. Il QCAlgorithm tra parentesi () ci permette di “ ereditare ” (in altre parole usare ) funzioni e variabili dalla classe QCAlgorithm. Questo è ciò che ci consente di accedere alle funzionalità API nel nostro algoritmo.

def Initialize(self):

Questo è il primo metodo (funzione) che aggiungiamo al nostro algoritmo. Ogni algoritmo ha bisogno di questo metodo. Viene “chiamato” (eseguito/eseguito) prima dell’avvio del backtest. In quanto tale, può essere utilizzato per impostare variabili, aggiungere indicatori e tutta una serie di altre cose che definiscono la struttura/progetti di base del tuo algoritmo.

Impostazione dei parametri

				
					
        # Impostazione parametri strategia
        self.SetStartDate(2012,1, 1)   # Data inizio
        self.SetEndDate(2020,1,1)      # Data Fine
        self.SetCash(10000)            # Capitale iniziale
        
        RSI_Period    = 14                # periodo del RSI
        self.RSI_OB   = 60                # Livello overcomprato
        self.RSI_OS   = 40                # Livello overvenduto
        self.Allocate = 0.25              # Percentuale di capitale allocato
    
				
			

Le prime righe di codice all’interno del metodo  initialize sono usate per impostare alcuni parametri che sono utilizzati dall’algoritmo. Questi possono effettivamente essere passati dinamicamente dall’interfaccia utente web se stai lavorando e condividendo un progetto con qualcuno che non può (o non deve) cambiare il codice. Questa funzionalità sarà approfondita in futuro.

È durante la configurazione dei parametri che utilizziamo per la prima volta l’API QuantConnect. Ricordi quando stavamo parlando di ereditare metodi (funzioni) e caratteristiche dal QCAlgorithm nella sezione della classe? Bene, self.SetStartDate() è un metodo che abbiamo ereditato e che usiamo per impostare la data di inizio del test.

Aggiungere i dati

La riga seguente ci consente di importare i dati Apple con una risoluzione giornaliera;

self.AddEquity("AAPL", Resolution.Daily)

Come puoi vedere, passiamo semplicemente il Simbolo/Ticker come primo argomento e la risoluzione dei dati desiderata come secondo argomento. Le risoluzioni disponibili sono:

  • Resolution.Tick
  • Resolution.Second
  • Resolution.Minute
  • Resolution.Hour
  • Resolution.Daily

Questo esempio è il minimo assoluto necessario per inserire alcuni dati nell’algoritmo. Tuttavia, è possibile specificare alcuni parametri  aggiuntivi.

Infine, non ci limitiamo solo alle azioni. Nell’algoritmo possiamo importare Forex, Futures, Opzioni, Crypto e CFD. Quando si esegue questa operazione, è necessario utilizzare una  specifica chiamata di  un metodo (funzione) dall’API.

  • self.AddForex()
  • self.AddFuture()
  • self.AddOption()
  • self.AddCrypto()
  • self.AddCfd()

Aggiungere un indicatore

Ora che abbiamo i dati disponibili, dobbiamo aggiungere il nostro indicatore RSI in modo da poter prendere alcune decisioni di trading basate su di esso. Per fare ciò utilizziamo le seguenti righe:

				
					
        # Altri ticker sono disponibili in https://www.quantconnect.com/datasets/
        self.AddEquity("AAPL", Resolution.Daily)
        
        self.RSI_Ind = self.RSI("AAPL", RSI_Period)
        
        # Verifica che ci siano abbastanza dati per calcolare l'indicatore prima del trading...
        self.SetWarmUp(RSI_Period)

				
			

Innanzitutto, dobbiamo creare l’indicatore. Lo facciamo chiamando self.RSI. Quindi gli passiamo il ticker su cui vogliamo che operi. RSI_Period è il parametro che abbiamo impostato nella precedente sezione dei parametri e lo usiamo per impostare un periodo di ricerca sull’indicatore RSI. Per quelli di voi che potrebbero essere nuovi nel trading, il periodo di ricerca è il numero di barre (candele sul grafico o punti dati) utilizzate per calcolare il valore RSI finale.

Infine, dobbiamo chiamare il metodo self.SetWarmUp(), in modo da garantire che l’algoritmo non inizi a fare trading fino a quando l’indicatore non avrà dati sufficienti per effettuare i calcoli RSI. Questo è il motivo per cui gli passiamo lo stesso parametro RSI_Period dell’indicatore RSI. Ci assicurerà di avere 14 barre di dati prima di iniziare a fare trading. Nel caso si abbia più indicatori, dovremmo passargli il valore dell’indicatore che ha bisogno della maggior parte dei dati prima che sia pronto.

Logica di trading

L’ultimo pezzo di codice prima di passare all’esecuzione dello script si concentra sulla logica di trading. Tutto questo accade all’interno del metodo OnData():

def OnData(self, data):

Questo metodo viene chiamato (run/executed) ogni volta che abbiamo una nuova barra di dati. In questo caso, poiché abbiamo chiesto i dati Resolution.Daily, questo avverrà tutti i giorni. Una volta ricevuti nuovi dati, il nostro indicatore RSI verrà aggiornato e potremo controllare il valore corrente per vedere se vogliamo fare trading.

				
					
        # Verifica se siamo a mercato
        if not self.Portfolio.Invested:
            # Se siamo flat verifichiamo l'RSI
            if self.RSI_Ind.Current.Value < self.RSI_OS:
                # Compriamo Apple
                self.SetHoldings("AAPL", self.Allocate)
        else:
            if self.RSI_Ind.Current.Value > self.RSI_OB:
                # Vendiamo Apple 
                self.Liquidate("AAPL")
				
			

La prima riga in questo blocco di codice è if not self.Portfolio.Invested. Questo controlla se abbiamo posizioni aperte o no. Se siamo flat (quindi if not), controlliamo se l’RSI è ipervenduto. Se lo è, acquistiamo delle azioni usando  il metodo self.SetHoldings().

I valori RSI più recenti vengono recuperati tramite self.RSI_Ind dall’oggetto che abbiamo creato durante initialize(). Poiché l’abbiamo salvato come self.RSI_Ind anziché solo RSI_Ind, possiamo accedervi in questo metodo. Da notare che lo abbiamo fatto anche per i parametri di ipercomprato e ipervenduto. Sono stati salvati come self.RSI_OB e self.RSI_OS mentre dato che RSI_Period non è necessario in questo metodo non aveva il prefisso self..

Se siamo in ipervenduto, chiamiamo self.SetHoldings()e gli passiamo semplicemente il ticker/simbolo e gli diciamo quale percentuale del nostro portafoglio vogliamo assegnargli. Qui è dove facciamo riferimento al nostro parametro self.Allocate.

Infine, una volta che ci troviamo in posizione ( self.Portiolio.Invested == true), iniziamo a verificare se Apple è in ipercomprato. Se è così, richiamiamo  il metodo self.Liquidate()e gli passiamo il nostro ticker/simbolo. Questo venderà quindi tutte le azioni del titolo.

Esecuzione e Risultati

Ora che abbiamo un algoritmo completo per il primo script con Quantconnect, è il momento di eseguirlo. Per fare ciò, fai clic sul pulsante backtest nell’angolo in alto a destra del riquadro principale.

Successivamente, dovrai attendere alcuni istanti mentre il backtest viene analizzato ed eseguito. Questo può richiedere del tempo, che è uno degli aspetti negativi (ma comprensibile e necessario) evidenziato nell’articolo di introduzione a QuantConnect.

Una volta che l’analisi è terminata e il backtest è pronto per essere eseguito, vedrai apparire il grafico azionario. Ogni volta che lo esegui, il backtest viene inserito in una nuova scheda e gli viene assegnato un nome strano per aiutarti a farvi riferimento in seguito. Il backtest inizierà a funzionare e se ci sono molti dati da elaborare, vedrai effettivamente il grafico azionario e i risultati aggiornarsi mentre scorrono i dati giornalieri.

Al termine del test, sono visualizzati i risultati. Da notare che il grafico principale mostra la nostra equity, non il grafico dei prezzi delle attività come potresti essere abituato su altre piattaforme. 

risultati quantconnect

Oltre a questo, è possibile visualizzare alcune statistiche specifiche che ti permetteranno di approfondire le prestazioni del tuo algoritmo in modo più dettagliato.

statistiche quantconnect

E questo dovrebbe essere sufficiente per il primo script con QuantConnect.

Codice completo

In questo articolo abbiamo descritto il primo script con QuantConnect per il trading algoritmico.. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/QuantConnect

Gli altri articoli di questa serie

Benvenuto su DataTrading!

Sono Gianluca, ingegnere software e data scientist. Sono appassionato di coding, finanza e trading. Leggi la mia storia.

Ho creato DataTrading per aiutare le altre persone ad utilizzare nuovi approcci e nuovi strumenti, ed applicarli correttamente al mondo del trading.

DataTrading vuole essere un punto di ritrovo per scambiare esperienze, opinioni ed idee.

SCRIVIMI SU TELEGRAM

Per informazioni, suggerimenti, collaborazioni...

Scroll to Top