Como construir um agente de due diligence sobre filings da SEC (10-K, 10-Q, 8-K, resultados)

Ler um 10-K é basicamente Ctrl+F. Fazer isso para cinquenta empresas é um trabalho. Substitua os 80% chatos por um agente de busca-e-extração contra a SEC EDGAR — e preserve os 20% que importam para o analista humano.
TL;DR
- •Arquitetura: lookup de ticker → SEC Filings Search (filings + resultados + estatísticas de equity) → URL Extract para os trechos longos → resposta do LLM com citações em nível de seção.
- •Teto de custo: o SEC Filings Search custa 120 créditos por chamada (≈US$ 0,12); uma revisão típica de empresa com 3 perguntas custa ~US$ 0,40 em créditos + ~US$ 0,05 em tokens de LLM.
- •No que o agente acerta: lookups factuais (receita por segmento, tendência de capex, governança, mudanças ano a ano nos fatores de risco), resumos de remuneração de executivos, eventos recentes de 8-K.
- •O que ainda precisa de um humano: julgamentos sobre a qualidade do management, posicionamento de mercado, questões específicas da operação, qualquer coisa fora da linguagem do filing.
Por que vale a pena automatizar isso
Uma primeira leitura de due diligence sobre uma empresa de capital aberto é, em sua maior parte, mecânica: trazer o último 10-K, percorrer os fatores de risco e o MD&A, revisar os 8-K recentes, dar uma olhada na earnings call mais recente. Um analista de nível associate gasta de 2 a 4 horas nisso por empresa. O resultado raramente é um insight profundo — é um padrão estruturado de fatos sobre o qual outra pessoa, mais sênior, depois raciocina.
Esse passo do "padrão de fatos" é exatamente o que um pequeno agente pode assumir. Busque na SEC, extraia os trechos relevantes, resuma com citações. A pessoa sênior continua fazendo o raciocínio — mas parte de uma leitura de 5 minutos em vez de uma de 4 horas.
Três coisas tornam isso prático agora:
- A busca semântica sobre filings permite perguntar 'como a receita por segmento mudou' e receber de volta o parágrafo certo do formulário certo, em vez de ler 200 páginas.
- Os LLMs de contexto longo conseguem manter um 10-K completo mais alguns 8-K na memória de trabalho e responder a perguntas que cruzam documentos.
- A disciplina de citação no prompt torna a saída verificável em segundos — exatamente o que os fluxos de compliance e revisão exigem.
Arquitetura
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]"Custo de uma única pergunta: ~130 créditos (~US$ 0,13) de API + ~US$ 0,03 de LLM. Uma revisão de empresa com três perguntas (tendência financeira, diff de fatores de risco, eventos materiais recentes) fica em ~US$ 0,45–US$ 0,60. Comparado a uma hora de analista a qualquer taxa de faturamento razoável, a conta é óbvia.
O system prompt que vale o salário
O fator que mais determina a qualidade da saída em RAG financeiro é, de longe, o system prompt. O que usamos:
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.As regras 1, 2 e 4 juntas eliminam ~90% dos problemas de fabricação que medimos. A regra 3 (o "não sei" elegante) é o que separa isso de um chatbot que inventa números com toda a confiança.
Consultas de exemplo que o agente resolve com limpeza
- 'Compare a tendência da receita de serviços da Apple ao longo dos últimos 5 exercícios fiscais.' → puxa dos 10-K relevantes, devolve uma tabela com citações ao MD&A.
- 'O que mudou nos fatores de risco da NVIDIA entre o FY2023 e o FY2025?' → diff entre documentos, citando o Item 1A em cada formulário.
- 'Resuma os últimos 4 8-K de $TICKER.' → busca semântica filtrada para 8-K, ordenada por data de filing.
- 'O que o CFO da Microsoft disse sobre o capex em IA na última earnings call?' → busca nas transcrições, extrai o trecho de Q&A relevante, cita literalmente.
Onde ele fica aquém — e o handoff correto para o humano
O agente tropeça em três lugares previsíveis:
- Julgamentos sobre a qualidade do management. O filing diz o que eles fizeram, não se são capazes. Não pergunte ao agente.
- Comparáveis da indústria fora do filing. Se a pergunta é 'como esta margem bruta se compara à dos peers', o agente só conhece o que está nos filings buscados. Para comparar com peers você precisa de um dataset à parte ou de rodar o agente uma vez por empresa e agregar.
- Comentários prospectivos. Os filings contêm forward-looking statements, mas o modelo os toma ao pé da letra a menos que seja instruído do contrário. Acrescente ao prompt: 'Sinalize explicitamente os forward-looking statements. Não apresente o guidance como fato.'
O build mínimo viável
Aplica-se o mesmo padrão de loop de tool-use do Claude do tutorial do agente de research — só mudam as ferramentas e o system prompt:
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."))Para onde levar isso depois
- Templates para revisões repetíveis. Envolva o agente numa pequena CLI que recebe um ticker e emite um brief em markdown de formato fixo: 'Últimos 8-K', 'Tendência de receita por segmento', 'Delta de fatores de risco'. Mesmo agente, prompts roteirizados.
- Modo watchlist. Rode o agente contra um ticker toda manhã e faça um diff da resposta de hoje contra a de ontem. Traga à tona apenas os deltas. Combina bem com o padrão de briefing matinal.
- Combine com patentes e mercados de previsão. Para nomes de tech / biotech, acrescente Patent Search para as mudanças de IP e Prediction Markets para os desfechos implícitos pela multidão (p. ex. a probabilidade de aprovação de um medicamento).
O padrão generaliza. A SEC é o corpus mais denso e schema-friendly que servimos — mas o loop ('busca semântica → extração de URL → resposta com citações') se aplica a qualquer corpus de documentos estruturados que importe a você: filings jurídicos, abstracts científicos, reivindicações de patentes. Construa primeiro o agente de diligence e depois porte a arquitetura para o lado.
Perguntas Frequentes
Quão atualizado está o índice da SEC?
Os filings são indexados poucas horas depois de serem aceitos pela EDGAR. Para os 8-K (os sensíveis ao tempo — eventos materiais, mudanças de liderança, aquisições), isso costuma ser rápido o suficiente para fluxos de fechamento de jornada. Se você precisa de notificação de novos 8-K em menos de uma hora, combine a busca com um feed RSS da SEC à parte e use o agente apenas para a análise de conteúdo, não para a detecção.
Ele cobre as transcrições das earnings calls?
Sim — o índice do SEC Filings Search inclui as transcrições das earnings calls dos EUA e estatísticas de equity (preço/volume, histórico de capitalização de mercado) junto com os próprios filings. Uma única query semântica pode puxar de qualquer uma dessas fontes.
Quais são as alavancas de custo se eu fizer isso em escala?
Três. (1) Pré-filtre com Company Facts (2 créditos) para confirmar que um ticker é uma empresa de capital aberto real antes de gastar 120 créditos numa busca da SEC. (2) Faça cache dos resultados de busca por (ticker, trimestre) — os filings só atualizam no calendário deles. (3) Use uma busca ampla por pergunta em vez de muitas estreitas; o agente é bom em sintetizar entre resultados.
O agente lida com filings de fora dos EUA?
O SEC Filings Search cobre empresas listadas nos EUA (10-K, 10-Q, 8-K). Para empresas do Reino Unido, combine UK Legal Search e Web Search. Para outras jurisdições, recorra a Web Search + URL Extract sobre o site do regulador nacional correspondente (Companies House, SEDAR, etc.).
Como evito números alucinados?
Três regras no system prompt são as que mais movem a agulha. (1) 'Cite os números literalmente do texto extraído — nunca parafraseie nem arredonde.' (2) 'Inclua sempre o formulário do filing, o período fiscal e uma referência de seção.' (3) 'Se o filing relevante não foi extraído, diga isso explicitamente — não infira a partir dos dados de treinamento.' Essas três juntas eliminam a maior parte das fabricações.
APIs usadas neste artigo
Sarah Choy é a CEO da API Pick. Ela escreve sobre a construção de APIs prontas para produção para agentes de IA e fluxos de trabalho com LLMs.