Construire un agent de due diligence sur les filings SEC (10-K, 10-Q, 8-K, résultats)

Lire un 10-K, c'est surtout du Ctrl+F. Le faire pour cinquante sociétés, c'est un métier. Remplacez les 80 % rébarbatifs par un agent search-and-extract sur SEC EDGAR — gardez les 20 % qui comptent pour l'analyste humain.
L'essentiel
- •Architecture : recherche de ticker → SEC Filings Search (filings + résultats + statistiques actions) → URL Extract pour les longs passages → réponse du LLM avec citations au niveau de la section.
- •Plafond de coût : SEC Filings Search coûte 120 crédits par appel (≈ $0.12) ; une revue type d'une société en 3 questions coûte ~$0.40 de crédits + ~$0.05 de tokens LLM.
- •Ce que l'agent réussit : les lookups factuels (revenus par segment, tendance du capex, gouvernance, évolution des facteurs de risque d'une année sur l'autre), les résumés de rémunération des dirigeants, les événements 8-K récents.
- •Ce qui réclame encore un humain : les jugements sur la qualité du management, le positionnement marché, les enjeux propres à une transaction, tout ce qui sort du langage du filing.
Pourquoi ça vaut la peine de l'automatiser
Une lecture de due diligence de premier passage sur une société cotée est surtout mécanique : récupérer le dernier 10-K, parcourir les facteurs de risque et la MD&A, vérifier les 8-K récents, jeter un œil au dernier earnings call. Un analyste de niveau associate y passe 2 à 4 heures par société. Le résultat est rarement une analyse profonde — c'est un schéma de faits structuré sur lequel une autre personne, plus senior, raisonne ensuite.
Cette étape de schéma de faits est exactement ce qu'un petit agent peut prendre en charge. Chercher dans SEC, extraire les passages pertinents, résumer avec citations. La personne senior fait toujours le raisonnement — mais elle part d'une lecture de 5 minutes au lieu de 4 heures.
Trois choses rendent cela praticable aujourd'hui :
- La recherche sémantique sur les filings permet de demander « comment a évolué le revenu par segment » et de récupérer le bon paragraphe dans le bon formulaire, au lieu de lire 200 pages.
- Les LLM à long contexte peuvent garder un 10-K complet plus quelques 8-K en mémoire de travail et répondre à des questions transversales aux documents.
- La discipline de citation dans le prompt rend la sortie vérifiable en quelques secondes — exactement ce qu'exigent les workflows de conformité et de revue.
Architecture
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]"Coût d'une question unique : ~130 crédits (~$0.13) d'API + ~$0.03 de LLM. Une revue d'entreprise en trois questions (tendance financière, diff des facteurs de risque, événements matériels récents) atterrit à ~$0.45–$0.60. Comparé à une heure d'analyste à n'importe quel taux de facturation raisonnable, le calcul est évident.
Le system prompt qui gagne sa place
Le facteur déterminant le plus important de la qualité de sortie en RAG financier est le system prompt. Celui que nous utilisons :
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.À elles trois, les règles 1, 2 et 4 éliminent ~90 % des problèmes de fabrication que nous avons mesurés. La règle 3 (un « je ne sais pas » gracieux) est ce qui distingue ceci d'un chatbot qui invente des chiffres avec aplomb.
Exemples de requêtes que l'agent traite proprement
- « Compare la tendance des revenus services d'Apple sur les 5 derniers exercices fiscaux. » → puise dans les 10-K pertinents, renvoie un tableau avec citations vers la MD&A.
- « Qu'est-ce qui a changé dans les facteurs de risque de NVIDIA entre l'exercice 2023 et l'exercice 2025 ? » → diff transversal aux documents, en citant l'Item 1A de chaque formulaire.
- « Résume les 4 derniers 8-K de $TICKER. » → recherche sémantique filtrée sur 8-K, ordonnée par date de filing.
- « Qu'a dit le CFO de Microsoft à propos du capex IA lors du dernier earnings call ? » → cherche dans les transcripts, extrait le passage Q&R pertinent, cite mot pour mot.
Là où il pèche — et le bon relais vers l'humain
L'agent trébuche à trois endroits prévisibles :
- Les jugements sur la qualité du management. Le filing vous dit ce qu'ils ont fait, pas s'ils en sont capables. Ne posez pas la question à l'agent.
- Les comparables sectoriels hors du filing. Si la question est « comment cette marge brute se compare-t-elle aux pairs », l'agent ne connaît que ce qui figure dans les filings recherchés. Pour une comparaison de pairs, il vous faut soit un dataset séparé, soit faire tourner l'agent une fois par société et agréger.
- Les commentaires prospectifs. Les filings contiennent des forward-looking statements mais le modèle les prend au pied de la lettre sauf instruction contraire. Ajoutez au prompt : « Signale explicitement les forward-looking statements. Ne présente pas les prévisions comme des faits. »
Le build minimal viable
Le même pattern de boucle de tool use Claude du guide de l'agent de recherche s'applique — seuls les outils et le system prompt changent :
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."))Où l'emmener ensuite
- Des templates pour des revues répétables. Enveloppez l'agent dans un petit CLI qui prend un ticker et émet un brief markdown au format fixe : « 8-K récents », « Tendance du revenu par segment », « Delta des facteurs de risque ». Même agent, prompts scriptés.
- Mode watchlist. Faites tourner l'agent sur un ticker chaque matin et faites le diff de la réponse du jour avec celle de la veille. Ne faites remonter que les deltas. Se marie bien avec le pattern de briefing matinal.
- Combinez avec brevets et marchés de prédiction. Pour les valeurs tech / biotech, ajoutez Patent Search pour les évolutions de PI et Prediction Markets pour les issues implicites de la foule (par ex. la probabilité d'approbation d'un médicament).
Le pattern se généralise. SEC est le corpus le plus dense et le plus schema-friendly que nous livrons — mais la boucle (« recherche sémantique → URL extract → réponse avec citations ») s'applique à tout corpus de documents structurés qui vous intéresse : dépôts juridiques, résumés scientifiques, revendications de brevets. Construisez d'abord l'agent de diligence, puis portez l'architecture latéralement.
Questions fréquentes
Quelle est la fraîcheur de l'index SEC ?
Les filings sont indexés dans les heures suivant leur acceptation par EDGAR. Pour les 8-K (les plus sensibles au temps — événements matériels, changements de direction, acquisitions), c'est généralement assez rapide pour des workflows en fin de journée. Si vous avez besoin d'une notification en moins d'une heure des nouveaux 8-K, couplez la recherche à un flux RSS SEC séparé et n'utilisez l'agent que pour l'analyse de contenu, pas pour la détection.
Couvre-t-il les transcripts des earnings calls ?
Oui — l'index SEC Filings Search inclut les transcripts d'earnings calls américains et les statistiques actions (cours/volume, historique de capitalisation) aux côtés des filings eux-mêmes. Une seule requête sémantique peut puiser dans n'importe laquelle de ces sources.
Quels sont les leviers de coût si je fais ça à grande échelle ?
Trois. (1) Pré-filtrez via Company Facts (2 crédits) pour confirmer qu'un ticker correspond à une vraie société cotée avant de dépenser 120 crédits sur une recherche SEC. (2) Mettez en cache les résultats de recherche par (ticker, trimestre) — les filings ne se mettent à jour qu'à échéance fixe. (3) Faites une recherche large par question plutôt que plusieurs étroites ; l'agent est bon pour synthétiser à travers les résultats.
L'agent gère-t-il les filings hors États-Unis ?
SEC Filings Search couvre les sociétés cotées aux États-Unis (10-K, 10-Q, 8-K). Pour les sociétés britanniques, couplez UK Legal Search et Web Search. Pour d'autres juridictions, repliez-vous sur Web Search + URL Extract sur le site du régulateur national concerné (Companies House, SEDAR, etc.).
Comment éviter les chiffres hallucinés ?
Trois règles dans le system prompt font le plus de différence. (1) « Cite les chiffres mot pour mot depuis le texte extrait — ne jamais paraphraser ni arrondir. » (2) « Indique toujours le formulaire du filing, la période fiscale et une référence de section. » (3) « Si le filing pertinent n'a pas été extrait, dis-le explicitement — ne déduis pas à partir des données d'entraînement. » Ces trois-là ensemble suppriment l'essentiel de la fabrication.
APIs utilisées dans cet article
Sarah Choy est CEO d'API Pick. Elle écrit sur la création d'APIs prêtes pour la production destinées aux agents IA et aux workflows LLM.