Aggiungere una Libreria con QuantConnect

Aggiungere una libreria con QuantConnect

Chiunque sia riuscito ad andare un po’ più in là di un semplice tutorial “Hello World” in Python ha avuto qualche esperienza nell’uso di una libreria Python. Le librerie offrono una suite di funzioni e caratteristiche predefinite che possono essere riutilizzate. Senza le librerie dovremmo implementare da zero tutte le funzionalità ogni volta vogliamo scrivere qualcosa di nuovo. In questo articolo descriviamo come gestire ed aggiungere una libreria con QuantConnect per il trading algoritmico.

Dopotutto, se  vogliamo costruire una  casa, non ci preoccupiamo di forgiare i mattoni ma li compriamo già pronti in modo da poter costruire qualcosa di nuovo senza perdere tempo.

Nota: tecnicamente, il nome corretto delle librerie è module. Tuttavia, si usa spesso il nome libreria in modo intercambiabile. Per una maggiore comprensione, in questo articolo usiamo il termine libreria dato che è il termine usato all’editor online di QuantConnect.

Librerie su QuantConnect

In QuantConnect possiamo usare due tipi di librerie. La prima è una serie di librerie ufficiali e di terze parti autorizzate. Questi sono il tipo di libreria che installiamo normalmente con pip e includiamo nel codice con import. Il secondo tipo è una libreria creata dall’utente. In un ambiente puro Python, ci sarebbe poca differenza tra  i due tipi di libreria ma in QuantConnect ci sono alcune limitazioni su quali librerie possiamo usare, dato che è una piattaforma cloud,. Inoltre, ci sono alcuni passaggi aggiuntivi che dobbiamo eseguire per usare la nostra libreria.

Librerie Python ufficiali e di terze parti

Come appena accennato, QuantConnect è un servizio online e quindi non può offrire tutte le librerie Python che potremmo voler  usare. Ad esempio, non  è opportuno consentire agli utenti di importare la  libreria os dove potrebbero accidentalmente causare danni ai server su cui gira la piattaforma. In Quantconnect i moduli sono testati e inseriti in una whitelist di pacchetti che possono essere usati. Una volta approvati, possono essere importati nel nostro algoritmo allo stesso modo di qualsiasi pacchetto Python in un ambiente locale. Ad esempio, usando import pandas importiamo la popolare  libreira pandas. Possiamo trovare l’elenco completo delle librerie autorizzate al seguete link: https://www.quantconnect.com/docs/key-concepts/supported-libraries.

Dato che l’importazione e l’uso di pacchetti nella whitelist non è diverso dal normale Python, in questo  articolo non descrive come gestire queste librerie in Quantconnect.

Librerie personalizzate

L’obiettivo principale di questo articolo è descrivere come aggiungere una libreria su Quantconnect creata in modo personalizzato dagli utenti. Questo è possibile tramite l’opzione nel riquadro del progetto che prevede di “Aggiungere nuova libreria”. I neofiti potrebbero pensare che questo pulsante consenta di aggiungere una libreria in modo simile all’utilizzo pip sulla riga di comando. Non è così. Con questa funzionalità possiamo riutilizzare il codice, risparmiare un po’ di tempo per il copia/incolla e, cosa più importante, semplificare la manutenzione degli stessi frammenti di codice tra i  vari progetti!

Aggiungere una Libreria con QuantConnect

Attualmente il processo per farlo è complicato e quindi  in questo articolo lo descriviamo passo passo.

Libreria di modelli di base

Premendo il pulsante “Aggiungi nuova libreria” mostrato nell’immagine precedente, per la prima volta abbiamo una finestra  simile alla seguente:

Aggiungere una Libreria con QuantConnect

Non sono state trovate librerie perchè non ne abbiamo ancora create. Premendo il pulsante “Crea una nuova libreria” in basso a destra si produce il seguente modello di codice da usare come esempio.

				
					### <summary>
