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.
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:
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:
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:
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.