Baue Deinen eigenen Cost Averaging ETF-Sparplan mit der lemon.markets API


Invalid Date
Trading


Oder mit anderen Worten, richte eine "faule" Automatisierung für Deine wiederkehrenden Trades ein.

Hey! Ich bin Joanne und ich bin Teil von lemon.markets 🍋  Wir sind ein Startup, das eine Brokerage Infrastruktur für Entwickler:innen baut. Mit unserer API kannst Du an der Börse partizipieren und mit ihr interagieren, indem Du beispielsweise eine automatisierte Trading-Strategie implementierst oder dein personalisiertes Dashboard für Dein Portfolio baust.

In diesem Blogpost führe ich Dich durch eine einfache Dollar-Cost-Averaging Strategie, mit der Du Deinen Sparplan automatisieren kannst. Nichts Ausgefallenes - sie soll nur Dein Leben einfacher machen 😉. Und um das Ganze abzurunden, zeige ich Dir auch, wie Du einen Telegram-Bot einrichtest, der Dir Trade-Benachrichtigungen schickt. Selbst wenn Du Dir noch nicht sicher bist, was Du mit der API bauen möchtest, wird dieser Blog Post Deine kreative Ader anregen. Meld Dich hier bei lemon.markets an und leg direkt los.

Was ist "Dollar-Cost-Averaging"?

Wenn Du bereits regelmäßig investierst, indem Du z.B. 10% Deines monatlichen Gehalts in einen ETF oder Investmentfonds steckst, dann machst Du bereits Dollar-Cost-Averaging (oder eher Euro-Cost-Averaging). Aber was bedeutet diese Strategie nun eigentlich? Stell Dir vor, Du hast eine große Summe Geld, sagen wir 10.000 €, die Du investieren möchtest. Wenn Du Dollar-Cost-Averaging (DCA) betreiben möchtest, würdest Du Deine Einzahlungen verteilen. Also beispielsweise indem Du 1.000 € monatlich über einen Zeitraum von 10 Monaten investierst. Das Gegenteil von DCA ist Lump-Sum-Investing (Einmalanlage), was bedeutet, dass Du die gesamte Summe auf einmal investierst.

Aber welche dieser Strategien ist nun besser? Viele Investoren wählen DCA gegenüber der Einmalanlage, weil es das Risiko senkt. Man kann davon ausgehen, dass der Preis eines Wertpapiers über diese 10 Monate mal steigen und mal fallen wird. Indem Du konsequent investierst, kaufst Du mehr oder weniger den durchschnittlichen Kurs und hast somit einen Durchschnittspreis. Idealerweise würdest Du dabei nur “günstig” kaufen, aber man kann den Markt nunmal nicht vorhersagen 🤷‍♀  Warum solltest Du also jemals etwas anderes als DCA machen? Der Vorteil von Einmalanlagen ist, dass Dein Geld sofort für Dich arbeitet und nicht noch monatelang auf dem Sparbuch liegt. Auf der anderen Seite läufst Du Gefahr, den Markt schlecht zu timen und “teuer” zu kaufen...

Aber warum nicht eine Plattform nutzen, die einen vorgefertigten Sparplan anbietet? Ganz einfach: Individualisierung und Transparenz. Bei einem vorgefertigten Sparplan fehlt Dir die Flexibilität, das Datum und die Uhrzeit der Handelsausführung anzugeben - das führt oft zu ungünstigen Konditionen für Dich. Wenn Du Deine Sparstrategie mit der lemon.markets API baust, hast Du die volle Kontrolle über alle Parameter. Du kannst gängige Kauftermine, wie den Monatsanfang und das Monatsende, vermeiden. Auf diese Weise hast Du einen Preisvorteil gegenüber den anderen DCA-Investoren. Ganz allgemein bist du viel flexibler und kannst wählen, was Du wann an welcher Börse wie oft und wie lange handelst. Außerdem bist Du nicht nur auf ETFs beschränkt - vielleicht möchtest Du auch Pinterest-Aktien besparen. Mit lemon.markets steht Dir steht alles offen.

Die DCA-Strategie automatisieren 💵.

Klar, Du könntest Dich einfach in Dein Depot einloggen und wöchentlich manuell einen Trade platzieren. Aber Du kannst diesen Prozess auch automatisieren. Ich weiß nicht, wie es Dir geht, aber letzteres klingt irgendwo cooler (und Dein Zukunfts-Ich wird es Dir wahrscheinlich danken). Also, lass uns gleich mit dem Programmieren beginnen.

Ich habe mich bei dieser Anwendung für Python entschieden, aber Du kannst natürlich auch eine andere Sprache verwenden - die Logik bleibt dieselbe.

