English | Deutsch

Wie man einen Aktienhandelsbot mit Python erstellt

In diesem Tutorial werden wir einen Aktienhandels-Bot in Python mit Alpaca und Codesphere erstellen.

December 14, 2023 7 Min Lesezeit
Wie man einen Aktienhandelsbot mit Python erstellt
Wie man einen Aktienhandelsbot mit Python erstellt

Codesphere

From everyone in the Codesphere Team:)

In diesem Tutorial werden wir Python verwenden, um unseren eigenen Trading-Bot zu erstellen.

Denken Sie daran, dass es in diesem Tutorial nicht darum geht, wie Sie mit Ihrem Trading-Bot Milliarden verdienen können. Wenn ich einen so ausgeklügelten Algorithmus hätte, würde ich ihn wahrscheinlich nicht weitergeben. Vielmehr zeige ich Ihnen, wie Sie Marktdaten lesen, Aktien kaufen und verkaufen und die Logik Ihres Handelsalgorithmus programmieren können - und das alles mit relativ einfachem Python-Code.

Und natürlich:

Dieser Artikel dient nur zu Informationszwecken. Er ist nicht als Anlageberatung gedacht. Wenden Sie sich für eine Anlageberatung an einen ordnungsgemäß zugelassenen Fachmann.

Sie können Ihre eigene Vollversion erhalten, indem Sie einen Codesphere Workspace aus der Trading Bot-Vorlage erstellen.

Sie benötigen jedoch einen API-Schlüssel, bevor Sie tatsächlich mit unserem Bot handeln können - dazu später mehr.

Einige hilfreiche Begriffe

Bevor wir beginnen, ist es hilfreich, ein paar Begriffe zu definieren:

  • Papierhandel: Der Handel mit Wertpapieren mit falschem Geld zu Lehr- oder Testzwecken.
  • Backtesting: Testen eines Handelsalgorithmus anhand vergangener Marktdaten, um seine Effektivität zu bewerten.
  • Gleitender Durchschnitt: Der Durchschnitt einer bestimmten Anzahl der jüngsten Einträge in einem Datensatz.
  • S&P 500: Ein Börsenindex, der sich aus den 500 größten an US-Börsen notierten Unternehmen zusammensetzt
  • Schlusskurs: Der endgültige Preis eines Wertpapiers während einer Zeiteinheit
  • Good 'Til Cancel (GTC): Wenn Sie einen Handel platzieren, wird dieser möglicherweise nicht sofort ausgeführt. Ein Broker wird weiterhin versuchen, einen GTC-Handel auszuführen, bis Sie ihn stornieren.

Einrichtung

Die Handels-API, die wir verwenden werden, heißt Alpaca und ist bei weitem eine der intuitivsten Handels-APIs, die ich gefunden habe.

Alpaca - Developer-First API for TradingAlpaca's einfach zu bedienende APIs ermöglichen Entwicklern und Unternehmen die Erstellung von Apps, die Einbettung von Investitions- und Handelsalgorithmen.Alpaka

In der kostenlosen Version umfasst Alpaca sowohl den Papier- als auch den realen Handel und sowohl historische als auch Live-Marktdaten. Es hat auch eine unglaublich saubere Benutzeroberfläche und Python-Bibliothek.

Wenn Sie Ihr Python-Skript nicht auf Ihrem Computer laufen lassen wollen, müssen Sie Ihren Trading-Bot in der Cloud deployen. Hierfür werden wir Codesphere verwenden:

Codesphere: Cloud-IDE & DevOps-Plattform in KombinationSchließen Sie eine beispiellose Cloud-Entwicklung auf. Integrierte IDE trifft auf leistungsstarke Infrastruktur. Erleben Sie schnellere Deployments und verbesserte Zusammenarbeit.

Da das Frontend von Codesphere eine IDE ist, können wir unseren Bot direkt auf der Plattform entwickeln. Wenn Sie die Codierung jedoch auf Ihrem lokalen Rechner vornehmen möchten, können Sie Ihr GitHub-Repository mit Codesphere verbinden und anschließend deployen.

Die einzige Umgebungseinrichtung, die wir wirklich brauchen, bevor wir mit dem Programmieren beginnen können, ist die Erstellung unserer pip-Umgebung:

pipenv shell

Und dann installieren Sie die Alpaca API:

pipenv install alpaca_trade_api

Außerdem müssen wir ein kostenloses Alpaca-Konto einrichten und dann zu unserem Papierhandelskonto navigieren.

Beachten Sie Ihren API-Schlüssel auf der rechten Seite. Wenn Sie Ihr Konto zum ersten Mal eröffnen, werden Sie aufgefordert, einen Schlüssel zu generieren, und es werden Ihnen sowohl öffentliche als auch private Schlüssel angezeigt. Wir brauchen diese für später.

Kaufen und Verkaufen von Aktien

