Ein LangChain-Handelsagent, der durch aktuelle EODHD-Marktdaten unterstützt wird – Schritt für Schritt
Warum LLM-Handelsagenten ohne echte Daten versagen, wie der ReAct-Zyklus funktioniert und wie man einen dreifach ausgestatteten LangChain-Agenten auf der Grundlage von EODHD-Preisen, Fundamentaldaten und RSI erstellt.
Quellen: Building a Trading Agent with LangChain and the EODHD API
Viele der sogenannten KI-Handelsagenten, die in Videos gezeigt werden, sind keine echten Agenten. Es handelt sich dabei um Sprachmodelle mit präzise formulierten Anweisungen sowie erfundenen Zahlen. Ein echter Agent benötigt drei Dinge: Fähigkeit zum logischen Denken, Werkzeuge zur Ausführung von Aktionen sowie aktuelle Daten, damit er keine Halluzinationen entwickelt. Wenn man das Dritte weglässt, spielen die ersten beiden kaum noch eine Rolle. Dies gilt für alle, die Agenten für die Finanzanalyse entwickeln, LangChain mit echten Marktdaten verbinden, oder die bereits einen LLM‑„Handelsbot“ ausprobiert haben und festgestellt haben, dass er ohne zuverlässige Daten nur Show ist.
Kurz gesagt ist ein Agent ein LLM, dem Werkzeuge (Funktionen) sowie die Freiheit gegeben wird, selbst zu entscheiden, wann und wie sie aufgerufen werden sollen, anstatt aus trainierten Kenntnissen zu antworten. LangChain ist ein Python-Framework, das das Modell, die Werkzeuge, den Speicher sowie den Entscheidungsprozess zu einer einheitlichen, ausführbaren Einheit verbindet. EODHD stellt das bereit, was kein Modell standardmäßig hat: Echtzeit-Preise, Grunddaten, technische Indikatoren sowie aktuelle Finanznachrichten über eine REST-API. Zusammen ergeben sie einen Agenten, der auf der Grundlage aktueller Daten antworten kann – beispielsweise „Sollte dieser Aktienwert gerade mein Interesse wecken?“ – und nicht auf der Grundlage veralteter Informationen.
Das Modell ist nicht die Schwachstelle
Fragen Sie jede KI nach dem aktuellen Aktienkurs – sie gibt eine Zahl an. Diese Zahl kann bereits Monate alt sein oder einfach erfunden worden sein. Die Modelle haben keinen Zugriff auf den aktuellen Markt, wissen nicht, was gestern passiert ist, und haben auch den neuesten Geschäftsbericht nicht gesehen, obwohl viele Projekte sie dennoch so verwenden, als hätten sie diesen Zugang. Die Ergebnisse sind vorhersehbar: Empfehlungen, die auf jahrelangem Datenmaterial beruhen, erfundene Fundamentaldaten, die mit voller Überzeugung präsentiert werden, sowie technische Analysen, die auf Preisen basieren, die nie existiert haben.
Das zeigt keineswegs, dass das Modell in Finanzfragen ungeschickt ist. Das Problem ist vielmehr, dass niemand es mit den richtigen Eingaben versorgt. Ein Modell ohne geeignete Werkzeuge ist wie eine Bibliothek ohne Fenster: viel Wissen, aber kein Überblick über die Gegenwart. Ein größeres Modell ändert daran nichts. Der Zugang zu überprüfbaren externen Daten sowie die Möglichkeit, dass das Modell selbst entscheiden kann, wann es nach Informationen suchen soll, lösen dieses Problem. Dafür ist ein Agent da.
Die Technologiearchitektur
LangChain kümmert sich um die Logik des Agents. Er nimmt die Frage des Benutzers entgegen, wählt ein Tool aus, führt den Aufruf durch, interpretiert das Ergebnis und formuliert eine Antwort. Daran ist nichts Magisches – es handelt sich lediglich um einen mit Regeln ausgestatteten Schlussfolgerungszyklus.
EODHD schließt die Datenlücke. Über seine API kann der Agent Echtzeit- sowie historische OHLCV-Preise, Unternehmensgrunddaten wie Kennzahlen, Bilanz und Umsätze, technische Indikatoren wie RSI, gleitende Durchschnitte und MACD sowie Nachrichten mit Marktsentiment abrufen. Die Gründe, dieses Tool für diese Art der Automatisierung zu wählen, sind praktischer Natur. Die Abdeckung umfasst Börsen weltweit und nicht nur die NYSE und NASDAQ. Grunddaten, technische Analysen und Nachrichten liegen hinter separaten Endpunkten vor, sodass jede Komponente zu einem eigenständigen Tool werden kann. Zudem ist die kostenlose Version ausreichend umfangreich, um vor der Skalierung Prototypen zu entwickeln.
EODHD als Datenlayer betrachten
Jeder Datenanbieter verdient einen ehrlichen Blick, bevor er in einen Agent integriert wird. Positiv ist, dass Preise, Fundamentaldaten, technische Indikatoren und Nachrichten unter einem einzigen Schlüssel sowie einem einzigen Abrechnungsplan zusammengefasst sind, sodass man nicht drei verschiedene Anbieter kombinieren muss. Viele kostenlose Alternativen, wie scraper-basierte Lösungen von Yahoo oder eingeschränkte Alpha Vantage-Pläne, beschränken sich auf US-Aktienkurse, während EODHD Dutzende von Börsen abdeckt – was für Aktien außerhalb der USA wichtig ist. Die Antworten liegen in strukturiertem JSON vor mit vorhersehbaren Feldern (close, change_p, PERatio usw.), wodurch Tool-Wrapper einfach zu erstellen sind und nichts von einer instabilen HTML-Parsing-Logik abhängt. Man kann den gesamten Agent – einschließlich Preisinformationen, Fundamentaldaten und RSI-Werten – erstellen und testen, bevor man bezahlt. Die Ratelimits sind dokumentiert und vorhersehbar, was wichtig ist, wenn ein Agent für eine Frage mehrfach auf ein Tool zugreifen muss.
Es gibt auch Nachteile. Die kostenlose Version hat tägliche Anfragenlimits, die für eine persönliche Watchlist ausreichen, aber nicht ausreichen, was ein mehrbenutzerfähiger Produktivdienst benötigt. Die Grunddaten werden nach dem Zeitplan des Anbieters aktualisiert, nicht sofort nach der Veröffentlichung der Zahlen – ein Limit, das alle Grunddaten-APIs teilen, aber relevant ist, wenn Ihr Agent auf Echtzeitanalysen setzt. Zudem liegt es weiterhin in Ihrer Verantwortung, die Toolbeschreibungen zu erstellen: Ein schlecht geschriebenes LangChain-Tool wird unabhängig von der API-Qualität immer noch zur falschen Zeit aufgerufen oder vom Modell falsch interpretiert. Für einen Reasoning-Agenten, der echte, strukturierte Finanzdaten ohne Scraping-Pipeline benötigt, sprechen die Kompromisse eher für eine gehostete API als für eine selbst erstellte Datenschicht.
Wie der Reasoning-Loop funktioniert
Die meisten Tutorials überspringen, was ein „Agent“ mechanisch bedeutet. Ein LangChain-Agent, der das ReAct-Muster (Reason plus Act) verwendet, führt einen Loop mit vier Teilen aus.
- Das LLM, das die Frage sowie die Beschreibungen der Tools liest und den nächsten Schritt auswählt.
- Die Tools, also aufrufbare Funktionen mit jeweils einem Namen, einer Beschreibung sowie erwarteten Eingaben und Ausgaben, wie zum Beispiel
get_live_price,get_fundamentalsundget_rsi. - Der Executor, der das angeforderte Tool tatsächlich ausführt, gibt die Ausgabe an das Modell zurück und lässt es entscheiden, was als Nächstes geschieht.
- Das Scratchpad, ein laufender Protokoll der Gedanken-, Handlungs- und Beobachtungsschritte innerhalb einer Anfrage, damit das Modell sich daran erinnern kann, was es bereits überprüft hat.
Eine Frage wie „Sollten wir uns gerade AAPL.US ansehen?“ erzeugt eine solche Kette. Zuerst möchte das Modell den Preis erfahren:
Thought: I need the current price first.
Action: get_live_price("AAPL.US")
Observation: AAPL.US: current price 227.50, change +0.8%
Dann kommt es zu dem Schluss, dass der Preis für sich genommen wenig aussagt, und wendet sich Momentum sowie Bewertung zu:
Thought: Price alone isn't enough — check momentum.
Action: get_rsi("AAPL.US")
Observation: AAPL.US — RSI(14): 58.3Thought: Not overbought. Check if valuation is reasonable.
Action: get_fundamentals("AAPL.US")
Observation: AAPL.US — PE: 31.2, Market Cap: 3.4T, Dividend Yield: 0.4%Thought: I now have enough data to answer.
Final Answer: [synthesized response]
Das ist die architektonische Lücke zwischen einem Agenten und einem Chatbot mit Systemanweisungen. Das Modell wählt zur Laufzeit die Reihenfolge der Toolaufrufe anhand dessen aus, was jede Beobachtung offenbart, und es ist kein fester Script beteiligt. Genau deshalb sind die Qualität und Struktur der Datengrundlage so entscheidend. Wenn get_fundamentals Unsinn oder veraltete Zahlen zurückgibt, erbt jeder darauf aufbauende Gedanke den Fehler ohne jegliche sichtbare Warnung. Jeder Schlussfolgerungs Schritt hängt von der Zuverlässigkeit des vorherigen ab, was der Hauptgrund dafür ist, warum Finanzagenten eine echte, strukturierte API statt von Scraping oder Caching gewonnener Daten benötigen.
Entwicklung
Der Agent verfügt über drei Tools, die mit EODHD verbunden sind: aktuelle Kurse, Fundamentaldaten und technische Indikatoren. Beginnen Sie damit, die entsprechenden Pakete zu installieren:
pip install langchain langchain-openai requests
Die Tools selbst sind einfache Funktionen. Jede von ihnen ruft einen einzelnen EODHD-Endpunkt auf und gibt sauberen, strukturierten Ausgangstext zurück, den das Modell lesen kann:
import requests
from langchain.tools import tool
EODHD_API_KEY = "YOUR_API_KEY"
BASE_URL = "https://eodhd.com/api"
@tool
def get_live_price(ticker: str) -> str:
"""Returns the current price of a stock. Example ticker: AAPL.US"""
url = f"{BASE_URL}/real-time/{ticker}"
params = {"api_token": EODHD_API_KEY, "fmt": "json"}
r = requests.get(url, params=params).json()
return f"{ticker}: current price {r['close']}, change {r['change_p']}%"
@tool
def get_fundamentals(ticker: str) -> str:
"""Returns key fundamental metrics: PE ratio, market cap, dividend yield."""
url = f"{BASE_URL}/fundamentals/{ticker}"
params = {"api_token": EODHD_API_KEY}
r = requests.get(url, params=params).json()
highlights = r.get("Highlights", {})
return (
f"{ticker} - PE: {highlights.get('PERatio')}, "
f"Market Cap: {highlights.get('MarketCapitalization')}, "
f"Dividend Yield: {highlights.get('DividendYield')}"
)
@tool
def get_rsi(ticker: str) -> str:
"""Returns the 14-day RSI to assess overbought or oversold conditions."""
url = f"{BASE_URL}/technical/{ticker}"
params = {"api_token": EODHD_API_KEY, "function": "rsi", "period": 14, "fmt": "json"}
r = requests.get(url, params=params).json()
latest = r[-1]
return f"{ticker} - RSI(14): {latest['rsi']} as of {latest['date']}"
Dann erstellen Sie den Agenten aus einem Chat-Modell, den Werkzeugen und einer ReAct-Aufforderung:
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [get_live_price, get_fundamentals, get_rsi]
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
Das sind drei Werkzeuge, ein LLM und eine Schleife, die je nach Frage zwischen ihnen wählt. Die Aufrufstruktur sieht so aus:
response = executor.invoke({
"input": "Should we be looking at AAPL.US right now?"
})
print(response["output"])
Der Agent antwortet nicht aus dem Gedächtnis. Zuerst ruft er get_live_price auf, anschließend get_rsi, und get_fundamentals, wenn die Bewertung wichtig ist, bevor er alle drei Ergebnisse zu einer Antwort zusammenführt, die auf echten Daten beruht und keine zuverlässig formatierte Halluzination ist. Natürliche Erweiterungen umfassen einen Agenten für mehrere Aktienkurse, der mehrere Aktien in einer Anfrage vergleicht, ein Pipeline-System, das über den Sentiment-Endpunkt Nachrichten hinzufügt, sowie einen stündlichen Alarmmechanismus, der eine Watchlist überwacht.
Was man daraus mitnehmen sollte
Ein Agent ohne echte Daten ist lediglich ein überzeugender Textgenerator, kein Analysetool. LangChain kümmert sich um die Orchestrierung, und eine zuverlässige Daten-API bewältigt das zugrundeliegende Problem, nämlich aktuelle und zuverlässige Finanzinformationen. In einem ReAct-Agent erbt jeder Schritt die Zuverlässigkeit der Daten des vorherigen Schritts, wodurch die Datenschicht genauso wichtig ist wie der Prompt. Zudem skalieren schlanke Tools mit jeweils einer einzigen Aufgabe besser, als wenn man alle Logik in einen riesigen Prompt packt.
Folgen einige häufig gestellte Fragen. Was ist ein Agent in einem Handelskontext? Es handelt sich um ein System, in dem das LLM entscheidet, welche Tools – von Preisen über fundamentale Daten bis hin zu Nachrichten – es zur Erledigung einer Aufgabe mit echten Daten und nicht nur mit trainiertem Wissen verwenden soll. Warum LangChain anstelle einer direkten API-Aufrufung? Es übernimmt die Steuerung des Entscheidungsprozesses, also welche Tool wann eingesetzt wird und wie mehrere Ergebnisse kombiniert werden sollen – etwas, was man sonst für jeden Fall manuell festlegen müsste. Ist ein kostenpflichtiges EODHD-Konto erforderlich, um dies auszuprobieren? Nein, die kostenlose Version reicht bereits zum Erstellen von Prototypen aus. Was ist der Hauptkompromiss im Vergleich zum Aufbau eines eigenen Pipelines? Man gibt die volle Kontrolle über die Datenerfassung auf, um Geschwindigkeit und Zuverlässigkeit zu erlangen – dabei ersetzt eine strukturierte API Scraper oder mehrere Anbieterintegrationen. Die Grenze, die man berücksichtigen muss, ist die tägliche Obergrenze der kostenlosen Version, sobald man mit dem Prototyping aufhört.