Erstellen Sie einen Day-Trading-Algorithmus und führen Sie ihn in der Cloud aus, indem Sie nur kostenlose Dienste nutzen

Zunächst holen Sie sich das Skript mit diesem Befehl von GitHub:

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

Nun können Sie es in Ihrem bevorzugten Texteditor öffnen und den Anweisungen folgen. Beachten Sie, dass sich am oberen Rand der Datei Platzhalter für Ihre API-Informationen befinden – Ihre Schlüssel-ID, Ihr geheimer Schlüssel und die URL, mit der Sie sich verbinden möchten. Sie können all diese Informationen über das Alpaca-Dashboard abrufen.

Ihr geheimer Schlüssel verschwindet, nachdem er Ihnen angezeigt wurde, also bewahren Sie ihn an einem sicheren Ort auf. Wenn Sie ihn verlieren, können Sie Ihren API-Schlüssel jederzeit neu generieren, um einen neuen geheimen Schlüssel zu erhalten.

Ersetzen Sie die Platzhalterzeichenfolgen durch Ihre eigenen Informationen, und das Skript ist bereit zur Ausführung. Aber bevor wir es auch nur mit dem (völlig fiktiven) Geld Ihres simulierten Kontos in Berührung kommen lassen, sollten wir uns ansehen, was es tut. (Wenn Sie mehr daran interessiert sind, wie Sie das Skript auf GCP zum Laufen bringen, als daran, was es tut, fahren Sie mit dem nächsten Abschnitt fort.)

Im Großen und Ganzen handelt es sich um einen momentumbasierten Algorithmus. In den ersten fünfzehn Minuten nach Markteröffnung wird nicht gehandelt, da diese immer sehr hektisch sind. Zwischen der fünfzehnten Minute und der ersten Stunde suchen wir jedoch nach Aktien, die gegenüber dem Schlusskurs des Vortages um mindestens 4 % gestiegen sind. Wenn dies der Fall ist und sie einige andere Kriterien erfüllen, kaufen wir sie und halten sie so lange, bis sie entweder hoch genug gestiegen sind (und unser Kursziel erreicht haben) oder zu tief gefallen sind (und unser „Stopp“-Niveau erreicht haben)

Sie werden feststellen, dass es unterhalb der Verbindungsinformationen im Code einige zusätzliche Variablen gibt, die konfiguriert werden können. Diese können leicht angepasst werden, um den Algorithmus optimal auf Ihre Bedürfnisse abzustimmen. Es gibt Tausende von Aktien, die gehandelt werden können, aber nicht alle eignen sich für eine Strategie wie diese.

Wir filtern die Liste, indem wir auf ein paar Dinge achten – wir wollen einen relativ niedrigen Aktienkurs, aber keinen, der so niedrig ist, dass er sich eher wie ein Pennystock verhält. Wir wollen auch sicher sein, dass die Aktie liquide genug ist, damit wir unsere Aufträge ausführen können. Wir stellen sicher, dass das Dollar-Volumen der Aktie am vorherigen Handelstag mindestens min_last_dv war.

Die default_stop und risk Parameter sind wichtig, um sicherzustellen, dass unser Algorithmus innerhalb akzeptabler Grenzen bleibt. Das Risiko gibt an, wie viel Prozent unseres Portfolios wir einer bestimmten Position zuteilen werden. Da wir verkaufen, wenn wir den Stop-Loss erreichen, ist die Menge an Bargeld aus unserem Portfolio, die bei einem Handel riskiert wird, default_stop * risk * account_balance.

Ich werde hier nicht näher darauf eingehen, wie wir unsere Initialisierungsdaten erhalten – wenn Sie möchten, können Sie einen Blick auf den Code werfen und die Dokumentation von Polygon zu ihren „Ticker“-Daten lesen. Ein wenig interessanter ist die Tatsache, dass wir auch Daten in Echtzeit von Polygon streamen können. (Dies geschieht auch in einem kürzlich veröffentlichten „HFT-ish“-Beispiel, einem anderen Alpaca-Day-Trading-Algorithmus, der viel häufiger handelt als dieser und versucht, von winzigen Ungleichgewichten im Orderbuch zu profitieren.)

Das Polygon.io-Logo.