Wir können dann unsere Alpaca-Handelsbibliothek einrichten und so Aktien in Python kaufen und verkaufen:

import alpaca_trade_api as tradeapi

SEC_KEY = '' # Enter Your Secret Key Here
PUB_KEY = '' # Enter Your Public Key Here
BASE_URL = 'https://paper-api.alpaca.markets' # This is the base URL for paper trading
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) # For real trading, don't enter a base_url


# Buy a stock
api.submit_order(
  symbol='SPY'; # Replace with the ticker of the stock you want to buy
  qty=1,
  side='buy',
  type='market', 
  time_in_force='gtc' # Good 'til cancelled
)

# Sell a stock(Just change side to 'sell')
api.submit_order(
  symbol='SPY',
  qty=1,
  side='sell',
  type='market',
  time_in_force='gtc'
)

Unsere Strategie

Die Strategie, die wir verwenden werden, besteht darin, immer dann zu kaufen und zu verkaufen, wenn der gleitende 5-Minuten-Durchschnitt unseren Kurs kreuzt. Nun, das ist weit entfernt von einer guten Handelsstrategie, aber die Logik ist relativ einfach und ermöglicht es uns, sich auf die allgemeine Struktur eines Trading-Bots zu konzentrieren.

Im obigen Beispiel ist die rote Linie der Aktienkurs und die blaue Linie ist der gleitende Durchschnitt. Wenn der gleitende Durchschnitt unter unserem Kurs liegt, kaufen wir eine Aktie. Dann halten wir die Aktie, bis der gleitende Durchschnitt wieder über den Kurs steigt. Wenn das passiert, verkaufen wir unsere Aktie und warten auf das nächste Kaufsignal.

In diesem Artikel werden wir mit dem SPY handeln, einem Index, der den S&P 500 abbildet, und wir werden jeweils nur eine Aktie handeln.

Denken Sie daran, dass Sie, wenn Sie diese Geschäfte mit echtem Geld machen würden, die Day-Trading-Vorschriften und Maklergebühren beachten müssten, was Ihre Gewinne wahrscheinlich zunichte machen würde.

Lesen von Marktdaten

Gehen wir nun darauf ein, wie man Marktdaten mit der Alpaca API in Python liest:

import alpaca_trade_api as tradeapi

import alpaca_trade_api as tradeapi
import numpy as np
import time

SEC_KEY = ''
PUB_KEY = ''
BASE_URL = 'https://paper-api.alpaca.markets'
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL)

symb = "SPY"

while True:
    print("")
    print("Checking Price")
    
    market_data = api.get_barset(symb, 'minute', limit=5) # Get one bar object for each of the past 5 minutes

    close_list = [] # This array will store all the closing prices from the last 5 minutes
    for bar in market_data[symb]:
        close_list.append(bar.c) # bar.c is the closing price of that bar's time interval

    close_list = np.array(close_list, dtype=np.float64) # Convert to numpy array
    ma = np.mean(close_list)
    last_price = close_list[4] # Most recent closing price

    print("Moving Average: " + str(ma))
    print("Last Price: " + str(last_price))
    
    time.sleep(60) # Wait one minute before retreiving more market data

Wenn Sie ausführlichere Informationen für die Erstellung Ihrer Strategie suchen, lesen Sie die Dokumentation von Alpaca:

Corporate ActionsDieser Endpunkt liefert Daten über die Corporate Actions für jedes gegebene Symbol über einen bestimmten Zeitraum.Alpaca API Docs

Umsetzung unserer Strategie

Lassen Sie uns nun endlich all dies zu unserem vollständigen Handelsalgorithmus zusammenfügen:

import alpaca_trade_api as tradeapi
import numpy as np
import time


SEC_KEY = '' # Enter Your Secret Key Here
PUB_KEY = '' # Enter Your Public Key Here
BASE_URL = 'https://paper-api.alpaca.markets' # This is the base URL for paper trading
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL) # For real trading, don't enter a base_url


symb = "SPY"
pos_held = False

while True:
    print("")
    print("Checking Price")
    
    market_data = api.get_barset(symb, 'minute', limit=5) # Get one bar object for each of the past 5 minutes

    close_list = [] # This array will store all the closing prices from the last 5 minutes
    for bar in market_data[symb]:
        close_list.append(bar.c) # bar.c is the closing price of that bar's time interval

    close_list = np.array(close_list, dtype=np.float64) # Convert to numpy array
    ma = np.mean(close_list)
    last_price = close_list[4] # Most recent closing price

    print("Moving Average: " + str(ma))
    print("Last Price: " + str(last_price))

    
    if ma + 0.1 < last_price and not pos_held: # If MA is more than 10cents under price, and we haven't already bought
        print("Buy")
        api.submit_order(
            symbol=symb,
            qty=1,
            side='buy',
            type='market',
            time_in_force='gtc'
        )
        pos_held = True
    elif ma - 0.1 > last_price and pos_held: # If MA is more than 10cents above price, and we already bought
        print("Sell")
        api.submit_order(
            symbol=symb,
            qty=1,
            side='sell',
            type='market',
            time_in_force='gtc'
        )
        pos_held = False
     
    time.sleep(60)