Einrichten der Szenerie

In diesem Skript werden wir GET und POST Requests an die lemon.markets API stellen müssen. Aus diesem Grund erstellen wir eine helper.py Datei mit der Klasse RequestHandler, die alle unsere Requests bearbeiten wird. Wir erstellen zwei separate GET-Funktionen, da wir GET Requests sowohl an unsere Trading- als auch an unsere Marktdaten-APIs stellen müssen.

1import os
2import requests
3import json
4from dotenv import load_dotenv
5class RequestHandler:
6    def __init__(self):
7        load_dotenv()
8        self.headers = {'Authorization': 'Bearer ' + os.environ.get('API_KEY')}
9        self.url_trading: str = os.environ.get("BASE_URL_TRADING")
10        self.url_market: str = os.environ.get("BASE_URL_DATA")
11    def get_data_trading(self, endpoint: str):
12        response = requests.get(self.url_trading + endpoint, headers=self.headers)
13        return response.json()
14    def get_data_market(self, endpoint: str):
15        response = requests.get(self.url_market + endpoint, headers=self.headers)
16        return response.json()
17    def post_data(self, endpoint: str, data):
18        response = requests.post(self.url_trading + endpoint, json.dumps(data), headers=self.headers)
19        return response.json()

Environment-Variablen

Hast Du gesehen, dass wir os.environ.get() verwenden, um auf verschiedene Environment-Variablen zuzugreifen? Wir müssen diese Variablen entweder in einer separaten .env Datei definieren, lokal in Deiner IDE oder auf der Cloud Plattform, die Du für Dein Skript verwendest (z.B. Heroku).

Die folgenden Umgebungsvariablen brauchst du, wenn Du dieses Skript ausführen willst:

1Environment Variable, Description
2API_KEY, Your lemon.markets API Key
3MIC, Market identifier code of Trading Venue
4BASE_URL_TRADING, The base URL of the lemon.markets Trading API
5BASE_URL_DARA, The base URL of the lemon.markets Market Data API

Modelle

Im GitHub Repository für dieses Projekt wirst Du feststellen, dass wir ein Verzeichnis mit dem Namen "models" definiert haben, das zwei Dateien enthält: Order.py. Das ist ein Objekt mit spezifischen Eigenschaften - sie spiegelt außerdem direkt die Struktur unserer API wieder. Mehr dazu in unserer Dokumentation.

Order Klasse

Eine Order wird u.a. durch ihre ISIN charakterisiert - auch hier findest Du in unserer Dokumentation eine ausführliche Beschreibung. Für unseren Use Case muss eine Order platziert, aktiviert und anschließend abgerufen werden. Diese Funktionalitäten können in der Order Klasse gesehen werden, wie unten definiert.

1import os
2from dotenv import load_dotenv
3from helpers import RequestHandler
4class Order(RequestHandler):
5    def place_order(self, isin: str, expires_at: str, quantity: int, side: str):
6        load_dotenv()
7        order_details = {
8            "isin": isin,
9            "expires_at": expires_at,
10            "side": side,
11            "quantity": quantity,
12            "space_id": os.getenv("SPACE_ID"),
13            "venue": os.getenv("MIC")
14        }
15        endpoint = f'orders/'
16        response = self.post_data(endpoint, order_details)
17        return response
18    def activate_order(self, order_id):
19        endpoint = f'orders/{order_id}/activate/'
20        response = self.post_data(endpoint, {})
21        return response
22    def get_order(self, order_id):
23        load_dotenv()
24        endpoint = f'orders/{order_id}/'
25        response = self.get_data_trading(endpoint)
26        return response

Wie Du siehst, können diese drei Funktionalitäten durch Requests an unsere API realisiert werden. Indem wir Order zu einer Unterklasse der RequestHandler Klasse machen, erweitern wir die Funktionen, die wir in der letzteren definiert haben. So können wir einfach (und sauber) mit der lemon.markets API interagieren.

Die Zusammenkunft

Nachdem wir unsere Hilfsfunktionen und API-Objekte definiert und unseren Telegram-Bot eingerichtet haben, ist es nun an der Zeit, Puzzleteile zusammenzubringen.

Als ersten Schritt definieren wir die Funktion buy_order(), die mithilfe der ISIN eine Kauforder für eine Aktie platziert und aktiviert. Unsere API ist so aufgebaut, dass eine Order zuerst platziert wird (Status: inaktiv), anschließend aktiviert werden muss (Status: aktiviert) und letztendlich ausgeführt wird (Status: ausgeführt). Die Funktion prüft dabei kontinuierlich den Status der Order. Wenn sie schließlich ausgeführt wird, verwenden wir telegram-send, um eine Nachricht mit den Details des Trades zu verschicken. Anschließend lassen wir das Skript eine Woche lang schlafen bevor die nächste Order platziert wird.

