Trading basierend auf Nachrichten: Eine Sentiment Strategie mit der lemon.markets API


blog photo
Veröffentlicht von Joanne Snel am 18. November 2021
Insights


Bei Anlagestrategien, die sich an den Nachrichten orientieren, musst Du die Nachrichten oft sehr genau verfolgen. Was wäre also, wenn Du diesen Prozess automatisieren könntest? In diesem Projekt werden wir eine Strategie zur Sentiment Analyse entwickeln, die auf der Grundlage von Schlagzeilen eigenständig handelt. Wir zeigen Dir, wie Du Schlagzeilen von einer Finanzwebsite ziehen, das Sentiment dieser Schlagzeilen bestimmen und auf dieser Grundlage Handelsentscheidungen treffen kannst. Mit der Python requests library, Beautiful Soup, VADER und lemon.markets hast Du alle Werkzeuge, die Du brauchst, um dieses Projekt zu verwirklichen. Wir freuen uns darauf, Dir zu zeigen, wie lemon.markets, die Brokerage-API fürs automatisierte Trading, das perfekte Tool für ein solches Projekt ist.

Wenn Du sofort mit der Entwicklung beginnen möchtest, kannst Du Dir unser GitHub-Repository für dieses Projekt hier ansehen. Andernfalls lies gerne weiter, um mehr über die Strategie zu erfahren.

Warum sollte ich basierend auf Nachrichten handeln? 📰

Wahrscheinlich hast Du schon einmal den Spruch "buy the rumour, sell the news" gehört. Dieser bezieht sich auf das Phänomen, dass Trader mit der Veröffentlichung von Nachrichten (und damit auch auf Kursbewegungen) spekulieren und anschließend aus ihren Positionen aussteigen, sobald die Nachrichten wirklich veröffentlicht wurden. Wenn dies wirklich der Fall ist, wäre es dann nicht zu spät, basierend auf diesen Nachrichten zu handeln? Es hat sich herausgestellt, dass die täglichen Kursschwankungen bis zu einem gewissen Grad emotionale Reaktionen auf die Nachrichten widerspiegeln (siehe hier). Kombiniere dies mit einem automatisierten Skript und Du profitierst von den Reaktionen anderer auf die Nachrichten, ohne sie selbst genau verfolgen zu müssen.

Überzeugt? Dann lass uns anschauen, wie wir die Nachrichten für uns arbeiten lassen können. Wir beginnen damit, Schlagzeilen zu sammeln.

Daten erfassen 📊

Da dieser Prozess für jede Datenquelle anders ist, werden wir hier nicht zu sehr ins Detail gehen. Wenn Du weitere Hilfe beim Web Scraping benötigst, schau Dir diesen Artikel an.

Unser Ziel bei diesem Projekt ist es, auf der Grundlage von Nachrichten automatisiert Orders zu platzieren. Der erste Schritt besteht darin, zu entscheiden, wie wir unsere Daten sammeln wollen, und vor allem, welche Quelle wir nutzen. Wir haben uns für MarketWatch entschieden, weil die Daten in einem leicht verdaulichen Format präsentiert werden - für jede Schlagzeile erhalten wir das Datum und den Ticker, der der Schlagzeile entspricht, siehe das Beispiel unten. Anhand der Schlagzeilen können wir ein Sentiment-Spiel spielen: Rotes Licht, grünes Licht und hoffentlich ein paar Gewinne einfahren (🦑 🎲). Aber dazu in einer Sekunde mehr.

Screenshot der Technologie-Schlagzeilen von MarketWatch.com vom 19. Oktober 2021

Um diese Schlagzeilen zu sammeln, verwenden wir einen einfachen GET-Request an die gewünschte URL. Unter Verwendung des Request-Pakets sieht dies wie folgt aus:

1import requests
2page = requests.get("https://marketwatch.com/investing/technology")

Und um diese Daten zu analysieren, verwenden wir BeautifulSoup, ein Python-Paket, das Daten aus HTML-Dokumenten extrahieren kann.

1import pandas as pd
2from bs4 import BeautifulSoup
3soup = BeautifulSoup(page.content, "html.parser")
4article_contents = soup.find_all("div", class_="article__content")
5for article in article_contents:
6    headline = article.find("a", class_="link").text.strip()
7    ticker = article.find("span", class_="ticker__symbol")
8    headline_ticker = [headline, ticker]
9    headlines.append(headline_ticker)
10    
11columns = ["headline", "US_ticker"]
12headlines_df = pd.DataFrame(headlines, columns=columns)