Mit dem Python-SDK von Alpaca können wir uns mit drei Arten von Streaming-Kanälen verbinden. Der erste ist trade_updates, bei dem es sich einfach um eine Verbindung zu Alpaca handelt, über die wir Updates zu unseren Aufträgen hören können, sobald sie geschehen. Wir werden dies nutzen, um sicherzustellen, dass wir nicht mehrere offene Aufträge für eine Aktie auf einmal einreichen und um zu sehen, ob unsere Aufträge ausgeführt werden.

Die anderen beiden Kanäle sind A.<symbol> und AM.<symbol> . Für jede Aktie, die wir beobachten wollen, abonnieren wir diese Kanäle, um von Polygon Updates über den Preis und das Volumen der Aktie zu erhalten. Der A-Kanal wird jede Sekunde aktualisiert, während der AM-Kanal jede Minute aktualisiert wird. Wir fassen die Informationen des A-Kanals selbst zusammen, damit wir sekundengenaue Berechnungen durchführen können, aber wir betrachten AM als die Quelle der Wahrheit und ersetzen alles, was wir zusammengefasst haben, durch das, was über diesen Kanal kommt. Während wir damit auskommen, nur A zu beobachten und uns auf unsere eigene Aggregation zu verlassen, gibt uns das Vertrauen in AM ein wenig zusätzliche Sicherheit gegen Schluckauf in der Verbindung und dergleichen.

Nachdem wir die eingehenden Daten zu unserem Aggregat hinzugefügt haben, prüfen wir, ob eine Aktie ein guter Kauf zu sein scheint, sofern wir sie nicht bereits bestellt haben. Wir definieren einen „guten Kauf“ als eine Aktie mit einem positiven, ansteigenden MACD, die mit einem angemessenen Volumen gehandelt wird und bis heute um über 4 % gegenüber dem gestrigen Schlusskurs gestiegen ist. Wir wollen auch sicherstellen, dass der Kurs seinen Schwung nach der Eröffnung beibehalten hat, d. h. wir achten darauf, dass der Kurs in den ersten fünfzehn Minuten nach der Markteröffnung über dem Höchststand liegt. Wir hoffen, dass diese Aktien im Laufe des Tages weiter an Wert gewinnen werden.

Wenn wir eine Position in einer Aktie haben, überprüfen wir mit jedem neuen Balken, der für diese Aktie eingeht, ob es Zeit ist, zu verkaufen. Wir verkaufen, wenn die Aktie entweder unser Kursziel oder unseren Stop-Loss erreicht hat oder wenn der MACD darauf hindeutet, dass das Wertpapier seinen Schwung verliert und auf unsere Kostenbasis zurückgefallen ist. Im Idealfall erreichen so viele Aktien das von uns festgelegte Kursziel, dass wir die Verluste aus den Aktien, die den Stop-Loss erreicht haben, wieder aufholen können, wobei wir noch einige zusätzliche Gewinne erzielen.

Am Ende des Handelstages liquidieren wir die verbleibenden Positionen, die wir zum Marktpreis eröffnet haben. Die Verwendung von Marktaufträgen ist im Allgemeinen nicht ideal, aber in diesem Fall werden sie verwendet, weil die potenziellen Kosten des Haltens über Nacht größer sind als das Risiko, das wir für die Position eingehen wollten. Im Idealfall haben wir unsere Aktien bereits auf der Grundlage unserer definierten Stop-Losses und Zielkurse liquidiert, aber dies ermöglicht uns, alles abzufangen, was sich durch den flachen Handel an ihnen vorbeischleicht.

Wenn Sie am Ende der langen run()-Methode nach unten scrollen, werden Sie sehen, wie wir mithilfe des Alpaca Calendar API-Endpunkts prüfen, wann der Markt eröffnet und geschlossen wird. Auf diese Weise können Sie, wenn Sie möchten, einen Cron-Job einrichten, der das Skript jeden Tag zur gleichen Zeit ausführt, ohne dass Sie sich Sorgen machen müssen, dass Marktfeiertage oder späte Eröffnungen Probleme verursachen. Viele Leute ziehen es vor, ihre Skripte manuell auszuführen, aber es ist schön, die Option zu haben, sie einfach selbst laufen zu lassen.