Строим агента для due diligence по отчётности SEC (10-K, 10-Q, 8-K, earnings)

Чтение 10-K — это в основном Ctrl+F. Делать это для пятидесяти компаний — уже работа. Замените скучные 80% агентом search-and-extract поверх SEC EDGAR — оставьте 20% важного человеку-аналитику.
Кратко
- •Архитектура: поиск тикера → SEC Filings Search (отчётность + earnings + статистика по акциям) → URL Extract для длинных фрагментов → ответ LLM с цитатами на уровне разделов.
- •Потолок стоимости: SEC Filings Search — 120 кредитов за вызов (≈$0.12); типичный обзор компании из 3 вопросов стоит ~$0.40 в кредитах + ~$0.05 в токенах LLM.
- •Что агент делает верно: фактологические выборки (выручка по сегментам, тренд капвложений, корпоративное управление, изменения факторов риска год к году), сводки по вознаграждению руководства, недавние события 8-K.
- •Что всё ещё требует человека: оценочные суждения о качестве менеджмента, рыночном позиционировании, специфике сделки — всё, что вне формулировок самой отчётности.
Почему это стоит автоматизировать
Первичный due diligence публичной компании — в основном механика: подтянуть свежий 10-K, просмотреть факторы риска и MD&A, проверить недавние 8-K, заглянуть в последний отчётный звонок. Аналитик уровня associate тратит на это 2–4 часа на компанию. Результат редко бывает глубоким инсайтом — это структурированная фактологическая картина, над которой затем рассуждает кто-то более старший.
Именно этот шаг сбора фактов и может взять на себя небольшой агент. Поиск по SEC, извлечение релевантных фрагментов, сводка с цитатами. Старший сотрудник по-прежнему делает рассуждение — но стартует с 5-минутного чтения вместо 4-часового.
Три вещи делают это практичным уже сейчас:
- Семантический поиск по отчётности означает, что вы можете спросить 'как изменилась выручка по сегментам' и получить нужный абзац из нужной формы, а не читать 200 страниц.
- LLM с длинным контекстом могут держать полный 10-K плюс несколько 8-K в рабочей памяти и отвечать на кросс-документные вопросы.
- Дисциплина цитирования в промпте делает вывод проверяемым за секунды — ровно то, что требуют комплаенс- и ревью-процессы.
Архитектура
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]"Стоимость одного вопроса: ~130 кредитов (~$0.13) на API + ~$0.03 на LLM. Обзор компании из трёх вопросов (финансовый тренд, дифф факторов риска, недавние существенные события) выходит в ~$0.45–$0.60. По сравнению с часом работы аналитика по любой разумной ставке — арифметика очевидна.
Системный промпт, который окупает себя
Главный определяющий фактор качества вывода в финансовом RAG — это системный промпт. Тот, что используем мы:
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.Правила 1, 2 и 4 вместе устраняют ~90% проблем с выдумыванием, которые мы намерили. Правило 3 (изящное 'я не знаю') — это то, что отличает такую систему от чат-бота, который уверенно сочиняет числа.
Примеры запросов, с которыми агент справляется чисто
- 'Сравни тренд выручки сервисов Apple за последние 5 финансовых лет.' → подтягивает из соответствующих 10-K, возвращает таблицу с цитатами на MD&A.
- 'Что изменилось в факторах риска NVIDIA между FY2023 и FY2025?' → кросс-документный дифф со ссылками на Item 1A в каждой форме.
- 'Сделай сводку последних 4 форм 8-K для $TICKER.' → семантический поиск с фильтром по 8-K, упорядоченный по дате подачи.
- 'Что CFO Microsoft сказал о капвложениях в AI на последнем отчётном звонке?' → ищет по транскриптам, извлекает релевантный фрагмент Q&A, цитирует дословно.
Где он буксует — и правильная передача человеку
Агент спотыкается в трёх предсказуемых местах:
- Оценочные суждения о качестве менеджмента. Отчётность говорит, что они сделали, а не способны ли они. Не спрашивайте агента.
- Отраслевые компараблы вне отчётности. Если вопрос 'как эта валовая маржа сравнивается с конкурентами', агент знает только то, что есть в найденных документах. Для сравнения с конкурентами нужен либо отдельный датасет, либо прогон агента по каждой компании с последующей агрегацией.
- Прогнозные комментарии. Отчётность содержит прогнозные заявления, но модель воспринимает их за чистую монету, если не сказать иначе. Добавьте в промпт: 'Явно помечай прогнозные заявления. Не выдавай гайденс за факт.'
Минимально жизнеспособная сборка
Применяется тот же паттерн цикла tool-use на Claude из разбора research-агента — меняются только инструменты и системный промпт:
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."))Куда развивать дальше
- Шаблоны для повторяемых обзоров. Оберните агента в небольшой CLI, который принимает тикер и выдаёт markdown-бриф фиксированного формата: 'Недавние 8-K', 'Тренд выручки по сегментам', 'Дельта факторов риска'. Тот же агент, скриптованные промпты.
- Режим watchlist. Прогоняйте агента по тикеру каждое утро и диффайте сегодняшний ответ против вчерашнего. Показывайте только дельты. Хорошо сочетается с паттерном утреннего брифинга.
- Сочетайте с патентами и рынками предсказаний. Для технологических / биотех-имён добавьте Patent Search для изменений в IP и Prediction Markets для подразумеваемых толпой исходов (например, вероятность одобрения препарата).
Паттерн обобщается. SEC — самый плотный и схема-дружелюбный корпус, который мы поставляем, но цикл ('семантический поиск → URL extract → ответ с цитатами') применим к любому корпусу структурированных документов, который вам важен: юридическая отчётность, научные аннотации, патентные притязания. Сначала постройте агента для due diligence, затем перенесите архитектуру вбок.
Часто задаваемые вопросы
Насколько свежий индекс SEC?
Документы индексируются в течение часов после того, как их принимает EDGAR. Для 8-K (срочных — существенные события, смена руководства, поглощения) этого обычно достаточно для рабочих процессов в пределах дня. Если нужно уведомление о новых 8-K быстрее чем за час, свяжите поиск с отдельным RSS-фидом SEC и используйте агента только для анализа содержимого, а не для детектирования.
Покрывает ли он транскрипты отчётных звонков?
Да — индекс SEC Filings Search включает транскрипты earnings call США и статистику по акциям (цена/объём, история рыночной капитализации) наряду с самой отчётностью. Один семантический запрос может подтянуть данные из любого из этих источников.
Какие рычаги стоимости есть, если делать это на масштабе?
Три. (1) Предварительная фильтрация через Company Facts (2 кредита), чтобы подтвердить, что тикер — реальная публичная компания, прежде чем тратить 120 кредитов на поиск SEC. (2) Кэшируйте результаты поиска по (тикер, квартал) — отчётность обновляется только по графику. (3) Делайте один широкий поиск на вопрос вместо множества узких; агент хорошо синтезирует по нескольким результатам.
Может ли агент работать с не-американской отчётностью?
SEC Filings Search покрывает компании, листингованные в США (10-K, 10-Q, 8-K). Для компаний из UK свяжите UK Legal Search и Web Search. Для других юрисдикций откатывайтесь на Web Search + URL Extract по сайту соответствующего национального регулятора (Companies House, SEDAR и т. д.).
Как избежать галлюцинированных чисел?
Три правила в системном промпте дают наибольший эффект. (1) 'Цитируй числа дословно из извлечённого текста — никогда не перефразируй и не округляй.' (2) 'Всегда указывай форму отчёта, финансовый период и ссылку на раздел.' (3) 'Если нужный документ не был извлечён, скажи об этом прямо — не выводи из обучающих данных.' Эти три вместе убирают большую часть выдумывания.
API, использованные в статье
Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.