Bygg en algoritm för daghandel och kör den i molnet med hjälp av gratis tjänster
För det första hämtar du skriptet från GitHub med det här kommandot:
git clone https://github.com/alpacahq/Momentum-Trading-Example.git
Nu kan du öppna det i din favorittextredigerare och följa med. Observera att det nära toppen av filen finns platshållare för din API-information – ditt nyckel-ID, din hemliga nyckel och den URL som du vill ansluta till. Om du förlorar den kan du dock alltid återskapa din API-nyckel för att få en ny hemlighet.
Ersätt platshållarsträngarna med din egen information och skriptet är redo att köras. Men innan vi låter det röra ens ditt simulerade kontos (helt och hållet påhittade) pengar ska vi gå igenom vad det gör. (Om du är mer intresserad av hur du får det att köras på GCP än vad det gör kan du hoppa vidare till nästa avsnitt.)
I stort sett är detta en momentumbaserad algoritm. Vi kommer inte att handla under de första femton minuterna efter att marknaden öppnat, eftersom dessa alltid är ganska hektiska. Mellan den femtonde minuten och den första timmen letar vi dock efter aktier som har ökat med minst 4 % från stängningen föregående dag. Om de har gjort det och uppfyller några andra kriterier köper vi dem, och vi behåller dem tills de antingen stiger tillräckligt högt (uppfyller vårt kursmål) eller faller för lågt (uppfyller vår ”stop”-nivå).)
Du kommer att märka att det under anslutningsinformationen i koden finns några ytterligare variabler som kan konfigureras. Dessa kan enkelt justeras för att bäst passa dina behov för algoritmen. Det finns tusentals aktier tillgängliga för handel, men alla är inte lämpliga för en strategi som denna.
Vi filtrerar ner listan genom att leta efter några saker – vi vill ha ett relativt lågt aktiekurs, men inte ett som är så lågt att det beter sig mer som en penny-aktie. Vi vill också vara säkra på att aktien är tillräckligt likvid för att vi ska få våra order utförda. Vi ser till att aktiens dollarvolym var minst min_last_dv
den föregående handelsdagen.
Parametrarna default_stop
och risk
är viktiga för att se till att vår algoritm håller sig inom acceptabla gränser. Risk är den procentandel av vår portfölj som vi kommer att allokera till en viss position. Eftersom vi säljer när vi träffar stoppförlusten är mängden kontanter från vår portfölj som är i riskzonen vid en handel default_stop * risk * account_balance
.
Jag kommer inte att gå igenom hur vi får våra initialiseringsdata här – om du vill kan du ta en titt på koden och kolla in Polygons dokumentation om deras ”ticker”-data. Det som är lite mer intressant är att vi även kan strömma data i realtid från Polygon. (Detta görs också i ett nyligen publicerat ”HFT-ish”-exempel, en annan Alpaca-daghandelsalgoritm som handlar mycket oftare än den här och som försöker dra nytta av små obalanser i orderboken.)
Med hjälp av Alpacas Python SDK ansluter vi till tre typer av streamingkanaler. Den första är trade_updates
, som helt enkelt är en anslutning till Alpaca där vi kan höra uppdateringar om våra beställningar när de sker. Vi kommer att använda detta för att se till att vi inte skickar in flera öppna order samtidigt för en aktie och för att se om våra order fylls eller inte.
De andra två kanalerna är A.<symbol>
och AM.<symbol>
. För varje aktie som vi ska bevaka prenumererar vi på dessa kanaler för att få uppdateringar från Polygon om aktiens pris och volym. Kanalen A
uppdateras varje sekund, medan kanalen AM
uppdateras varje minut. Vi aggregerar själva informationen från A
-kanalen så att vi kan göra sekundsnabba beräkningar, men vi betraktar AM
som sanningskällan och ersätter det som vi har aggregerat med det som kommer via den kanalen. Även om vi skulle kunna komma undan med att bara titta på A
och förlita oss på vår egen aggregering, ger oss AM
lite extra motståndskraft mot hicka i anslutningen och liknande.
När vi väl har lagt till de inkommande uppgifterna till vår aggregering, om vi inte redan har beställt aktier i en aktie, kontrollerar vi om den ser ut att vara ett bra köp. Vi definierar ett ”bra köp” som något med en positiv, växande MACD som har handlats med en anständig volym och är upp över 4 % från gårdagens stängning hittills idag. Vi vill också försäkra oss om att den har bibehållit sitt momentum efter öppningen, så vi tittar för att se att priset är högre än sin högsta punkt under de första femton minuterna efter att marknaden öppnat. Vi hoppas att dessa aktier kommer att fortsätta att stiga i värde under dagen.
Om vi har en position i en aktie kontrollerar vi också med varje bar som kommer in för den aktien om det är dags att sälja. Vi säljer när aktien har nått antingen vårt riktpris eller vår stop loss, eller om MACD visar att värdepappret håller på att förlora sin dynamik och att det har fallit tillbaka till vår kostnadsbas. I idealfallet når tillräckligt många aktier det målpris vi fastställt så att vi kan återvinna förlusterna från de aktier som når stoppförlusten, med lite extra vinster ovanpå.
I slutet av handelsdagen avvecklar vi eventuella återstående positioner som vi har öppnat till marknadspris. Användningen av marknadsordrar är i allmänhet inte idealisk, men de används i det här fallet eftersom den potentiella kostnaden för att hålla över natten är större än vad vi var villiga att riskera på positionen. I idealfallet har vi redan likviderat våra aktier baserat på våra definierade stoppförluster och målpriser, men detta gör det möjligt för oss att fånga upp allt som smyger sig förbi dessa genom att handla platt.
Om du scrollar ner förbi botten av den långa run()
-metoden ser du hur vi kontrollerar när marknaden kommer att öppna och stänga med hjälp av Alpacas kalender-API-slutpunkt. Att använda detta innebär att du, om du vill, kan ställa in ett Cron-jobb för att köra skriptet vid samma tid varje dag utan att behöva oroa dig för att marknadens helgdagar eller sena öppningar orsakar problem. Många föredrar att köra sina skript manuellt, men det är trevligt att ha möjligheten att bara låta det köra på egen hand.