Construiți un algoritm de tranzacționare zilnică și rulați-l în cloud folosind doar servicii gratuite

În primul rând, mergeți mai departe și obțineți scriptul de pe GitHub cu această comandă:

git clone https://github.com/alpacahq/Momentum-Trading-Example.git

Acum, îl puteți deschide în editorul de text favorit și urmăriți-l. Observați că, aproape de partea de sus a fișierului, există spații pentru informațiile despre API-ul dvs. – ID-ul cheii, cheia secretă și URL-ul la care doriți să vă conectați. Puteți obține toate aceste informații din tabloul de bord Alpaca.

Cheia ta secretă dispare după ce ți se arată, așa că salveaz-o într-un loc sigur. Totuși, dacă o pierdeți, puteți oricând să vă regenerați cheia API pentru a obține o nouă cheie secretă.

Înlocuiți șirurile de caractere de siguranță cu propriile dvs. informații, iar scriptul este gata să ruleze. Dar înainte de a-l lăsa să se atingă chiar și de banii din contul dvs. simulat (în întregime fals), să trecem în revistă ceea ce face. (Dacă vă interesează mai mult cum să îl faceți să funcționeze pe GCP decât ce face, treceți la secțiunea următoare.)

În general, acesta este un algoritm bazat pe momentum. Nu vom tranzacționa în primele cincisprezece minute după deschiderea pieței, deoarece acestea sunt întotdeauna destul de agitate. Între al cincisprezecelea minut și prima oră, însă, vom căuta acțiuni care au crescut cu cel puțin 4% față de închiderea din ziua precedentă. Dacă au făcut acest lucru și îndeplinesc și alte criterii, le vom cumpăra și le vom păstra până când fie vor crește suficient de mult (atingând ținta noastră de preț), fie vor scădea prea mult (atingând nivelul nostru de „stop”).)

Vă veți da seama că, sub informațiile de conectare din cod, există câteva variabile suplimentare care pot fi configurate. Acestea pot fi modificate cu ușurință pentru a se potrivi cel mai bine nevoilor dumneavoastră pentru algoritm. Există mii de acțiuni disponibile pentru tranzacționare, dar nu toate sunt potrivite pentru o strategie ca aceasta.

Filtrăm lista căutând câteva lucruri – dorim un preț relativ scăzut al acțiunilor, dar nu unul atât de scăzut încât să se comporte mai degrabă ca o acțiune de un penny stock. De asemenea, vrem să ne asigurăm că acțiunea este suficient de lichidă pentru ca ordinele noastre să fie onorate. Ne asigurăm că volumul în dolari al acțiunii a fost de cel puțin min_last_dv în ziua precedentă de tranzacționare.

Parametrii default_stop și risk sunt importanți pentru a ne asigura că algoritmul nostru rămâne în limite acceptabile. Riscul reprezintă procentul din portofoliul nostru pe care îl vom aloca unei anumite poziții. Având în vedere că vindem atunci când atingem stop loss, suma de numerar din portofoliul nostru care riscă la o tranzacție este default_stop * risk * account_balance .

Nu voi trece în revistă modul în care obținem datele de inițializare aici – dacă doriți, puteți să aruncați o privire la cod și să consultați documentația Polygon privind datele lor „ticker”. Ceea ce este un pic mai interesant este faptul că putem, de asemenea, să transmitem date în timp real de la Polygon. (Acest lucru se face, de asemenea, într-un exemplu „HFT-ish” publicat recent, un alt algoritm de tranzacționare zilnică Alpaca care tranzacționează mult mai frecvent decât acesta și încearcă să profite de mici dezechilibre ale registrului de ordine.)

Poligonul.io logo.

Utilizând Alpaca’s Python SDK, ne conectăm la trei tipuri de canale de streaming. Primul este trade_updates, care este pur și simplu o conexiune la Alpaca pe care putem auzi actualizări ale comenzilor noastre pe măsură ce acestea se întâmplă. Vom folosi acest canal pentru a ne asigura că nu trimitem mai multe ordine deschise în același timp pentru o acțiune și pentru a vedea dacă ordinele noastre sunt sau nu executate.

Celelalte două canale sunt A.<symbol> și AM.<symbol> . Pentru fiecare acțiune pe care o vom urmări, ne abonăm la aceste canale pentru a primi actualizări de la Polygon cu privire la prețul și volumul acțiunii respective. Canalul A se actualizează la fiecare secundă, în timp ce canalul AM se actualizează la fiecare minut. Agregăm noi înșine informațiile din canalul A pentru a putea face calcule la secundă, dar considerăm că AM este sursa adevărului, înlocuind tot ceea ce am agregat cu ceea ce vine prin acel canal. În timp ce am putea scăpa dacă am urmări doar A și ne-am baza pe propria noastră agregare, încrederea în AM ne oferă un plus de rezistență la sughițuri în conexiune și altele asemenea.

După ce am adăugat datele primite la agregarea noastră, dacă nu am comandat deja acțiuni ale unei acțiuni, verificăm dacă aceasta pare a fi o achiziție bună. Definim o „achiziție bună” ca fiind ceva cu un MACD pozitiv, în creștere, care se tranzacționează la un volum decent și care a crescut cu peste 4% de la închiderea de ieri până astăzi. De asemenea, vrem să ne asigurăm că și-a menținut impulsul după deschidere, așa că ne uităm să vedem dacă prețul este mai mare decât punctul său cel mai înalt în primele cincisprezece minute după deschiderea pieței. Sperăm că aceste acțiuni vor continua să crească în valoare pe măsură ce ziua continuă.

Dacă avem o poziție pe o acțiune, verificăm, de asemenea, cu fiecare bară care vine pentru acea acțiune, dacă este timpul să vindem. Vindem atunci când stocul a atins fie prețul nostru țintă, fie stop loss-ul nostru, sau dacă MACD-ul sugerează că titlul își pierde din elan și a revenit la baza noastră de cost. În mod ideal, suficient de multe acțiuni ating prețul țintă pe care l-am stabilit astfel încât să putem recupera pierderile de la cele care au atins stop loss, cu câteva profituri suplimentare în plus.

La sfârșitul zilei de tranzacționare, lichidăm orice poziție rămasă pe care am deschis-o la prețul pieței. Utilizarea ordinelor de piață nu este, în general, ideală, dar ele sunt folosite în acest caz deoarece costul potențial al menținerii peste noapte este mai mare decât am fost dispuși să riscăm pe această poziție. În mod ideal, ne-am lichidat deja acțiunile pe baza stop loss-urilor și a prețurilor țintă definite, dar acest lucru ne permite să prindem orice se strecoară pe lângă acestea prin tranzacționare la nivel plat.

Dacă derulați în jos, dincolo de partea de jos a metodei lungi run(), veți vedea cum verificăm să vedem când se va deschide și când se va închide piața folosind endpoint-ul Alpaca Calendar API. Folosind acest lucru înseamnă că, dacă doriți, puteți configura o sarcină Cron pentru a rula scriptul la aceeași oră în fiecare zi, fără a trebui să vă faceți griji cu privire la sărbătorile pieței sau deschiderile târzii care cauzează probleme. Mulți oameni preferă să își ruleze scripturile manual, dar este plăcut să ai opțiunea de a-l lăsa să ruleze de unul singur.

.