[ blog · use-case ]9 min read

基于 SEC 申报文件构建尽职调查 Agent(10-K、10-Q、8-K、财报)

Sarah Choy发布于 2026年5月3日约 9 分钟阅读
基于 SEC 申报文件构建尽职调查 Agent(10-K、10-Q、8-K、财报)

读一份 10-K,大部分时间不过是在 Ctrl+F。对五十家公司都这么读,那就是一份正经工作了。用一个针对 SEC EDGAR 的搜索-抽取 Agent 替掉无聊的那 80%——把真正重要的那 20% 留给人类分析师。

一句话总结

  • 架构:股票代码查找 → SEC Filings Search(申报文件 + 财报 + 权益统计)→ URL Extract 拉取长段落 → LLM 给出带章节级引用的答案。
  • 成本上限:SEC Filings Search 每次调用 120 credits(约 $0.12);一次典型的三问公司复盘,credit 约 $0.40 + LLM token 约 $0.05。
  • Agent 擅长的部分:事实性查找(分部营收、资本开支趋势、公司治理、逐年的风险因素变化)、高管薪酬概要、近期 8-K 事件。
  • 仍然需要人来做的部分:对管理层质量的判断、市场定位、交易特定问题,以及一切超出申报文件文本之外的内容。

为什么这件事值得自动化

对一家上市公司做一遍初步尽职调查,大部分是机械活儿:拉取最新的 10-K,扫一遍风险因素和 MD&A,查近期的 8-K,瞄一眼最近一次财报电话会议。一名助理级分析师每家公司要花 2–4 小时做这些。其产出鲜有深刻洞见——而是一套结构化的事实图景,再由另一位更资深的人据此推理。

这一步「整理事实图景」恰恰是一个小型 Agent 可以接管的。搜索 SEC、抽取相关段落、带引用地汇总。资深的人仍然负责推理——但他们的起点从 4 小时的阅读变成了 5 分钟。

如今有三件事让这变得可行:

  • 对申报文件的语义搜索意味着你可以直接问「分部营收是怎么变化的」,并从正确的表单里拿回正确的段落,而不必去读 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 credits(约 $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 条(得体地说「我不知道」)正是它与一个会信誓旦旦编数字的聊天机器人之间的区别。

Agent 能干净处理的示例查询

  • 「比较 Apple 过去 5 个财年的服务业务营收趋势。」 → 从相关 10-K 中提取,返回一张带 MD&A 引用的表格。
  • 「NVIDIA 的风险因素在 FY2023 到 FY2025 之间有何变化?」 → 跨文档对比,引用每份表单中的 Item 1A。
  • 「总结 $TICKER 最近 4 份 8-K。」 → 过滤到 8-K 的语义搜索,按申报日期排序。
  • 「在最近一次财报电话会议上,Microsoft 的 CFO 对 AI 资本开支说了什么?」 → 搜索记录、抽取相关的 Q&A 段落、逐字引用。

它的短板——以及该如何把活儿交回给人

Agent 在三个可预见的地方会栽跟头:

  • 对管理层质量的判断。申报文件告诉你他们做了什么,而不是他们是否有能力。别问 Agent 这个。
  • 申报文件之外的同业可比。如果问题是「这个毛利率和同行比怎么样」,Agent 只知道被搜到的申报文件里有什么。要做同业比较,你得要么用一份独立数据集,要么对每家公司各跑一次 Agent 再汇总。
  • 前瞻性表述。申报文件含有前瞻性陈述,但除非另行交代,模型会把它们当作既成事实。请在提示词里加上:「明确标记前瞻性陈述。不要把业绩指引当作事实呈现。」

最小可用实现

研究 Agent 教程里相同的 Claude tool-use 循环模式同样适用——只是工具和系统提示词换了:

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."))

下一步可以往哪里走

  • 可复用复盘模板。把 Agent 包进一个小 CLI,输入一个股票代码,输出固定格式的 markdown 简报:「近期 8-K」「分部营收趋势」「风险因素差异」。同一个 Agent,脚本化的提示词。
  • 关注列表模式。每天早上对某个股票代码跑一次 Agent,把今天的答案和昨天的做差异对比。只呈现增量。这与晨间简报模式配合得很好。
  • 与专利和预测市场结合。对于科技 / 生物科技标的,叠加 Patent Search 跟踪 IP 变化,以及 Prediction Markets 获取群体隐含的结果概率(例如药物获批概率)。

这个模式可以推广。SEC 是我们提供的最密集、最贴合结构化模式(schema-friendly)的语料库——但这个循环(「语义搜索 → URL 抽取 → 带引用作答」)适用于任何你关心的结构化文档语料:法律申报、科研摘要、专利权利要求。先把尽调 Agent 搭起来,再把这套架构横向移植过去。

常见问题

SEC 索引有多新?

申报文件在被 EDGAR 接收后数小时内即被索引。对于 8-K(最具时效性的那类——重大事件、领导层变更、收购),这对于日终工作流通常足够快了。如果你需要在一小时内收到新 8-K 的通知,可把搜索与一个独立的 SEC RSS 源配合使用,只用 Agent 做内容分析、不做事件探测。

它涵盖财报电话会议记录吗?

是的——SEC Filings Search 索引除申报文件本身外,还包含美国的财报电话会议记录以及权益统计(价格 / 成交量、市值历史)。一次语义查询即可从这些来源中任意调取。

如果要做大规模,有哪些控成本的手段?

三个。(1) 先用 Company Facts(2 credits)预筛,确认某个股票代码确实是一家真实的上市公司,再花 120 credits 去做 SEC 搜索。(2) 按 (ticker, quarter) 缓存搜索结果——申报文件只按既定节奏更新。(3) 每个问题用一次宽口径搜索,而不是多次窄搜索;Agent 很擅长跨结果做综合。

Agent 能处理非美国的申报文件吗?

SEC Filings Search 覆盖在美上市公司(10-K、10-Q、8-K)。对于英国公司,请搭配 UK Legal Search 与 Web Search。对于其他司法辖区,则退回到对相关国家监管机构网站(Companies House、SEDAR 等)使用 Web Search + URL Extract。

怎样避免编造数字?

在系统提示词里加三条规则,效果最明显。(1)「数字必须从抽取出的文本中逐字引用——绝不改写或四舍五入。」(2)「始终注明申报表单、财务期间和章节引用。」(3)「如果相关申报文件未被抽取,就明确说明——不要从训练数据推断。」这三条合起来能消除绝大多数编造。

本文涉及的 API

Sarah Choy
作者
Sarah Choy
CEO, API Pick

Sarah Choy 是 API Pick 的 CEO,专注于为 AI Agent 与 LLM 工作流构建可用于生产的 API。