Beachte, dass dieser Code nicht für jede beliebige Website geeignet ist. Du wirst feststellen, dass wir auf den Inhalt des Artikels über "div" und "article__content" zugreifen. Du musst dies für jede Website anpassen und dafür die jeweilige Seite genau überprüfen. In Chrome kannst Du dies tun, indem Du mit der rechten Maustaste auf eine beliebige Website klickst und "Untersuchen" auswählst (wenn Du einen anderen Browser verwendest, verwende stattdessen diese Schritte). Anschließend wirst Du mit einem Wirrwarr von HTML konfrontiert. Der einfachste Weg, um herauszufinden, wo sich die Überschriften "verstecken", ist die Tastenkombination Strg-F (oder command-F auf iOS) für eine bestimmte Überschrift anzuwenden. Du kannst auch auf die Schaltfläche "Element auf der Seite auswählen, um es zu prüfen" oben links in der Entwicklerkonsole klicken, um genau festzustellen, wo Du die gewünschten Daten findest.

Wenn Du auf ein bestimmtes Element klickst, erfährst Du, wo es sich im HTML-Code befindet. Wenn wir zum Beispiel auf einen Ticker klicken, wird uns mitgeteilt, dass er sich im <span>-Tag und in der Klasse "ticker__symbol" befindet.

Sobald Du die Tags gefunden hast, die den richtigen Elementen entsprechen, kannst Du die Namen in das obige Code-Snippet einfügen, um dessen Inhalt abzurufen. Ich würde empfehlen, den Output häufig zu generieren, um festzustellen, ob Du wirklich die gewünschten Informationen sammelst und ob diese vorverarbeitet werden müssen. In Zeile 8 entfernen wir beispielsweise die Leerzeichen, die die Überschrift umgeben, um unsere Daten zu bereinigen. Wenn Du mit Deinem Ergebnis zufrieden bist, kannst Du alle relevanten Informationen in einem Pandas DataFrame sammeln. Wenn Du an anderen Python-Ressourcen interessiert bist, die fürs automatisierte Trading nützlich sein könnten, schau Dir doch unseren Artikel zu dem Thema an.

Vorbereitung Deiner Daten 👩‍🏭

In diesem Stadium müssen Deine Daten wahrscheinlich (zusätzlich) vorbereitet werden, bevor sie für die Sentiment Analyse und zum Tradenbereit sind. Vielleicht sammelst Du auch den Timestamp der Schlagzeile und musst ihn in ein anderes Format konvertieren oder Du möchtest alle Schlagzeilen entfernen, die keinen Ticker erwähnen.

Glücklicherweise müssen wir in unserem Fall nicht viel vorbereiten. In unserem GitHub-Repository wirst Du feststellen, dass wir alle Schlagzeilen ohne Ticker und Schlagzeilen mit Tickern, die auf lemon.markets nicht handelbar sind, entfernt haben (um den Datensatz zu verkleinern). Dazu haben wir eine Liste mit nicht handelbaren Tickern erstellt und einen neuen DataFrame der gesammelten Schlagzeilen konstruiert, der nach der Negation der obigen Liste gefiltert wurde. Um auf lemon.markets zu traden, brauchen wir außerdem die ISIN des Wertpapiers. Da wir an einer deutschen Börse traden, wird der Request für einen US-Ticker nicht (immer) das richtige Wertpapier ergeben. Um sicherzustellen, dass alle Daten kompatibel sind, empfehlen wir daher, einen Ticker vorm Trading mit seiner ISIN zu verknüpfen. Wir haben einen Artikel veröffentlicht, der Dir genau dabei hilft.

Durchführung der Sentiment Analyse 😃😢

Sobald wir unsere Schlagzeilen und Ticker (oder ISINs) gesammelt haben, müssen wir entscheiden, ob eine Schlagzeile über positive oder negative Nachrichten berichtet. Hier kommt VADER, unser Tool für die Sentiment Analyse, ins Spiel. VADER ist ein Modell zur lexikalischen Bewertung basierend auf Polarität (positiv/negativ) und Intensität der Emotion. Der zusammengesetzte Score zeigt an, ob ein Text positiv (>0), neutral (0) oder negativ (<0) ist. In den obigen Schlagzeilen kann VADER feststellen, dass ""Squid Game" für Netflix fast 900 Millionen Dollar wert ist" ein eher positives Sentiment hat, da das Wort "wert" wahrscheinlich Teil des positiven Sentiment Lexikon ist.🚦 Wenn Du mehr darüber lesen möchten, wie VADER funktioniert, lies diesen Artikel. Es gibt aber auch Alternativen, wie TextBlob oder Flair. Probiere gerne alle drei aus, um festzustellen, welches Programm für Deinen Datensatz am besten geeignet ist.

