Costruisci un algoritmo di day-trading ed eseguilo nel cloud usando solo servizi gratuiti
Prima di tutto, vai avanti e prendi lo script da GitHub con questo comando:
git clone https://github.com/alpacahq/Momentum-Trading-Example.git
Ora, puoi aprirlo nel tuo editor di testo preferito e seguirlo. Notate che vicino alla parte superiore del file, ci sono dei segnaposto per le vostre informazioni API – il vostro ID chiave, la vostra chiave segreta e l’URL a cui volete connettervi. Puoi ottenere tutte queste informazioni dalla dashboard di Alpaca.
Sostituisci le stringhe segnaposto con le tue informazioni e lo script è pronto per essere eseguito. Ma prima di fargli toccare anche i soldi del vostro conto simulato (interamente fittizio), vediamo cosa fa. (Se siete più interessati a come farlo funzionare su GCP che a cosa fa, passate alla prossima sezione.)
In generale, questo è un algoritmo basato sul momentum. Non faremo trading per i primi quindici minuti dopo l’apertura del mercato, perché quelli sono sempre piuttosto frenetici. Tra il quindicesimo minuto e la prima ora, però, cercheremo le azioni che sono aumentate almeno del 4% dalla loro chiusura del giorno precedente. Se lo hanno fatto e soddisfano altri criteri, li compreremo, e li terremo finché non saliranno abbastanza (incontrando il nostro obiettivo di prezzo) o scenderanno troppo in basso (incontrando il nostro livello di ‘stop’.)
Si noterà che sotto le informazioni di connessione nel codice, ci sono alcune variabili aggiuntive che possono essere configurate. Queste possono essere modificate facilmente per soddisfare al meglio le vostre esigenze per l’algoritmo. Ci sono migliaia di azioni disponibili per il trading, ma non tutte sono adatte ad una strategia come questa.
Filtriamo la lista cercando alcune cose – vogliamo un prezzo delle azioni relativamente basso, ma non così basso da comportarsi più come un penny stock. Vogliamo anche essere sicuri che l’azione sia abbastanza liquida da poter riempire i nostri ordini. Ci assicuriamo che il volume in dollari del titolo sia stato almeno min_last_dv
nel giorno di negoziazione precedente.
I parametri default_stop
e risk
sono importanti per assicurarsi che il nostro algoritmo resti entro limiti accettabili. Il rischio è la percentuale del nostro portafoglio che assegneremo a qualsiasi posizione. Dal momento che vendiamo quando colpiamo lo stop loss, la quantità di denaro del nostro portafoglio a rischio su un trade è default_stop * risk * account_balance
.
Non andrò oltre a come otteniamo i nostri dati di inizializzazione qui – se volete, potete dare un’occhiata al codice e controllare la documentazione di Polygon sui loro dati ‘ticker’. Ciò che è un po’ più interessante è il fatto che possiamo anche trasmettere dati in tempo reale da Polygon. (Questo viene fatto anche in un esempio “HFT-ish” pubblicato di recente, un altro algoritmo di day trading di Alpaca che scambia molto più frequentemente di questo e cerca di trarre profitto da piccoli squilibri del libro ordini.)
Utilizzando l’SDK Python di Alpaca, ci colleghiamo a tre tipi di canali di streaming. Il primo è trade_updates
, che è semplicemente una connessione ad Alpaca sulla quale possiamo sentire gli aggiornamenti sui nostri ordini mentre accadono. Lo useremo per assicurarci che non stiamo inviando più ordini aperti contemporaneamente per un’azione e per vedere se i nostri ordini vengono riempiti o meno.
Gli altri due canali sono A.<symbol>
e AM.<symbol>
. Per ogni azione che guarderemo, ci iscriviamo a questi canali per ricevere aggiornamenti da Polygon sul prezzo e sul volume dell’azione. Il canale A
si aggiorna ogni secondo, mentre il canale AM
si aggiorna ogni minuto. Noi stessi aggregiamo le informazioni dal canale A
in modo da poter fare calcoli aggiornati al secondo, ma consideriamo AM
la fonte della verità, sostituendo ciò che abbiamo aggregato con ciò che arriva attraverso quel canale. Mentre potremmo cavarcela guardando solo A
e affidandoci alla nostra aggregazione, fidarci di AM
ci dà un po’ di resilienza in più agli intoppi di connessione e simili.
Una volta aggiunti i dati in arrivo al nostro aggregato, se non abbiamo già ordinato azioni di un titolo, controlliamo se sembra un buon acquisto. Definiamo un “buon acquisto” come qualcosa con un MACD positivo e in crescita, che è stato scambiato con un volume decente ed è aumentato di oltre il 4% dalla chiusura di ieri fino ad oggi. Vogliamo anche assicurarci che abbia mantenuto il suo slancio dopo l’apertura, quindi cerchiamo di vedere che il prezzo sia superiore al suo punto più alto durante i primi quindici minuti dopo l’apertura del mercato. Speriamo che queste azioni continuino a salire di valore nel corso della giornata.
Se abbiamo una posizione in un’azione, controlliamo anche con ogni barra che arriva per quell’azione se è il momento di vendere. Vendiamo quando l’azione ha raggiunto il nostro prezzo obiettivo o il nostro stop loss, o se il MACD suggerisce che il titolo sta perdendo il suo slancio ed è tornato alla nostra base di costo. Idealmente, abbastanza titoli colpiscono il prezzo obiettivo che abbiamo fissato in modo da poter recuperare le perdite da quelli che colpiscono lo stop loss, con qualche profitto extra in cima.
Alla fine della giornata di trading, liquidiamo qualsiasi posizione rimanente che abbiamo aperto al prezzo di mercato. L’uso degli ordini di mercato non è generalmente ideale, ma in questo caso vengono utilizzati perché il costo potenziale di mantenimento durante la notte è maggiore di quello che eravamo disposti a rischiare sulla posizione. Idealmente, abbiamo già liquidato le nostre azioni in base ai nostri stop loss e prezzi target definiti, ma questo ci permette di prendere qualsiasi cosa che sgattaioli via da questi facendo trading flat.
Se scorrete in basso oltre il fondo del metodo long run()
, vedrete come controlliamo per vedere quando il mercato aprirà e chiuderà usando l’endpoint API Alpaca Calendar. Usare questo significa che, se volete, potete impostare un Cron job per eseguire lo script alla stessa ora ogni giorno senza dovervi preoccupare che le festività di mercato o le aperture tardive possano causare problemi. Molte persone preferiscono eseguire i loro script manualmente, ma è bello avere l’opzione di lasciarlo eseguire da solo.