Und da haben wir es! Wir haben gerade einen Trading-Bot in 54 Zeilen Code gebaut! Wenn wir ihn nun den ganzen Tag über auf Codesphere laufen lassen, sollte sich unser Alpaka-Dashboard den ganzen Tag über aktualisieren:

Backtesting einer Strategie

Wenn Sie nicht warten wollen, um zu sehen, ob Ihr Algorithmus gut ist, können wir Alpacas Marktdaten-API verwenden, um unseren Python-Algorithmus anhand historischer Daten zu testen:

import alpaca_trade_api as tradeapi
import numpy as np
import time

SEC_KEY = ''
PUB_KEY = ''
BASE_URL = 'https://paper-api.alpaca.markets'
api = tradeapi.REST(key_id= PUB_KEY, secret_key=SEC_KEY, base_url=BASE_URL)

symb = "SPY"
pos_held = False
hours_to_test = 2

print("Checking Price")
market_data = api.get_barset(symb, 'minute', limit=(60 * hours_to_test)) # Pull market data from the past 60x minutes

close_list = []
for bar in market_data[symb]:
    close_list.append(bar.c)



print("Open: " + str(close_list[0]))
print("Close: " + str(close_list[60 * hours_to_test - 1]))


close_list = np.array(close_list, dtype=np.float64)
startBal = 2000 # Start out with 2000 dollars
balance = startBal
buys = 0
sells = 0



for i in range(4, 60 * hours_to_test): # Start four minutes in, so that MA can be calculated
    ma = np.mean(close_list[i-4:i+1])
    last_price = close_list[i]

    print("Moving Average: " + str(ma))
    print("Last Price: " + str(last_price))

    if ma + 0.1 < last_price and not pos_held:
        print("Buy")
        balance -= last_price
        pos_held = True
        buys += 1
    elif ma - 0.1 > last_price and pos_held:
        print("Sell")
        balance += last_price
        pos_held = False
        sells += 1
    print(balance)
    time.sleep(0.01)

print("")
print("Buys: " + str(buys))
print("Sells: " + str(sells))

if buys > sells:
    balance += close_list[60 * hours_to_test - 1] # Add back your equity to your balance
    

print("Final Balance: " + str(balance))

print("Profit if held: " + str(close_list[60 * hours_to_test - 1] - close_list[0]))
print("Profit from algorithm: " + str(balance - startBal))

Nächste Schritte

Da haben Sie es also, wir haben gerade eine rudimentäre Trading-Bot mit einigen ziemlich einfachen Python erstellt!

Hier ist das vollständige Repo:

GitHub - codesphere-cloud/trading-bot-app-template-pyBeitragen Sie zur Entwicklung von codesphere-cloud/trading-bot-app-template-py bei, indem Sie ein Konto auf GitHub anlegen.GitHubcodesphere-cloud

Obwohl ich euch sehr ermutige, mit der Alpaca-API zu Lernzwecken herumzuspielen, seid extrem vorsichtig, wenn ihr mit echten Wertpapieren handeln wollt. Ein Fehler in Ihrem Code könnte katastrophale Auswirkungen auf Ihr Bankkonto haben.

Das ist eine gute Gelegenheit, die Statistikkurse, die Sie belegt haben, in die Praxis umzusetzen.

Über den Autor

Wie man einen Aktienhandelsbot mit Python erstellt

Codesphere

From everyone in the Codesphere Team:)

Wir bauen die nächste Generation der Cloud auf, indem wir Infrastruktur und IDE an einem Ort vereinen, einen nahtlosen DevEx ermöglichen und den Bedarf an DevOps-Spezialisten eliminieren.

Weitere Beiträge

Deployment von Landscapes auf Codesphere

Deployment von Landscapes auf Codesphere

Lernen Sie, wie Sie mehrere Dienste, die unabhängig voneinander vertikal und horizontal skaliert werden können, innerhalb eines einzigen Workspace deployen und runen können. Geeignet für das Hosting ganzer Anwendungslandschaften.

Monitoring & Alerting

Monitoring & Alerting

Erfahren Sie, wie Sie auf das in Codesphere integrierte Ressourcen Monitoring zugreifen und die Betriebszeit Ihrer Anwendungen überprüfen können.

Pfadbasiertes Routing

Pfadbasiertes Routing

Erfahren Sie, wie Sie mehrere unabhängige Anwendungen mit einer einzigen Domäne verbinden, indem Sie verschiedene Pfade mit unterschiedlichen Workspaces verknüpfen