Für unseren Use-Case (Ermittlung der Sentiment Scores von Online-Zeitungsüberschriften) ist die Implementierung sehr einfach:

1from nltk.sentiment.vader import SentimentIntensityAnalyzer
2vader = SentimentIntensityAnalyzer()
3scores = []
4for headline in headlines_df.loc[:,"headline"]:
5    score = vader.polarity_scores(headline).get("compound")
6    scores.append(score)
7    
8headlines_df.loc[:,"score"] = scores

Wenn es mehrere Schlagzeilen (und Scores) für einen bestimmten Ticker gibt, müssen wir diese zu einem einzigen Score zusammenfassen:

1headlines_df = headlines_df.groupby("ticker").mean()
2headlines_df.reset_index(level=0, inplace=True)

Wir haben uns dafür entschieden, die Werte anhand des einfachen Durchschnitts zu kombinieren. Dafür gibt es aber mehrere Möglichkeiten, die Du verwenden kannst. Zum Beispiel ein zeitlich gewichteter Durchschnitt, um ältere Nachrichten zu vernachlässigen, da sie wahrscheinlich weniger repräsentativ für die aktuellen (oder zukünftigen) Marktbewegungen sind.

Platziere Deine Trades 📈

Sobald Du die zusammengesetzten Scores für die Ticker erhalten hast, ist es an der Zeit, Orders zu platzieren. Vorher musst Du Dich nur noch für eine Trading Strategie entscheiden: Welcher Wert rechtfertigt eine Kauf-Order? Was ist mit einer Verkaufs-Order? Und welche Menge möchtest Du traden? Hier gibt es mehrere Komponenten zu beachten, z. B. Dein Gesamtguthaben, Dein aktuelles Portfolio, das "Vertrauen", das Du in Deine Strategie hast, und weiteres. Diese Parameter variieren entsprechend der Ziele, die Du mit dieser Strategie verfolgst.

Unser Basisprojekt arbeitet mit einer sehr einfachen Trading Regel: Kaufe Wertpapiere mit einer Punktzahl über 0,5 und verkaufe Wertpapiere mit einer Punktzahl unter -0,5 (vielleicht fällt Dir ja etwas Komplexeres ein 😉):

1buy = []
2sell = []
3for index, row in headlines_df.iterrows():
4    if row['score'] > 0.5 and row['isin'] != 'No ISIN found':
5        buy.append(row['isin'])
6    if row['score'] < -0.5 and row['isin'] != 'No ISIN found':
7        sell.append(row['isin'])

Wenn das Wertpapier handelbar ist (ISIN auf lemon.markets gefunden) und die Sentiment Scores unserer Kauf-/Verkaufsentscheidung entspricht, fügen wir die ISIN zur Liste der Wertpapiere hinzu, die wir traden möchten.

Diese Liste von ISINs können wir dann an die lemon.markets API weiterleiten (wenn Du noch nicht angemeldet bist, kannst Du das hier tun), um unsere Orders zu platzieren und zu aktivieren:

1orders = []
2# place buy orders
3for isin in buy:
4    side = 'buy'
5    order = requests.post(
6        f"https://paper-trading.lemon.markets/v1/orders/",
7        data={"isin": isin,
8              "expires_at": "p0d",
9              "side": side,
10              "quantity": 1,
11              "venue": "XMUN", 
12              "space_id": YOUR-SPACE-ID},
13        headers={"Authorization": f"Bearer {<YOUR-API-KEY>}"}).json()
14    orders.append(order)
15# place sell orders
16for isin in sell:
17    side = 'sell'
18    order = requests.post(
19        f"https://paper-trading.lemon.markets/v1/orders/",
20        data={"isin": isin,
21              "expires_at": "p0d",
22              "side": side,
23              "quantity": 1,
24              "venue": "XMUN", 
25              "space_id": YOUR-SPACE-ID},
26        headers={"Authorization": f"Bearer {<YOUR-API-KEY>}"}).json()
27    orders.append(order)
28# activate orders
29for order in orders:
30    order_id = order['results'].get('id')
31    
32    requests.post(
33        f"https://paper-trading.lemon.markets/v1/orders/{order_id}/activate/", 
34        headers={"Authorization": f"Bearer {<YOUR-API-KEY>}"})
35    print(f'Activated {order["results"].get("isin")}')

Damit es funktioniert musst Du in diesem Code-Snippet Deine eigene Space-ID und Deinen API-KEY eingeben. Bitte beachte, dass Du keine Wertpapiere verkaufst, die Du gar nicht besitzt. Das haben wir in diesem Code-Snippet ausgelassen, aber Du kannst die Umsetzung in unserem GitHub-Repository finden!

