Elkészíteni egy day-trading algoritmust és futtatni a felhőben, kizárólag ingyenes szolgáltatások használatával
Először is, menj előre és szerezd meg a szkriptet a GitHubról ezzel a paranccsal:
git clone https://github.com/alpacahq/Momentum-Trading-Example.git
Most, megnyithatod a kedvenc szövegszerkesztődben és követheted. Figyeld meg, hogy a fájl teteje közelében vannak helytartók az API-adataidnak – a kulcsazonosítódnak, a titkos kulcsodnak és az URL-nek, amelyhez csatlakozni szeretnél. Ezeket az információkat az Alpaca műszerfaláról is megkaphatod.
Helyettesítse a helyőrző karakterláncokat a saját adataival, és a szkript készen áll a futtatásra. Mielőtt azonban hagynánk, hogy hozzányúljon akár a szimulált számlád (teljesen képzeletbeli) pénzéhez is, nézzük át, mit csinál. (Ha jobban érdekel, hogyan futtathatod a GCP-n, mint az, hogy mit csinál, ugorj tovább a következő részhez.)
Nagyjából ez egy momentum-alapú algoritmus. A piacnyitás utáni első tizenöt percben nem fogunk kereskedni, mert azok mindig elég hektikusak. A tizenötödik perc és az első óra között azonban olyan részvényeket keresünk, amelyek legalább 4%-kal emelkedtek az előző napi záróértékükhöz képest. Ha ezt megtették, és megfelelnek néhány más kritériumnak is, akkor megvesszük őket, és addig tartjuk, amíg vagy elég magasra nem emelkednek (elérve az árcélunkat), vagy túl alacsonyra nem esnek (elérve a “stop” szintünket).”
Észreveheti, hogy a kódban a kapcsolati információk alatt van néhány további változó, amelyeket beállíthat. Ezek könnyen beállíthatók, hogy a legjobban megfeleljenek az algoritmus igényeinek. Több ezer részvény áll rendelkezésre a kereskedéshez, de nem mindegyik alkalmas egy ilyen stratégiához.
A listát néhány dolog alapján szűrjük le: viszonylag alacsony árfolyamot szeretnénk, de nem olyan alacsonyat, ami inkább filléres részvényként viselkedik. Biztosak akarunk lenni abban is, hogy a részvény elég likvid ahhoz, hogy a megbízásainkat teljesíteni tudjuk. Meggyőződünk róla, hogy a részvény dollárnyi volumene legalább min_last_dv
volt az előző kereskedési napon.
A default_stop
és risk
paraméterek fontosak ahhoz, hogy algoritmusunk az elfogadható határokon belül maradjon. A kockázat az, hogy a portfóliónk hány százalékát allokáljuk egy adott pozícióhoz. Mivel a stop loss elérésekor eladunk, a portfóliónkból egy kereskedésnél kockáztatott készpénz mennyisége default_stop * risk * account_balance
.
Nem fogom itt részletezni, hogyan kapjuk meg az inicializálási adatainkat – ha akarod, megnézheted a kódot, és megnézheted a Polygon dokumentációját a “ticker” adataikról. Ami egy kicsit érdekesebb, az az a tény, hogy a Polygonból valós időben is tudunk adatokat streamelni. (Ezt teszi egy nemrég publikált “HFT-szerű” példa is, egy másik Alpaca day trading algoritmus, amely sokkal gyakrabban kereskedik, mint ez, és megpróbál profitálni az apró megbízási könyv egyensúlytalanságokból.)
Az Alpaca Python SDK-t használva háromféle streaming csatornához csatlakozunk. Az első a trade_updates
, amely egyszerűen egy olyan kapcsolat az Alpacához, amelyen keresztül a megrendeléseinkkel kapcsolatos frissítéseket hallhatjuk, amint azok megtörténnek. Ezt arra fogjuk használni, hogy megbizonyosodjunk arról, hogy nem adunk le egyszerre több nyitott megbízást egy részvényre, és hogy lássuk, hogy a megbízásaink teljesülnek-e.
A másik két csatorna a A.<symbol>
és a AM.<symbol>
. Minden egyes részvényre, amelyet figyelni fogunk, feliratkozunk ezekre a csatornákra, hogy a Polygon frissítéseket kapjon a részvény árfolyamáról és mennyiségéről. A A
csatorna másodpercenként, míg a AM
csatorna percenként frissül. A A
csatorna információit mi magunk aggregáljuk, hogy másodpercre pontos számításokat végezhessünk, de a AM
csatornát tekintjük az igazság forrásának, és minden általunk aggregált információt azzal helyettesítünk, ami ezen a csatornán keresztül érkezik. Bár megúszhatnánk, ha csak a -t figyelnénk, és a saját aggregációnkra hagyatkoznánk, a AM
megbízása egy kis extra rugalmasságot ad a kapcsolat zökkenőivel és hasonlókkal szemben.
Mihelyt hozzáadtuk a beérkező adatokat az aggregátumunkhoz, ha még nem rendeltünk részvényeket egy részvényből, akkor megnézzük, hogy jó vételnek tűnik-e az adott részvény. Mi úgy definiáljuk a “jó vételt”, mint olyasvalamit, aminek pozitív, növekvő MACD-je van, ami tisztességes volumennel kereskedik, és a tegnapi záráshoz képest ma eddig több mint 4%-kal emelkedett. Arról is meg akarunk győződni, hogy a nyitás után is megőrizte a lendületét, ezért megnézzük, hogy az árfolyam magasabb-e, mint a legmagasabb pontja a piacnyitás utáni első tizenöt percben. Reméljük, hogy ezek a részvények a nap folyamán tovább fognak emelkedni az értékükben.
Ha van pozíciónk egy részvényben, akkor minden egyes sávnál, ami az adott részvényre érkezik, azt is ellenőrizzük, hogy eljött-e az ideje az eladásnak. Eladjuk, ha a részvény elérte a célárunkat vagy a stop lossunkat, vagy ha a MACD azt jelzi, hogy az értékpapír veszít a lendületéből, és visszaesett a költségalapunkhoz. Ideális esetben annyi részvény éri el az általunk meghatározott célárat, hogy a stop lossot elérő részvények veszteségeit vissza tudjuk nyerni, némi extra nyereséggel kiegészítve.
A kereskedési nap végén felszámoljuk a fennmaradó, piaci áron megnyitott pozíciónkat. A piaci megbízások használata általában nem ideális, de ebben az esetben azért használjuk őket, mert az éjszakai tartás potenciális költsége nagyobb, mint amennyit hajlandóak voltunk kockáztatni a pozícióval. Ideális esetben már likvidáltuk a részvényeinket a meghatározott stop losses és célárak alapján, de ez lehetővé teszi számunkra, hogy elkapjunk bármit, ami ezek mellett elsurran a flat kereskedéssel.
Ha lejjebb görgetsz a hosszú run()
módszer aljánál, látni fogod, hogy az Alpaca Calendar API végpont segítségével megnézzük, mikor nyit és mikor zár a piac. Ennek használata azt jelenti, hogy ha szeretné, beállíthat egy Cron munkát, hogy a szkriptet minden nap ugyanabban az időpontban futtassa, anélkül, hogy aggódnia kellene a piaci ünnepek vagy a késői nyitás okozta problémák miatt. Sokan inkább kézzel futtatják a szkriptjeiket, de jó, ha van lehetőség arra, hogy hagyjuk, hogy magától fusson.