Bouw een Day-Trading Algoritme en draai het in de Cloud met alleen gratis diensten

Voreerst, ga je gang en haal het script op van GitHub met dit commando:

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

Nu, kun je het openen in je favoriete tekst editor en meelopen. Merk op dat bovenaan het bestand, er plaatshouders zijn voor uw API informatie – uw sleutel ID, uw geheime sleutel, en de URL waarmee u wilt verbinden. U kunt al deze informatie opvragen via het Alpaca-dashboard.

Uw geheime sleutel verdwijnt nadat u deze hebt getoond, dus bewaar deze ergens veilig. Als u hem kwijtraakt, kunt u echter altijd uw API-sleutel opnieuw genereren om een nieuwe geheime sleutel te krijgen.

Vervang de plaatshouderstrings door uw eigen informatie, en het script is klaar om te worden uitgevoerd. Maar voordat we het zelfs maar aan het (volledig verzonnen) geld van je gesimuleerde account laten komen, zullen we eerst eens bekijken wat het doet. (Als je meer geïnteresseerd bent in hoe je het op GCP kunt draaien dan in wat het doet, ga dan door naar de volgende sectie.)

In het algemeen is dit een op momentum gebaseerd algoritme. We handelen niet in de eerste vijftien minuten na opening van de markt, omdat die altijd vrij hectisch zijn. Tussen de vijftiende minuut en het eerste uur zoeken we echter naar aandelen die ten minste 4% zijn gestegen ten opzichte van de slotkoers van de vorige dag. Als ze dat hebben gedaan en ze voldoen aan enkele andere criteria, kopen we ze, en we houden ze vast totdat ze ofwel hoog genoeg stijgen (voldoen aan ons koersdoel) of te laag dalen (voldoen aan ons ‘stop’ niveau.)

Je zult zien dat onder de verbindingsinformatie in de code, er enkele extra variabelen zijn die kunnen worden geconfigureerd. Deze kunnen eenvoudig worden aangepast aan uw behoeften voor het algoritme. Er zijn duizenden aandelen beschikbaar om te verhandelen, maar ze zijn niet allemaal geschikt voor een strategie als deze.

We filteren de lijst door naar een paar dingen te kijken – we willen een relatief lage aandelenprijs, maar niet een die zo laag is dat hij zich meer als een penny stock gedraagt. We willen er ook zeker van zijn dat het aandeel liquide genoeg is om onze orders gevuld te krijgen. We zorgen ervoor dat het dollar volume van het aandeel op zijn minst min_last_dv was op de vorige handelsdag.

De default_stop en risk parameters zijn belangrijk om er zeker van te zijn dat ons algoritme binnen aanvaardbare grenzen blijft. Risico is het percentage van onze portefeuille dat we toewijzen aan een bepaalde positie. Aangezien we verkopen wanneer we de stop loss raken, is de hoeveelheid geld uit onze portefeuille die we riskeren bij een transactie default_stop * risk * account_balance .

Ik zal hier niet ingaan op hoe we onze initialisatiegegevens krijgen – als je wilt, kun je een kijkje nemen in de code en Polygon’s documentatie over hun ’ticker’-gegevens bekijken. Wat een beetje interessanter is, is het feit dat we ook gegevens in real time kunnen streamen van Polygon. (Dit wordt ook gedaan in een recent gepubliceerd “HFT-ish” voorbeeld, een ander Alpaca day trading algoritme dat veel frequenter handelt dan dit algoritme en probeert te profiteren van kleine onevenwichtigheden in het orderboek.)

Het Polygon.io-logo.

Met behulp van Alpaca’s Python SDK maken we verbinding met drie soorten streamingkanalen. Het eerste is trade_updates, wat gewoon een verbinding met Alpaca is waarop we updates over onze bestellingen kunnen horen terwijl ze gebeuren. We zullen dit gebruiken om er zeker van te zijn dat we niet meerdere open orders tegelijk plaatsen voor een aandeel en om te zien of onze orders al dan niet worden uitgevoerd.

De andere twee kanalen zijn A.<symbol> en AM.<symbol> . Voor elk aandeel dat we in de gaten gaan houden, abonneren we ons op deze kanalen om updates van Polygon te ontvangen over de prijs en het volume van het aandeel. Het A kanaal wordt elke seconde geupdate, terwijl het AM kanaal elke minuut wordt geupdate. Wij aggregeren de informatie van het A kanaal zelf zodat wij up-to-the-second berekeningen kunnen doen, maar wij beschouwen AM als de bron van de waarheid, en vervangen alles wat wij hebben geaggregeerd door wat via dat kanaal komt. Hoewel we er mee weg zouden kunnen komen om alleen naar A te kijken en op onze eigen aggregatie te vertrouwen, geeft het vertrouwen in AM ons een beetje extra weerbaarheid tegen haperingen in de verbinding en dergelijke.

Als we de binnenkomende gegevens eenmaal aan ons aggregaat hebben toegevoegd, controleren we, als we nog geen aandelen van een aandeel hebben besteld, of het er uitziet als een goede koop. Wij definiëren een “goede koop” als iets met een positieve, groeiende MACD, dat met een behoorlijk volume wordt verhandeld en vandaag tot nu toe meer dan 4% is gestegen ten opzichte van de slotkoers van gisteren. Wij willen er ook zeker van zijn dat het zijn momentum heeft behouden na de opening, dus wij kijken of de koers hoger is dan zijn hoogste punt gedurende de eerste vijftien minuten na de opening van de markt. We hopen dat deze aandelen in waarde zullen blijven stijgen naarmate de dag vordert.

Als we een positie in een aandeel hebben, kijken we ook bij elke staaf die binnenkomt voor dat aandeel of het tijd is om te verkopen. We verkopen als het aandeel ons koersdoel of onze stop loss heeft bereikt, of als de MACD aangeeft dat het aandeel zijn momentum aan het verliezen is en het is teruggevallen tot onze kostenbasis. In het ideale geval raken genoeg aandelen het koersdoel dat we hebben ingesteld, zodat we de verliezen kunnen terugwinnen van de aandelen die de stop loss hebben bereikt, met wat extra winst erbovenop.

Aan het einde van de handelsdag liquideren we alle resterende posities die we hebben geopend tegen marktprijs. Het gebruik van marktorders is over het algemeen niet ideaal, maar in dit geval worden ze gebruikt omdat de potentiële kosten van het aanhouden gedurende de nacht groter zijn dan we bereid waren te riskeren op de positie. Idealiter hebben we onze aandelen al geliquideerd op basis van onze gedefinieerde stop-loss en doelprijzen, maar dit stelt ons in staat om alles op te vangen dat er tussendoor glipt door vlak te handelen.

Als je naar beneden scrollt voorbij de onderkant van de lange run() methode, zul je zien hoe we controleren wanneer de markt zal openen en sluiten met behulp van het Alpaca Calendar API endpoint. Dit gebruiken betekent dat, als je wilt, je een Cron job kunt opzetten om het script elke dag op dezelfde tijd te draaien zonder je zorgen te hoeven maken over markt feestdagen of late openingen die problemen veroorzaken. Veel mensen geven de voorkeur aan het handmatig uitvoeren van hun scripts, maar het is leuk om de optie te hebben om het gewoon op zichzelf te laten draaien.