Zu Demonstrationszwecken haben wir bei unseren Orders immer eine Anzahl von 1, Du kannst diesen Parameter natürlich Deinem Kapital entsprechend z.B. erhöhen (oder ihn sogar dynamisch in Abhängigkeit vom Sentiment-Score machen). Außerdem gibt es viele Möglichkeiten, dieses Projekt noch umfangreicher zu gestalten! Wir sind gespannt auf Deine Ideen 😏.

Denkbare Erweiterungen 🤓

Dieses Projekt ist nur ein Anfang für Deine ganz eigene Sentiment-Trading Strategie. Es gibt diverse Erweiterungen, die vorgenommen werden können. Du kannst zum Beispiel Deine Trading Entscheidungen robuster machen, indem Du Nachrichten aus mehreren Quellen sammelst. Oder Du kannst eine umfassendere Sentiment-Analyse durchführen, indem Du VADER auf den gesamten Artikel und nicht nur auf die Überschrift anwendest (wir alle wissen, dass “clickbait” wirklich existiert 🎣). Oder vielleicht möchtest Du ein anderes Sentiment-Analyse-Tool wie TextBlob verwenden? Oder sogar Deine eigene Sentiment-Score-Bibliothek auf der Grundlage von anlagespezifischem Fachjargon erstellen.

Wir schlagen vor, dass Du damit beginnst, Daten aus einer Nachrichtenquelle Deines Vertrauens zu sammeln und die Entscheidungsregel für das Trading zu optimieren. Lass Deiner Fantasie freien Lauf!

Du bist nun in der Lage, BeautifulSoup, VADER und lemon.markets in Deinem Sentiment-Analyse-Projekt zu verwenden. Das gesamte Skript findest Du in unserem GitHub-Repository. Und wenn Dir eine interessante Erweiterung einfällt, kannst Du gerne einen PR erstellen! Wir freuen uns darauf, Deine Ideen zu sehen.

Joanne von lemon.markets🍋

Das könnte Dich auch interessieren

Die lemon.markets Trading API verstehen

blog photo

lemon.markets wurde aus dem Mangel an europäischen Brokern mit einer stabilen, zuverlässigen API geboren. Wir haben unsere Trading API für Entwickler:innen gebaut, sodass Du fast jedes erdenkliche Brokerage-Produkt damit bauen kannst. Lies weiter, um mehr über die verschiedenen Endpunkte zu erfahren.

Trading Terminologie, die Du als Anfänger:in kennen solltest

blog photo

Das Trading-Universum ist bekannt für seine ganz eigene Sprache - was ist überhaupt der Unterschied zwischen einem "Bärenmarkt" und einem "Bullenmarkt"? Und warum werden Finanzinstrumente immer mit zwei Preisen aufgeführt? Wenn Du gerade erst mit dem Trading anfängst oder eine kurze Zusammenfassung benötigst, lies weiter, um die Fachbegriffe für Anfänger:innen aufzufrischen. Du wirst im Handumdrehen ein Expert:in sein!

Trading basierend auf Nachrichten: Eine Sentiment Strategie mit der lemon.markets API

blog photo

Wenn Du jemals darüber nachgedacht hast Deine Trading Entscheidungen basierend auf den Nachrichten zu treffen, dann weißt Du wahrscheinlich auch welcher Zeitaufwand mit dieser Strategie verbunden ist. Was wäre also, wenn Du den Prozess automatisieren könntest? Lies weiter, um zu erfahren wie Du einen Sentiment-Analyse Bot einrichtest, der für Dich basierend auf Nachrichtenmeldungen handelt.

Tiefer eintauchen

Finde weitere Ressourcen für einen einfachen Einstieg

In unserer Dokumentation erfahrt Ihr mehr über unsere API-Struktur, die verschiedenen Endpunkte und spezifische Anwendungsfälle.

Austauschen

Tritt der lemon.markets Community bei

Tritt unserem Slack-Channel bei, um Dich aktiv an unserer Community zu beteiligen, Fragen an andere Nutzer:innen zu stellen und immer auf dem Laufenden zu bleiben.

Team unterstützen

Lust lemon.markets mit uns zu bauen?

Wir sind immer auf der Suche nach großartigen Ergänzungen für unser Team, die uns beim Aufbau einer Brokerage Infrastruktur für das 21. Jahrhundert helfen.

Products
Pricing
For Developers
SlackGithubBlog
© lemon.markets 2021Privacy PolicyImprint
All systems normal