Danach definieren wir unsere Hauptfunktion dollar_cost_averaging(). Hier prüfen wir zunächst, ob der Handelsplatz geöffnet ist und rufen die Funktion buy_order() mit unserem gewählten Wertpapier auf. Sollte der Handelsplatz geschlossen sein, lassen wir das Skript schlafen bis die Börse wieder öffnet und platzieren anschließend unseren Trade.

Um Trades zu setzen, nutzen wir die Advanced Python Scheduler Bibliothek. Wir rufen die buy_order() Funktion jeden Wochentag um 10:30 Uhr CET auf.

1from models.Order import Order 
2from apscheduler.schedulers.blocking import BlockingScheduler
3from apscheduler.triggers.cron import CronTrigger
4from pytz import utc
5import os 
6import time
7import telegram_send  
8def buy_order():   
9 """    This method places and activates a buy order for 1 unit of the specified instrument every week.    :param isin: isin of the instrument you want to buy    """    try:        
10placed_order = Order().place_order(
11            isin="LU0274208692",            expires_at="p0d",            side="buy",               quantity=1,        )         
12             order_id = placed_order['results'].get('id')        
13             activated_order = Order().activate_order(order_id)        
14             print(activated_order)         
15             while True:            
16                      order_summary = Order().get_order(order_id)['results']            
17                      if order_summary.get('status') == 'executed':                
18                               print('executed')               
19                               break         
20             average_price = order_summary.get('executed_price')       
21             amount_bought = order_summary.get('executed_quantity')         telegram_send.send(messages=[f'Your automated trading strategy just purchased {amount_bought} share(s) '                                     f'at €{average_price/10000:,.2f} per share.'])     
22     except Exception as e:        
23         print(e) 
24if __name__ == '__main__':    
25scheduler = BlockingScheduler(timezone=utc)     
26scheduler.add_job(buy_order,                      trigger=CronTrigger(day_of_week="mon-fri",                                          hour=10,                                          minute=30,                                          timezone=utc),                      name="Perform DCA")    
27print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))     
28try:        scheduler.start()    
29except (KeyboardInterrupt, SystemExit):       
30           pass

Im obigen Code-Snippet habe ich mich für einen ETF entschieden, der Aktien aus allen Teilen der Welt beinhaltet. Auf diese Weise verringern wir unser Risiko weiter. Aber natürlich kann man diese Strategie auch auf einzelne Aktien oder verschiedene ETFs anwenden.

Vielleicht ist Dir die Zeile mit dem telegram_send() aufgefallen und Du fragst Dich, was das zu bedeuten hat. Wir müssen noch einen Telegram-Bot einrichten, um sicherzustellen, dass der obige Code funktioniert. Also, auf geht’s!

Einen Telegram Bot einrichten 🤖

Falls Du Telegram noch nicht kennst, das ist eine Messaging Software, die es einem auch erlaubt Bots zu bauen. Wir werden die Telegram API nutzen, um einen Bot zu konfigurieren, der Dir automatisch Nachrichten auf Dein Smartphone sendet, sobald ein Trade ausgeführt wurde.

In der folgenden Sektion lernst du wie du Telegram Notifikation einrichtest.

Zunächst musst Du Deinen Bot registrieren, indem Du /newbot an BotFather sendest (weitere Erklärungen findest Du hier). Das Ergebnis ist ein Token, ähnlich wie der Token der lemon.markets API.

Um den Prozess zu vereinfachen, verwende ich das telegram-send Kommandozeilentool, das Du mit pip wie folgt installieren kannst:

1$ pip install telegram-send
2$ telegram-send --configure

Anschließend wirst Du aufgefordert Deinen Token einzugeben, der Dein Skript mit Deinem Bot verbindet. Nachdem Du dann das Passwort an Deinen neuen Bot geschickt hast, ist telegram-send erfolgreich eingerichtet. Falls Du dazu noch Fragen hast, findest Du hier die komplette Anleitung.

Anschließend können wir mit folgendem Befehl Nachrichten versenden:

1import telegram_send
2telegram_send.send(messages=["Hello!"])

Im folgenden Abschnitt werde ich Dir zeigen, wie Du Deinen Telegram-Bot zum Leben erweckst.

