Membangun Agen Due Diligence atas Filing SEC (10-K, 10-Q, 8-K, Earnings)

Membaca 10-K sebagian besar adalah Ctrl+F. Melakukannya untuk lima puluh perusahaan adalah sebuah pekerjaan. Gantikan 80% yang membosankan dengan agen search-and-extract terhadap SEC EDGAR — dan pertahankan 20% yang penting bagi analis manusia.
TL;DR
- •Arsitektur: lookup ticker → SEC Filings Search (filing + earnings + statistik equity) → URL Extract untuk bagian-bagian panjang → jawaban LLM dengan kutipan tingkat-bagian.
- •Plafon biaya: SEC Filings Search adalah 120 credits per panggilan (≈$0,12); tinjauan perusahaan 3-pertanyaan biasa menghabiskan ~$0,40 credits + ~$0,05 token LLM.
- •Yang dikerjakan agen dengan benar: lookup faktual (pendapatan per segmen, tren capex, tata kelola, perubahan faktor risiko tahun-ke-tahun), ringkasan kompensasi eksekutif, peristiwa 8-K terbaru.
- •Yang masih membutuhkan manusia: penilaian atas kualitas manajemen, posisi pasar, isu spesifik kesepakatan, segala hal di luar bahasa filing.
Mengapa ini layak diotomatiskan
Pembacaan due diligence tahap pertama atas perusahaan publik sebagian besar bersifat mekanis: menarik 10-K terbaru, memindai faktor risiko dan MD&A, memeriksa 8-K terkini, melirik earnings call paling baru. Seorang analis level associate menghabiskan 2–4 jam untuk ini per perusahaan. Hasilnya jarang berupa wawasan mendalam — itu adalah pola fakta terstruktur yang kemudian dipikirkan oleh orang lain yang lebih senior.
Langkah pola-fakta itulah yang persis bisa diambil alih oleh agen kecil. Cari di SEC, ekstrak bagian yang relevan, ringkas dengan kutipan. Orang senior tetap melakukan penalaran — tetapi mereka mulai dari bacaan 5 menit alih-alih 4 jam.
Tiga hal yang membuat ini praktis sekarang:
- Pencarian semantik atas filing berarti Anda bisa bertanya 'bagaimana pendapatan per segmen berubah' dan mendapatkan kembali paragraf yang tepat dari formulir yang tepat, alih-alih membaca 200 halaman.
- LLM konteks panjang dapat menampung satu 10-K penuh ditambah beberapa 8-K dalam memori kerja dan menjawab pertanyaan lintas-dokumen.
- Disiplin kutipan dalam prompt membuat keluaran bisa diverifikasi dalam hitungan detik — persis yang dibutuhkan alur kerja compliance dan tinjauan.
Arsitektur
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]"Biaya pertanyaan tunggal: ~130 credits (~$0,13) API + ~$0,03 LLM. Tinjauan perusahaan tiga-pertanyaan (tren finansial, diff faktor risiko, peristiwa material terkini) jatuh di ~$0,45–$0,60. Dibandingkan satu jam analis pada tarif tagihan yang masuk akal mana pun, hitungannya sudah jelas.
System prompt yang membayar dirinya sendiri
Penentu terbesar kualitas keluaran pada RAG finansial adalah system prompt. Yang kami gunakan:
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.Aturan 1, 2, dan 4 bersama-sama menghilangkan ~90% masalah pemalsuan yang telah kami ukur. Aturan 3 (sikap "saya tidak tahu" yang anggun) adalah yang memisahkan ini dari chatbot yang dengan percaya diri mengarang angka.
Contoh query yang ditangani agen dengan rapi
- 'Bandingkan tren pendapatan layanan Apple selama 5 tahun fiskal terakhir.' → menarik dari 10-K yang relevan, mengembalikan tabel dengan kutipan ke MD&A.
- 'Apa yang berubah pada faktor risiko NVIDIA antara FY2023 dan FY2025?' → diff lintas-dokumen, mengutip Item 1A di tiap formulir.
- 'Ringkas 4 8-K terakhir untuk $TICKER.' → pencarian semantik difilter ke 8-K, diurutkan berdasarkan tanggal filing.
- 'Apa yang dikatakan CFO Microsoft tentang capex AI pada earnings call terbaru?' → mencari di transkrip, mengekstrak bagian Q&A yang relevan, mengutip secara verbatim.
Di mana ia kurang — dan serah terima ke manusia yang tepat
Agen tersandung di tiga tempat yang bisa diprediksi:
- Penilaian atas kualitas manajemen. Filing memberitahu Anda apa yang mereka lakukan, bukan apakah mereka mumpuni. Jangan tanya agen.
- Komparabel industri di luar filing. Jika pertanyaannya 'bagaimana gross margin ini dibandingkan dengan peer', agen hanya tahu apa yang ada di filing yang dicari. Untuk perbandingan peer Anda butuh dataset terpisah atau menjalankan agen sekali per perusahaan lalu menggabungkannya.
- Komentar berwawasan ke depan. Filing memuat forward-looking statements tetapi model memperlakukannya begitu saja kecuali diberitahu sebaliknya. Tambahkan ke prompt: 'Tandai forward-looking statements secara eksplisit. Jangan menyajikan guidance sebagai fakta.'
Build minimum yang layak
Pola loop tool-use Claude yang sama dari panduan research-agent berlaku — hanya tools dan system prompt yang berubah:
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."))Ke mana mengembangkannya selanjutnya
- Template untuk tinjauan yang berulang. Bungkus agen dalam CLI kecil yang menerima sebuah ticker dan menghasilkan brief markdown berformat tetap: '8-K Terkini', 'Tren pendapatan per segmen', 'Delta faktor risiko'. Agen yang sama, prompt yang di-script.
- Mode watchlist. Jalankan agen terhadap sebuah ticker setiap pagi dan buat diff jawaban hari ini terhadap kemarin. Munculkan hanya deltanya. Cocok dipadukan dengan pola morning-briefing.
- Gabungkan dengan paten dan prediction markets. Untuk nama tech / biotech, lapisi dengan Patent Search untuk perubahan IP dan Prediction Markets untuk hasil yang tersirat dari kerumunan (mis. probabilitas persetujuan obat).
Polanya tergeneralisasi. SEC adalah korpus terpadat dan paling schema-friendly yang kami sediakan — tetapi loop ('pencarian semantik → ekstraksi URL → jawaban dengan kutipan') berlaku untuk korpus dokumen terstruktur mana pun yang Anda pedulikan: filing hukum, abstrak ilmiah, klaim paten. Bangun agen diligence terlebih dahulu, lalu pindahkan arsitekturnya ke samping.
Pertanyaan yang Sering Diajukan
Seberapa baru indeks SEC-nya?
Filing diindeks dalam hitungan jam setelah diterima oleh EDGAR. Untuk 8-K (yang sensitif waktu — peristiwa material, perubahan kepemimpinan, akuisisi), ini biasanya cukup cepat untuk alur kerja akhir hari. Jika Anda perlu notifikasi 8-K baru dalam kurang dari satu jam, padukan pencarian dengan feed RSS SEC terpisah dan gunakan agen hanya untuk analisis konten, bukan deteksi.
Apakah ini mencakup transkrip earnings call?
Ya — indeks SEC Filings Search mencakup transkrip earnings call AS dan statistik equity (harga/volume, riwayat kapitalisasi pasar) bersama filing itu sendiri. Satu query semantik bisa menarik dari mana pun di antara sumber-sumber ini.
Apa saja tuas biaya jika saya melakukannya dalam skala besar?
Tiga. (1) Pra-saring lewat Company Facts (2 credits) untuk memastikan sebuah ticker adalah perusahaan publik nyata sebelum menghabiskan 120 credits pada pencarian SEC. (2) Cache hasil pencarian berdasarkan (ticker, kuartal) — filing hanya diperbarui sesuai jadwalnya. (3) Gunakan satu pencarian luas per pertanyaan alih-alih banyak pencarian sempit; agen pandai menyintesis lintas hasil.
Bisakah agen menangani filing non-AS?
SEC Filings Search mencakup perusahaan yang tercatat di AS (10-K, 10-Q, 8-K). Untuk perusahaan Inggris, padukan UK Legal Search dan Web Search. Untuk yurisdiksi lain, gunakan Web Search + URL Extract atas situs regulator nasional yang relevan (Companies House, SEDAR, dll.).
Bagaimana cara menghindari angka halusinasi?
Tiga aturan dalam system prompt yang paling menggerakkan jarum. (1) 'Kutip angka secara verbatim dari teks yang diekstrak — jangan pernah memparafrasakan atau membulatkan.' (2) 'Selalu sertakan formulir filing, periode fiskal, dan referensi bagian.' (3) 'Jika filing relevan tidak diekstrak, katakan secara eksplisit — jangan menyimpulkan dari data pelatihan.' Ketiganya bersama-sama menghapus sebagian besar pemalsuan.
API yang digunakan dalam artikel ini
Sarah Choy adalah CEO API Pick. Ia menulis tentang membangun API siap produksi untuk AI agent dan alur kerja LLM.