### Basic Template Library Class
###
### Library classes are snippets of code/classes you can reuse between projects. They are
### added to projects on compile. This can be useful for reusing indicators, math functions,
### risk modules etc. Make sure you import the class in your algorithm. You need
### to name the file the module you'll be importing (not main.cs).
### importing.
### </summary>
class BasicTemplateLibrary:

    '''
    To use this library place this at the top:
    from BasicTemplateLibrary import BasicTemplateLibrary

    Then instantiate the function:
    x = BasicTemplateLibrary()
    x.Add(1,2)
    '''
    def Add(self, a, b):
        return a + b

    def Subtract(self, a, b):
        return a - b
				
			

La libreria fornisce due semplici funzioni di somma e sottrazione. È un esempio volutamente base per mostrare il concetto generale. Da notare che il nome del file su cui stiamo lavorando è cambiato perché ora stiamo modificando il codice della libreria invece del codice del algoritmo.

Importazione Libreria

Successivamente, chiudiamo il progetto Basic Library Template (Py). Non è necessario modificarlo perchè ora usiamo questo codice di esempio. Quando chiudiamo la libreria possiamo notare che è stata creata automaticamente una nuova cartella denominata Library all’interno della cartella  principale. Questa cartella contiene tutte le librerie che creeremo in futuro.

Importazione Libreria

Aggiungere una libreria con Quantconnect

Ora che abbiamo creato una libreria, possiamo importarla! Creiamo un nuovo algoritmo classico (come descritto in questo articolo) o caricarne uno degli altri nostri progetti. Dopo averlo caricato,  premiamo nuovamente su “Aggiungi nuova libreria”. Questa volta, notiamo che il  modello di libreria base è contenuto nell’elenco. Facciamo clic sul modello per importarlo.

Importazione Libreria

File main.py duplicati

Notiamo che ora abbiamo due file nel progetto entrambi con il nome main.py!

Importazione Libreria

che causa un errore con il compilatore perché non possiamo avere due file main.py.

Importazione Libreria

Dobbiamo quindi rinominare il file main.py della libreria, assicurandoci di non rinominarli entrambi altrimenti otteniamo un altro errore perché il progetto deve contenere almeno un file main.py. Poiché può creare un po’ di confusione su quale dei due file rinominare, il modo più semplice per rinominare la libreria è chiudere il progetto e quindi ricaricare BasicTemplate Library Template (Py). Ricordiamo che si trova all’interno della  cartella Library appena creata. Dopo che è stato caricato, possiamo passare sopra il file main.py con il mouse nel riquadro di sinistra.

Importazione Libreria

Rinominiamo il file come BLT.py (un semplice acronimo). Dopo aver rinominato il file, possiamo riaprire il progetto principale e  vediamo che il file è stato rinominato.

Importazione libreria

Importare la libreria nell’algoritmo

Ora che abbiamo configurato correttamente l’ambiente, per aggiungere una libreria con Quantconnect possiamo importare la libreria personalizzata proprio come qualsiasi altro modulo Python. Nel codice di esempio le seguenti righe possono creare confusione:

				
					# To use this library place this at the top:
# from BasicTemplateLibrary import BasicTemplateLibrary
				
			

Seguendo questo suggerimento otteniamo un errore di importazione. Per effettuare la corretta importazione dobbiamo usare il nome file che abbiamo appena modificato, cioè from BLT import BasicTemplateLibrary. Questo significa che riceviamo un errore seguendo le linee guida nel commento, anche se non abbiamo modificato il nome del file, perché il nome del file era main.py. E’ quindi un’importazione comunque errata poiché non possiamo nemmeno compilare il codice con due file main.py.

Codice di esempio

Ora che abbiamo importato la libreria, possiamo creare un semplice algoritmo di esempio per usare la funzione Subtract() dalla libreria di esempio.

				
					import numpy as np
from BLT import BasicTemplateLibrary

### <summary>
### Basic template algorithm simply initializes the date range and cash. This is a skeleton
### framework you can use for designing an algorithm.
### </summary>

class BasicTemplateAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''

    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.'''

        self.SetStartDate(2013,10, 7)  #Set Start Date
        self.SetEndDate(2013,10,11)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        self.Ticker = "SPY"
        # Più simboli su: https://www.quantconnect.com/datasets/
        self.AddEquity(self.Ticker, Resolution.Daily)

    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
        '''
        
        # Ottenere i dati OHLC
        if data.ContainsKey(self.Ticker) and data.HasData:
 
            O = data[self.Ticker].Open
            H = data[self.Ticker].High
            L = data[self.Ticker].Low
            C = data[self.Ticker].Close
            P = data[self.Ticker].Price
            
            x = BasicTemplateLibrary()
            HmL = x.Subtract(H,L)
            
            self.Log(">> High: {} Low: {} | High - Low: {}".format(H,L,HmL))
    
        if not self.Portfolio.Invested:
            self.SetHoldings(self.Ticker, 1)
				
			