Hinweis: Das Skript kann an vielen Stellen noch angepasst werden, wie z.B. die Menge, Häufigkeit und Art der gehandelten Wertpapiere. Sieh es einfach als ersten Startpunkt, zu dem Du Deine eigenen Funktionalitäten hinzufügen kannst. Den obigen Code findest übrigens Du in diesem GitHub Repo.

Mögliche Erweiterungen

Idealerweise richtest Du Dein Skript einmal ein und denkst anschließend nicht mehr darüber nach - damit das funktioniert, muss es ständig laufen, auch wenn Dein Computer ausgeschaltet ist. Hierfür empfehlen wir Dir, Dein Skript in der Cloud zu hosten und eine Plattform wie Heroku zu nutzen, die Du bequem mit GitHub verbinden kannst. In diesem Blog Post haben wir beschrieben, wie Du Heroku nutzen kannst, aber Du kannst auch dieser oder dieser Schritt-für-Schritt-Anleitung folgen.

Du kannst sogar leicht von der DCA-Strategie abweichen - zum Beispiel, indem Du tägliche Marktdaten einbeziehst. Wenn der Preis Deines Wertpapiers um beispielsweise 10% fällt, könntest Du Deinen Telegram-Bot so programmieren, dass er Dich benachrichtigt. Indem Du mit dem Bot interagierst, kannst Du dann entweder zusätzliche Anteile kaufen oder Deinen Trade früher als geplant platzieren. Für Telegram-Funktionen, die über das einfache Versenden von Nachrichten hinausgehen, empfehle ich Dir den python-telegram-bot Wrapper. Vielleicht möchtest Du ja beispielsweise eine Funktion hinzufügen, die Dich benachrichtigt, dass mehr Geld auf dein Account hinzugefügt werden muss.

Mit Deiner eigenen Dollar-Cost-Averaging Strategie hast du deutlich mehr Flexibilität als mit Standard-Sparplänen. Du kannst zum Beispiel den Ausführungszeitpunkt flexibler einstellen. Du kannst sicherstellen, dass der ETF zum besten Zeitpunkt des Tages gekauft wird und nicht, wenn es für die Bank am günstigsten ist. Außerdem kannst Du mehrere Wertpapiere in einen Sparplan aufnehmen und musst nicht für jeden ETF einen eigenen anlegen, wie es bei vielen Anbietern üblich ist. Die Möglichkeiten sind quasi endlos! Also, wie sieht Deine Strategie aus?

Ich hoffe, dieser Blog Post hat Dich ein wenig inspiriert, wie Du die lemon.markets API nutzen kannst. Wenn Du Dich noch nicht angemeldet hast, kannst Du das hier tun. Wir freuen uns über jede Art von Feedback! Hinterlasse uns gerne einen Kommentar, schreibe uns eine E-Mail an support@lemon.markets oder tritt unserer Slack Community bei. Wir freuen uns darauf!

Dein Lemoneer 🍋,

Joanne

Das könnte Dich auch interessieren

blog photo

Using Time Series Forecasting to predict stock prices 🔮

In this article you will learn what time series forecasting is and how its application in finance looks like. Then you'll also dive into Facebook's Prophet Model for Time Series Forecasting and use it together with the lemon.markets Market Data API to forecast the development of the Tesla Stock.

blog photo

Dummies Guide to Trading with Machine Learning

Ever wonder how a trader with decades of experience on thousands of stocks and lightning fast reaction times might perform in the market? With some machine learning knowledge, you might be able to automate such a trader yourself! 💻 📈

blog photo

4 reasons why YOU should automate your trading strategy

In the current volatile market conditions, everyone is trying to find ways to minimise portfolio loss. In that context, have you ever thought about automating your trading strategy? In this article, we will dive into 4 reasons for doing so. Expect to learn how it can save you time, make your trading more efficient and lead to data-based decisions.

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.

Brauchst Du Hilfe?
Stell Deine Fragen in unserer CommunityStell Deine Fragen in unserer CommunityLeg mit unserer API Dokumentation losLeg mit unserer API Dokumentation losLass Dich von unserem Blog inspirierenLass Dich von unserem Blog inspirieren
© lemon.markets 2022DatenschutzImpressum
Systems are down

Als vertraglich gebundener Vermittler gemäß § 3 Abs. 2 WpIG für Rechnung und unter der Haftung der DonauCapital Wertpapier GmbH, Passauer Str. 5, 94161 Ruderting (kurz: DonauCapital), bietet Dir die lemon.markets GmbH, die Anlagevermittlung (§ 2 Abs. 2 Nr. 3 WpIG) von Finanzinstrumenten im Sinne des § 3 Abs. 5 WpIG sowie die Vermittlung von Konten an.