Zbuduj algorytm day-tradingowy i uruchom go w chmurze korzystając tylko z darmowych usług
Po pierwsze, przejdź dalej i pobierz skrypt z GitHuba za pomocą tego polecenia:
git clone https://github.com/alpacahq/Momentum-Trading-Example.git
Teraz możesz otworzyć go w swoim ulubionym edytorze tekstu i podążać za nim. Zauważ, że w pobliżu górnej części pliku znajdują się miejsca na informacje o API – identyfikator klucza, tajny klucz i adres URL, z którym chcesz się połączyć. Wszystkie te informacje można uzyskać z pulpitu nawigacyjnego Alpaca.
Zastąp łańcuchy znaków własnymi informacjami, a skrypt jest gotowy do uruchomienia. Zanim jednak pozwolimy mu dotknąć nawet symulowanych pieniędzy na Twoim (całkowicie niewiarygodnym) koncie, sprawdźmy, co robi. (Jeśli jesteś bardziej zainteresowany tym, jak uruchomić go na GCP, niż tym, co robi, przejdź do następnej sekcji.)
Przede wszystkim jest to algorytm oparty o momentum. Nie będziemy handlować przez pierwsze piętnaście minut po otwarciu rynku, ponieważ są one zawsze dość gorączkowe. Jednak pomiędzy piętnastą minutą a pierwszą godziną, będziemy szukać akcji, które wzrosły o co najmniej 4% od zamknięcia w dniu poprzednim. Jeśli to zrobiły i spełniają kilka innych kryteriów, kupimy je i będziemy je trzymać do momentu, aż albo wzrosną wystarczająco wysoko (spełniając nasz cel cenowy) lub spadną zbyt nisko (spełniając nasz poziom 'stop’.)
Zauważysz, że poniżej informacji o połączeniu w kodzie, znajduje się kilka dodatkowych zmiennych, które można skonfigurować. Można je łatwo dostosować do swoich potrzeb w zakresie algorytmu. Istnieją tysiące akcji dostępnych do handlu, ale nie wszystkie z nich są odpowiednie dla strategii takiej jak ta.
Filtrujemy listę szukając kilku rzeczy – chcemy stosunkowo niskiej ceny akcji, ale nie takiej, która jest tak niska, że zachowuje się bardziej jak akcja groszowa. Chcemy również mieć pewność, że akcje są na tyle płynne, że nasze zlecenia zostaną zrealizowane. Upewniamy się, że wolumen dolarowy akcji był co najmniej min_last_dv
w poprzednim dniu handlowym.
Parametry default_stop
i risk
są ważne, aby upewnić się, że nasz algorytm pozostaje w akceptowalnych granicach. Ryzyko to procent naszego portfela, który przeznaczamy na daną pozycję. Ponieważ sprzedajemy, gdy osiągniemy stop loss, ilość gotówki z naszego portfela narażona na ryzyko podczas transakcji wynosi default_stop * risk * account_balance
.
Nie będę się tutaj rozwodził nad tym, jak otrzymujemy nasze dane inicjalizacyjne – jeśli chcesz, możesz spojrzeć na kod i sprawdzić dokumentację Polygonu na temat ich danych 'ticker’. Co jest nieco bardziej interesujące, to fakt, że możemy również strumieniować dane w czasie rzeczywistym z Polygona. (Jest to również zrobione w niedawno opublikowanym przykładzie „HFT-ish”, innym algorytmie daytradingowym Alpaca, który handluje znacznie częściej niż ten i stara się czerpać zyski z małych nierówności księgi zamówień.)
Używając Python SDK firmy Alpaca, łączymy się z trzema rodzajami kanałów streamingowych. Pierwszym z nich jest trade_updates
, który jest po prostu połączeniem z Alpaką, na którym możemy usłyszeć aktualizacje naszych zleceń na bieżąco. Użyjemy go, aby upewnić się, że nie składamy wielu otwartych zleceń na raz na akcje i aby zobaczyć, czy nasze zlecenia są wypełniane, czy nie.
Dwa pozostałe kanały to A.<symbol>
i AM.<symbol>
. Dla każdej akcji, którą będziemy obserwować, subskrybujemy te kanały, aby otrzymywać aktualizacje od Polygon o cenie i wolumenie akcji. Kanał A
aktualizuje się co sekundę, natomiast kanał AM
aktualizuje się co minutę. Sami agregujemy informacje z kanału A
, abyśmy mogli wykonywać obliczenia co do sekundy, ale uważamy AM
za źródło prawdy, zastępując to, co zagregowaliśmy, tym, co przychodzi przez ten kanał. Podczas gdy możemy uciec od oglądania tylko A
i polegania na naszej własnej agregacji, zaufanie AM
daje nam trochę więcej odporności na czkawkę w połączeniu i takie tam.
Po dodaniu danych przychodzących do naszego agregatu, jeśli jeszcze nie zamówiliśmy akcji, sprawdzamy, czy wygląda to na dobry zakup. Definiujemy „dobry zakup” jako coś z pozytywnym, rosnącym MACD, co było przedmiotem handlu na przyzwoitym wolumenie i jest w górę o ponad 4% od wczorajszego zamknięcia do dziś. Chcemy również upewnić się, że utrzymuje swoje momentum po otwarciu, więc patrzymy, że cena jest wyższa niż jej najwyższy punkt w ciągu pierwszych piętnastu minut po otwarciu rynku. Mamy nadzieję, że te akcje będą nadal rosnąć w wartości, jak dzień idzie dalej.
Jeśli mamy pozycję w akcji, możemy również sprawdzić z każdym barze, który przychodzi do tego zasobu, jeśli jest to czas, aby sprzedać. Sprzedajemy, kiedy akcje osiągnęły albo naszą cenę docelową, albo nasz stop loss, lub jeśli MACD sugeruje, że bezpieczeństwo traci swój impet i spadło z powrotem do naszej bazy kosztowej. W idealnej sytuacji, wystarczająco dużo akcji osiąga cenę docelową, którą ustaliliśmy, abyśmy mogli odzyskać straty z tych, które osiągnęły stop loss, z kilkoma dodatkowymi zyskami na wierzchu.
Na koniec dnia handlowego, likwidujemy wszystkie pozostałe pozycje, które otworzyliśmy po cenie rynkowej. Wykorzystanie zleceń rynkowych nie jest generalnie idealne, ale w tym przypadku zostały one wykorzystane, ponieważ potencjalny koszt przetrzymania pozycji przez noc jest większy niż ryzyko, które chcieliśmy zaryzykować na tej pozycji. Idealnie byłoby, gdybyśmy już zlikwidowali nasze akcje w oparciu o zdefiniowane przez nas stop lossy i ceny docelowe, ale to pozwala nam złapać wszystko, co wymyka się tym cenom, handlując płasko.
Jeśli przewiniesz na dół długiej metody run()
, zobaczysz, jak sprawdzamy, kiedy rynek będzie otwierał się i zamykał, używając punktu końcowego API kalendarza Alpaca. Użycie tego oznacza, że jeśli chcesz, możesz skonfigurować zadanie Cron, aby uruchamiać skrypt o tej samej porze każdego dnia, bez konieczności martwienia się o święta rynkowe lub późne otwarcia powodujące problemy. Wiele osób woli uruchamiać swoje skrypty ręcznie, ale miło jest mieć możliwość, aby po prostu pozwolić im działać samodzielnie.