Cómo construir un agente de due diligence sobre filings de la SEC (10-K, 10-Q, 8-K, resultados)

Leer un 10-K es básicamente Ctrl+F. Hacerlo para cincuenta empresas es un trabajo. Reemplaza el 80% aburrido con un agente de búsqueda-y-extracción contra SEC EDGAR — y conserva el 20% que importa para el analista humano.
Resumen
- •Arquitectura: lookup de ticker → SEC Filings Search (filings + resultados + estadísticas de equity) → URL Extract para los pasajes largos → respuesta del LLM con citas a nivel de sección.
- •Techo de coste: SEC Filings Search son 120 créditos por llamada (≈$0.12); una revisión típica de empresa de 3 preguntas cuesta ~$0.40 en créditos + ~$0.05 en tokens de LLM.
- •En lo que acierta el agente: lookups factuales (ingresos por segmento, tendencia de capex, gobernanza, cambios año contra año en los factores de riesgo), resúmenes de retribución de directivos, eventos recientes de 8-K.
- •Lo que todavía necesita a un humano: juicios sobre la calidad del management, el posicionamiento de mercado, cuestiones específicas de la operación, cualquier cosa fuera del lenguaje del filing.
Por qué merece la pena automatizar esto
Una primera lectura de due diligence sobre una empresa cotizada es en su mayor parte mecánica: traer el último 10-K, repasar los factores de riesgo y el MD&A, revisar los 8-K recientes, echar un vistazo a la earnings call más reciente. Un analista de nivel associate dedica 2–4 horas a esto por empresa. El resultado rara vez es una idea profunda — es un patrón estructurado de hechos sobre el que después razona otra persona más senior.
Ese paso de "patrón de hechos" es exactamente lo que un agente pequeño puede asumir. Busca en la SEC, extrae los pasajes relevantes, resume con citas. La persona senior sigue haciendo el razonamiento — pero arranca desde una lectura de 5 minutos en lugar de una de 4 horas.
Tres cosas hacen esto práctico ahora:
- La búsqueda semántica sobre filings permite preguntar 'cómo cambiaron los ingresos por segmento' y recibir de vuelta el párrafo correcto del formulario correcto, en lugar de leer 200 páginas.
- Los LLM de contexto largo pueden mantener un 10-K completo más unos cuantos 8-K en memoria de trabajo y responder preguntas que cruzan documentos.
- La disciplina de citación en el prompt hace que la salida sea verificable en segundos — exactamente lo que requieren los flujos de compliance y revisión.
Arquitectura
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]"Coste de una sola pregunta: ~130 créditos (~$0.13) de API + ~$0.03 de LLM. Una revisión de empresa de tres preguntas (tendencia financiera, diff de factores de riesgo, eventos materiales recientes) cae en ~$0.45–$0.60. Comparado con una hora de analista a cualquier tarifa razonable de facturación, las cuentas son obvias.
El system prompt que se gana el sueldo
El factor que más determina la calidad de la salida en RAG financiero es, con diferencia, el system prompt. El 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.Las reglas 1, 2 y 4 entre ellas eliminan ~90% de los problemas de fabricación que hemos medido. La regla 3 (el "no lo sé" elegante) es lo que separa esto de un chatbot que se inventa cifras con aplomo.
Consultas de ejemplo que el agente resuelve limpiamente
- 'Compara la tendencia de ingresos por servicios de Apple en los últimos 5 ejercicios fiscales.' → tira de los 10-K relevantes, devuelve una tabla con citas al MD&A.
- '¿Qué cambió en los factores de riesgo de NVIDIA entre el FY2023 y el FY2025?' → diff entre documentos, citando el Item 1A en cada formulario.
- 'Resume los últimos 4 8-K de $TICKER.' → búsqueda semántica filtrada a 8-K, ordenada por fecha de filing.
- '¿Qué dijo el CFO de Microsoft sobre el capex en IA en la última earnings call?' → busca en las transcripciones, extrae el pasaje de Q&A relevante, lo cita textualmente.
Dónde se queda corto — y el traspaso correcto al humano
El agente tropieza en tres sitios predecibles:
- Juicios sobre la calidad del management. El filing te dice qué hicieron, no si son capaces. No se lo preguntes al agente.
- Comparables de la industria fuera del filing. Si la pregunta es 'cómo se compara este margen bruto con los peers', el agente solo conoce lo que hay en los filings buscados. Para comparar con peers necesitas o bien un dataset aparte o bien correr el agente una vez por empresa y agregar.
- Comentarios prospectivos. Los filings contienen forward-looking statements, pero el modelo los toma al pie de la letra salvo que se le indique lo contrario. Añade al prompt: 'Señala explícitamente los forward-looking statements. No presentes el guidance como un hecho.'
El build mínimo viable
Aplica el mismo patrón de bucle de tool-use de Claude del tutorial del agente de research — solo cambian las herramientas y el 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."))Por dónde seguir
- Plantillas para revisiones repetibles. Envuelve el agente en una pequeña CLI que recibe un ticker y emite un brief en markdown de formato fijo: 'Últimos 8-K', 'Tendencia de ingresos por segmento', 'Delta de factores de riesgo'. Mismo agente, prompts scriptados.
- Modo watchlist. Corre el agente contra un ticker cada mañana y haz un diff de la respuesta de hoy contra la de ayer. Saca a la superficie solo los deltas. Encaja bien con el patrón de briefing matutino.
- Combínalo con patentes y mercados de predicción. Para nombres de tech / biotech, añade Patent Search para los cambios de IP y Prediction Markets para los desenlaces implícitos por la multitud (p. ej. la probabilidad de aprobación de un fármaco).
El patrón generaliza. La SEC es el corpus más denso y schema-friendly que servimos — pero el bucle ('búsqueda semántica → extracción de URL → respuesta con citas') aplica a cualquier corpus de documentos estructurados que te importe: filings legales, abstracts científicos, reivindicaciones de patentes. Construye primero el agente de diligence y luego porta la arquitectura de lado.
Preguntas frecuentes
¿Cómo de fresco está el índice de la SEC?
Los filings se indexan a las pocas horas de ser aceptados por EDGAR. Para los 8-K (los sensibles al tiempo — eventos materiales, cambios de liderazgo, adquisiciones), esto suele ser suficientemente rápido para flujos de cierre de jornada. Si necesitas notificación de nuevos 8-K en menos de una hora, combina la búsqueda con un feed RSS de la SEC aparte y usa el agente solo para el análisis de contenido, no para la detección.
¿Cubre las transcripciones de las earnings calls?
Sí — el índice de SEC Filings Search incluye las transcripciones de earnings calls de EE. UU. y estadísticas de equity (precio/volumen, histórico de capitalización) junto con los propios filings. Una sola query semántica puede tirar de cualquiera de estas fuentes.
¿Cuáles son las palancas de coste si hago esto a escala?
Tres. (1) Prefiltra con Company Facts (2 créditos) para confirmar que un ticker es una empresa cotizada real antes de gastar 120 créditos en una búsqueda de la SEC. (2) Cachea los resultados de búsqueda por (ticker, trimestre) — los filings solo se actualizan en su calendario. (3) Usa una búsqueda amplia por pregunta en lugar de muchas estrechas; el agente es bueno sintetizando entre resultados.
¿Puede el agente con filings no estadounidenses?
SEC Filings Search cubre empresas cotizadas en EE. UU. (10-K, 10-Q, 8-K). Para empresas del Reino Unido, combina UK Legal Search y Web Search. Para otras jurisdicciones, recurre a Web Search + URL Extract sobre el sitio del regulador nacional correspondiente (Companies House, SEDAR, etc.).
¿Cómo evito cifras alucinadas?
Tres reglas en el system prompt son las que más mueven la aguja. (1) 'Cita las cifras textualmente del texto extraído — nunca parafrasees ni redondees.' (2) 'Incluye siempre el formulario del filing, el periodo fiscal y una referencia de sección.' (3) 'Si el filing relevante no se extrajo, dilo explícitamente — no infieras a partir de los datos de entrenamiento.' Estas tres juntas eliminan la mayor parte de las fabricaciones.
APIs usadas en este artículo
Sarah Choy es la CEO de API Pick. Escribe sobre cómo construir APIs listas para producción para agentes de IA y flujos de trabajo con LLMs.