Einen Due-Diligence-Agenten auf SEC-Filings bauen (10-K, 10-Q, 8-K, Earnings)

Ein 10-K zu lesen ist größtenteils Strg+F. Das für fünfzig Unternehmen zu tun, ist ein Vollzeitjob. Ersetze die langweiligen 80 % durch einen Search-and-Extract-Agenten gegen SEC EDGAR — behalte die 20 %, auf die es für den menschlichen Analysten ankommt.
Auf einen Blick
- •Architektur: Ticker-Lookup → SEC Filings Search (Filings + Earnings + Equity-Statistiken) → URL Extract für die langen Passagen → LLM-Antwort mit Zitaten auf Abschnittsebene.
- •Kostenobergrenze: SEC Filings Search kostet 120 Credits pro Aufruf (≈ $0.12); ein typischer Unternehmens-Review mit 3 Fragen kostet ~$0.40 an Credits + ~$0.05 an LLM-Tokens.
- •Was der Agent richtig macht: faktische Lookups (Segmentumsatz, Capex-Trend, Governance, Veränderungen der Risikofaktoren im Jahresvergleich), Zusammenfassungen der Vorstandsvergütung, jüngste 8-K-Ereignisse.
- •Was weiterhin einen Menschen braucht: Ermessensurteile zur Managementqualität, Marktpositionierung, deal-spezifische Fragen, alles außerhalb der Sprache des Filings.
Warum sich das zu automatisieren lohnt
Ein erster Due-Diligence-Durchgang bei einem börsennotierten Unternehmen ist größtenteils mechanisch: das aktuelle 10-K ziehen, die Risikofaktoren und die MD&A scannen, die jüngsten 8-Ks prüfen, einen Blick auf den letzten Earnings Call werfen. Ein Analyst auf Associate-Ebene verbringt damit 2–4 Stunden pro Unternehmen. Das Ergebnis ist selten eine tiefe Erkenntnis — es ist ein strukturiertes Faktenmuster, über das anschließend eine andere, erfahrenere Person nachdenkt.
Genau diesen Faktenmuster-Schritt kann ein kleiner Agent übernehmen. SEC durchsuchen, die relevanten Passagen extrahieren, mit Zitaten zusammenfassen. Die erfahrene Person macht weiterhin das Denken — aber sie startet von einer 5-Minuten-Lektüre statt von einer 4-Stunden-Lektüre.
Drei Dinge machen das jetzt praktikabel:
- Semantische Suche über Filings bedeutet, dass du fragen kannst 'wie hat sich der Segmentumsatz verändert' und den richtigen Absatz aus dem richtigen Formular zurückbekommst, statt 200 Seiten zu lesen.
- Long-Context-LLMs können ein vollständiges 10-K plus ein paar 8-Ks im Arbeitsspeicher halten und dokumentübergreifende Fragen beantworten.
- Zitierdisziplin im Prompt macht den Output in Sekunden überprüfbar — genau das, was Compliance- und Review-Workflows verlangen.
Architektur
question + ticker
│
├─ /api/company/facts (2 credits)
│ ↳ confirm ticker, get CIK and sector
│
├─ /api/search/sec (120 credits)
│ ↳ semantic search across 10-K/10-Q/8-K/earnings/equity stats
│
├─ /api/extract (2 credits per URL)
│ ↳ pull full text of the top 3-5 most relevant filings
│
└─ Claude / GPT-4 with citation-required prompt
↳ "answer + [Form, Fiscal Period, Section]"Kosten pro Einzelfrage: ~130 Credits (~$0.13) an API + ~$0.03 an LLM. Ein Unternehmens-Review mit drei Fragen (Finanztrend, Risikofaktoren-Diff, jüngste wesentliche Ereignisse) landet bei ~$0.45–$0.60. Verglichen mit einer Analystenstunde zu jedem vernünftigen Stundensatz ist die Rechnung offensichtlich.
Der System-Prompt, der sein Geld wert ist
Der einzelne größte Faktor für die Output-Qualität bei Financial RAG ist der System-Prompt. Der, den wir verwenden:
You are a financial research assistant for an investment team. You answer
questions about US public companies using SEC filings, earnings call
transcripts, and equity statistics retrieved by your tools.
Rules — non-negotiable:
1. Cite every numeric claim with: [Form, Fiscal Period, Section]. Example:
"Operating income rose 12% YoY to $4.1B [10-K FY2025, Item 7 MD&A]."
2. Quote numbers verbatim. Do not round, paraphrase, or convert. If a
filing says "$4,127M", do not say "$4.1B" unless the filing itself does.
3. If the answer requires content you have not extracted, say so:
"I could not retrieve the FY2024 10-K for the segment-level breakdown.
Please re-run with that filing in scope."
4. Do not infer from training-data knowledge. If your tools didn't return
it, you don't know it.
5. Default to the most recent fiscal period available. State the period
you used.
6. Format multi-figure answers as a small markdown table with one column
per fiscal period. Always end with a one-line "How I read this" summary.
Tone: precise, terse, no marketing language.Die Regeln 1, 2 und 4 beseitigen zusammen ~90 % der Fabrikationsprobleme, die wir gemessen haben. Regel 3 (das elegante „ich weiß es nicht“) ist das, was dies von einem Chatbot unterscheidet, der selbstbewusst Zahlen erfindet.
Beispielanfragen, die der Agent sauber bewältigt
- 'Vergleiche Apples Services-Umsatztrend über die letzten 5 Geschäftsjahre.' → zieht aus den relevanten 10-Ks, liefert eine Tabelle mit Zitaten zur MD&A.
- 'Was hat sich an NVIDIAs Risikofaktoren zwischen FY2023 und FY2025 geändert?' → dokumentübergreifender Diff, mit Zitat von Item 1A im jeweiligen Formular.
- 'Fasse die letzten 4 8-Ks für $TICKER zusammen.' → semantische Suche, gefiltert auf 8-K, geordnet nach Einreichungsdatum.
- 'Was sagte Microsofts CFO über AI-Capex im jüngsten Earnings Call?' → durchsucht Transcripts, extrahiert die relevante Q&A-Passage, zitiert wortwörtlich.
Wo es an Grenzen stößt — und die richtige Übergabe an den Menschen
Der Agent stolpert an drei vorhersehbaren Stellen:
- Ermessensurteile zur Managementqualität. Das Filing sagt dir, was sie getan haben, nicht ob sie kompetent sind. Frag den Agenten nicht.
- Branchenvergleiche außerhalb des Filings. Lautet die Frage 'wie verhält sich diese Bruttomarge zur Peer-Group', kennt der Agent nur, was in den durchsuchten Filings steht. Für den Peer-Vergleich brauchst du entweder einen separaten Datensatz oder du lässt den Agenten einmal pro Unternehmen laufen und aggregierst.
- Zukunftsgerichtete Aussagen. Filings enthalten zukunftsgerichtete Aussagen, doch das Modell nimmt sie für bare Münze, sofern nicht anders angewiesen. Ergänze den Prompt: 'Kennzeichne zukunftsgerichtete Aussagen explizit. Präsentiere Guidance nicht als Faktum.'
Der minimal lauffähige Build
Dasselbe Claude-Tool-Use-Loop-Muster aus der Research-Agent-Anleitung gilt — nur die Tools und der System-Prompt ändern sich:
from anthropic import Anthropic
import requests
KEY = "pk_yourkey"
client = Anthropic()
def fetch_tool(path: str) -> dict:
return requests.get(f"https://www.apipick.com{path}/tool-schema").json()["claude"]
TOOLS = [
fetch_tool("/api/search/sec"),
fetch_tool("/api/extract"),
fetch_tool("/api/company/facts"),
]
def call_tool(block):
name_to_path = {
"sec_search": "/api/search/sec",
"extract_urls": "/api/extract",
"company_facts": "/api/company/facts",
}
path = name_to_path[block.name]
method = "GET" if block.name == "company_facts" else "POST"
if method == "GET":
resp = requests.get(
f"https://www.apipick.com{path}",
params=block.input,
headers={"x-api-key": KEY},
timeout=30,
)
else:
resp = requests.post(
f"https://www.apipick.com{path}",
json=block.input,
headers={"x-api-key": KEY},
timeout=30,
)
return {
"type": "tool_result",
"tool_use_id": block.id,
"content": resp.text,
"is_error": resp.status_code != 200,
}
def due_dil(question: str) -> str:
messages = [{"role": "user", "content": question}]
while True:
r = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=SYSTEM_PROMPT, # the one above
tools=TOOLS,
messages=messages,
)
messages.append({"role": "assistant", "content": r.content})
if r.stop_reason == "end_turn":
return "\n".join(b.text for b in r.content if b.type == "text")
if r.stop_reason == "tool_use":
results = [call_tool(b) for b in r.content if b.type == "tool_use"]
messages.append({"role": "user", "content": results})
print(due_dil("Compare Snowflake's product revenue YoY for the last 4 quarters."))Wohin man es als Nächstes bringt
- Templates für wiederkehrende Reviews. Umhülle den Agenten mit einem kleinen CLI, das einen Ticker entgegennimmt und ein Markdown-Briefing in festem Format ausgibt: 'Jüngste 8-Ks', 'Segmentumsatz-Trend', 'Risikofaktoren-Delta'. Derselbe Agent, gescriptete Prompts.
- Watchlist-Modus. Lass den Agenten jeden Morgen gegen einen Ticker laufen und vergleiche die heutige Antwort mit der gestrigen. Bringe nur die Deltas an die Oberfläche. Passt gut zum Morning-Briefing-Muster.
- Mit Patenten und Prognosemärkten kombinieren. Bei Tech- / Biotech-Namen lege Patent Search für IP-Änderungen und Prediction Markets für markt-implizite Ergebnisse drauf (z. B. Wahrscheinlichkeit einer Medikamentenzulassung).
Das Muster verallgemeinert sich. SEC ist das dichteste, schema-freundlichste Korpus, das wir ausliefern — aber die Schleife ('semantische Suche → URL Extract → Antwort mit Zitaten') gilt für jedes strukturierte Dokumentenkorpus, das dir wichtig ist: juristische Filings, wissenschaftliche Abstracts, Patentansprüche. Bau zuerst den Diligence-Agenten, dann portiere die Architektur seitwärts.
Häufig gestellte Fragen
Wie aktuell ist der SEC-Index?
Filings werden innerhalb von Stunden nach Annahme durch EDGAR indexiert. Für 8-Ks (die zeitkritischen — wesentliche Ereignisse, Führungswechsel, Übernahmen) ist das in der Regel schnell genug für End-of-Day-Workflows. Brauchst du eine Benachrichtigung über neue 8-Ks in unter einer Stunde, kombiniere die Suche mit einem separaten SEC-RSS-Feed und nutze den Agenten nur für die Inhaltsanalyse, nicht für die Erkennung.
Deckt es Earnings-Call-Transcripts ab?
Ja — der SEC-Filings-Search-Index enthält neben den Filings selbst auch US-Earnings-Call-Transcripts und Equity-Statistiken (Kurs/Volumen, Marktkapitalisierungs-Historie). Eine einzige semantische Query kann aus jeder dieser Quellen ziehen.
Welche Kostenhebel habe ich, wenn ich das skaliert betreibe?
Drei. (1) Vorfiltern über Company Facts (2 Credits), um zu bestätigen, dass ein Ticker ein echtes börsennotiertes Unternehmen ist, bevor du 120 Credits für die SEC-Suche ausgibst. (2) Suchergebnisse nach (Ticker, Quartal) cachen — Filings aktualisieren sich nur planmäßig. (3) Eine breite Suche pro Frage statt vieler enger; der Agent ist gut darin, über Ergebnisse hinweg zu synthetisieren.
Kann der Agent Nicht-US-Filings verarbeiten?
SEC Filings Search deckt US-gelistete Unternehmen ab (10-K, 10-Q, 8-K). Für UK-Unternehmen kombiniere UK Legal Search und Web Search. Für andere Jurisdiktionen greife auf Web Search + URL Extract über die Website der jeweiligen nationalen Aufsichtsbehörde zurück (Companies House, SEDAR usw.).
Wie vermeide ich halluzinierte Zahlen?
Drei Regeln im System-Prompt bewegen am meisten. (1) 'Zitiere Zahlen wortwörtlich aus dem extrahierten Text — niemals paraphrasieren oder runden.' (2) 'Gib stets die Formart des Filings, den Geschäftszeitraum und eine Abschnittsreferenz an.' (3) 'Wurde das relevante Filing nicht extrahiert, sage das explizit — leite nichts aus Trainingsdaten ab.' Diese drei zusammen beseitigen die meiste Fabrikation.
APIs in diesem Artikel
Sarah Choy ist CEO von API Pick. Sie schreibt über produktionsreife APIs für KI-Agenten und LLM-Workflows.