Nel codice precedente istanziamo la libreria, cioè creiamo un nuovo oggetto chiamato x dal blueprint della classe BasicTemplateLibrary. Successivamente, possiamo usare x per accedere al metodo Subtract() della funzione. Infine, registriamo i risultati restituiti da questo metodo  in un log per assicurarci che funzioni correttamente.

Metodo alternativo

Esiste un altro metodo per  importare le funzioni che non fanno parte di una classe usando lo stesso  approccio. Ad esempio, possiamo avere un file Library/Basic Library Template (Py) che contiene quanto segue:

				
					### <summary>
### Basic Template Library Class
###
### Library classes are snippets of code/classes you can reuse between projects. They are
### added to projects on compile. This can be useful for reusing indicators, math functions,
### risk modules etc. Make sure you import the class in your algorithm. You need
### to name the file the module you'll be importing (not main.cs).
### importing.
### </summary>

def Subtract(a, b):
        return a - b
				
			

Quindi lo importiamo e lo usiamo in modo simle. In questo caso importiamo direttamente la funzione  e non è necessario creare un’istanza di una classe. (Da notare che ora stiamo importando Subtract invece di BasicTemplateLibrary)

				
					import numpy as np
from BLT import BasicTemplateLibrary
from SimpFunc import Subtract

### <summary>
### Basic template algorithm simply initializes the date range and cash. This is a skeleton
### framework you can use for designing an algorithm.
### </summary>

class BasicTemplateAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''

    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.'''

        self.SetStartDate(2013, 10, 7)  # Set Start Date
        self.SetEndDate(2013, 10, 11)  # Set End Date
        self.SetCash(100000)  # Set Strategy Cash
        self.Ticker = "SPY"
        # Più simboli su: https://www.quantconnect.com/datasets/
        self.AddEquity(self.Ticker, Resolution.Daily)

    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
        '''

        # Ottenere i dati OHLC
        if data.ContainsKey(self.Ticker) and data.HasData:
            O = data[self.Ticker].Open
            H = data[self.Ticker].High
            L = data[self.Ticker].Low
            C = data[self.Ticker].Close
            P = data[self.Ticker].Price

            HmL = Subtract(H, L)

            self.Log(">> High: {} Low: {} | High - Low: {}".format(H, L, HmL))

        if not self.Portfolio.Invested:
            self.SetHoldings(self.Ticker, 1)
				
			

Seconda nota: in questo esempio il  main.py della libreria è stato rinominato come SimpFunc.py invece di BLT.py.

Esecuzione dello script

Infine, possiamo eseguire lo script e controllare l’output. Dopo averlo fatto, possiamo controllare il file di log e vedere che per ogni barra stiamo sottraendo high da low.

				
					2013-10-07 00:00:00 Launching analysis for 3e3d545143a85e32cefda07482710e53 with LEAN Engine v2.4.0.0.5335
2013-10-08 00:00:00 >> High: 152.5560687 Low: 151.4692935 | High - Low: 1.0867752000000053
2013-10-09 00:00:00 >> High: 151.80438252 Low: 149.75762256 | High - Low: 2.046759960000003
2013-10-10 00:00:00 >> High: 150.5183652 Low: 149.00593638 | High - Low: 1.5124288199999967
2013-10-11 00:00:00 >> High: 153.28964196 Low: 151.45118058 | High - Low: 1.8384613800000125
2013-10-12 00:00:00 >> High: 154.24962672 Low: 152.84587542 | High - Low: 1.4037513000000104
2013-10-12 00:00:00 Algorithm Id:(3e3d545143a85e32cefda07482710e53) completed in 0.49 seconds at 0k data points per second. Processing total of 6 data points.
				
			

Codice completo

In questo articolo abbiamo descritto come aggiungere una libreria 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...

Torna in alto
Scroll to Top