[ blog · use-case ]9 min read

SEC Dosyaları (10-K, 10-Q, 8-K, Bilanço) Üzerine Bir Durum Tespiti Ajanı Kurmak

Sarah ChoyYayımlanma tarihi: 3 Mayıs 20269 dk okuma
SEC Dosyaları (10-K, 10-Q, 8-K, Bilanço) Üzerine Bir Durum Tespiti Ajanı Kurmak

Bir 10-K okumak çoğunlukla Ctrl+F'tir. Bunu elli şirket için yapmak ise bir iştir. Sıkıcı %80'i SEC EDGAR'a karşı çalışan bir search-and-extract ajanıyla değiştirin — ve insan analist için önem taşıyan %20'yi koruyun.

Özet

  • Mimari: ticker araması → SEC Filings Search (dosyalar + bilanço + equity istatistikleri) → uzun pasajlar için URL Extract → bölüm düzeyinde kaynak gösteren LLM yanıtı.
  • Maliyet tavanı: SEC Filings Search çağrı başına 120 credit'tir (≈0,12$); tipik bir 3 soruluk şirket incelemesi ~0,40$ credit + ~0,05$ LLM token'ı tutar.
  • Ajanın doğru yaptıkları: olgusal aramalar (segment geliri, capex eğilimi, kurumsal yönetim, risk faktörlerinin yıldan yıla değişimi), yönetici ücret özetleri, son 8-K olayları.
  • Hâlâ insan gerektiren şeyler: yönetim kalitesine ilişkin yargılar, pazar konumlandırması, anlaşmaya özgü meseleler, dosyanın dilinin dışındaki her şey.

Bunu otomatikleştirmeye neden değer?

Halka açık bir şirket üzerine ilk geçişlik bir durum tespiti okuması çoğunlukla mekaniktir: en son 10-K'yı çekmek, risk faktörlerini ve MD&A'yı taramak, son 8-K'ları kontrol etmek, en güncel bilanço görüşmesine göz atmak. Associate düzeyinde bir analist şirket başına buna 2–4 saat harcar. Çıktı nadiren derin bir içgörüdür — daha kıdemli başka birinin üzerinde akıl yürüttüğü, yapılandırılmış bir olgu örüntüsüdür.

İşte o olgu-örüntüsü adımı, küçük bir ajanın devralabileceği şeyin ta kendisidir. SEC'te ara, ilgili pasajları çıkar, kaynak göstererek özetle. Kıdemli kişi akıl yürütmeyi yine de yapar — ama 4 saatlik bir okuma yerine 5 dakikalık bir okumadan başlar.

Üç şey bunu şu an pratik kılıyor:

  • Dosyalar üzerinde semantik arama, 200 sayfa okumak yerine 'segment geliri nasıl değişti' diye sorup doğru formdan doğru paragrafı geri alabilmeniz anlamına gelir.
  • Uzun bağlamlı LLM'ler, çalışma belleğinde tam bir 10-K artı birkaç 8-K tutabilir ve belgeler arası soruları yanıtlayabilir.
  • Prompt'taki kaynak gösterme disiplini, çıktıyı saniyeler içinde doğrulanabilir kılar — compliance ve inceleme iş akışlarının tam da gerektirdiği şey.

Mimari

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]"

Tek soru maliyeti: ~130 credit (~0,13$) API + ~0,03$ LLM. Üç soruluk bir şirket incelemesi (finansal eğilim, risk faktörü diff'i, son önemli olaylar) ~0,45–0,60$ civarına oturur. Herhangi bir makul faturalama ücretiyle bir analist saatiyle kıyaslandığında hesap ortadadır.

Maaşını çıkaran system prompt

Finansal RAG'de çıktı kalitesinin açık ara en büyük belirleyicisi system prompt'tur. Kullandığımız:

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 ve 4 numaralı kurallar bir arada, ölçtüğümüz uydurma sorunlarının ~%90'ını ortadan kaldırıyor. 3 numaralı kural (zarif bir "bilmiyorum"), bunu sayıları kendinden emin biçimde uyduran bir chatbot'tan ayıran şeydir.

Ajanın temiz biçimde ele aldığı örnek query'ler

  • 'Apple'ın hizmet gelirlerinin son 5 mali yıldaki eğilimini karşılaştır.' → ilgili 10-K'lardan çeker, MD&A'ya kaynak göstererek bir tablo döndürür.
  • 'NVIDIA'nın risk faktörleri FY2023 ile FY2025 arasında ne değişti?' → belgeler arası diff, her formda Item 1A'yı kaynak göstererek.
  • '$TICKER için son 4 8-K'yı özetle.' → 8-K'ya filtrelenmiş semantik arama, dosyalama tarihine göre sıralı.
  • 'Microsoft'un CFO'su en son bilanço görüşmesinde AI capex'i hakkında ne dedi?' → transkriptlerde arar, ilgili Q&A pasajını çıkarır, olduğu gibi alıntılar.

Nerede yetersiz kalıyor — ve doğru insan devri

Ajan üç öngörülebilir yerde tökezler:

  • Yönetim kalitesine ilişkin yargılar. Dosya size ne yaptıklarını söyler, yetenekli olup olmadıklarını değil. Ajana sormayın.
  • Dosyanın dışındaki sektör emsalleri. Soru 'bu brüt marj emsallerle nasıl karşılaştırılır' ise, ajan yalnızca aranan dosyalarda olanı bilir. Emsal karşılaştırması için ya ayrı bir dataset gerekir ya da ajanı şirket başına bir kez çalıştırıp toplulaştırmanız.
  • Geleceğe yönelik yorumlar. Dosyalar forward-looking statements içerir ama model, aksi söylenmedikçe bunları olduğu gibi alır. Prompt'a ekleyin: 'Forward-looking statements'ı açıkça işaretle. Guidance'ı bir olgu gibi sunma.'

Asgari uygulanabilir build

research-agent kılavuzundaki aynı Claude tool-use döngü deseni geçerlidir — yalnızca araçlar ve system prompt değişir:

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

Bunu bir sonraki adımda nereye taşımalı

  • Tekrarlanabilir incelemeler için şablonlar. Ajanı, bir ticker alıp sabit biçimli bir markdown özeti üreten küçük bir CLI'a sarın: 'Son 8-K'lar', 'Segment geliri eğilimi', 'Risk faktörü deltası'. Aynı ajan, script'lenmiş prompt'lar.
  • İzleme listesi modu. Ajanı her sabah bir ticker'a karşı çalıştırın ve bugünün yanıtını dünküyle diff'leyin. Yalnızca deltaları yüzeye çıkarın. sabah brifingi deseniyle iyi uyuşur.
  • Patentler ve tahmin piyasalarıyla birleştirin. Tech / biotech adları için, IP değişiklikleri için Patent Search ve kalabalığın ima ettiği sonuçlar için (örn. bir ilacın onaylanma olasılığı) Prediction Markets katmanını ekleyin.

Desen genelleşir. SEC, sunduğumuz en yoğun, en schema-friendly corpus'tur — ama döngü ('semantik arama → URL çıkarma → kaynak göstererek yanıt') önemsediğiniz herhangi bir yapılandırılmış belge corpus'una uygulanır: yasal dosyalar, bilimsel özetler, patent istemleri. Önce durum tespiti ajanını kurun, ardından mimariyi yana doğru taşıyın.

Sıkça Sorulan Sorular

SEC indeksi ne kadar güncel?

Dosyalar EDGAR tarafından kabul edildikten sonra saatler içinde indekslenir. 8-K'lar (zamana duyarlı olanlar — önemli olaylar, liderlik değişiklikleri, satın almalar) için bu, genellikle gün sonu iş akışları için yeterince hızlıdır. Yeni 8-K'lar hakkında bir saatten kısa sürede bildirim almanız gerekiyorsa, aramayı ayrı bir SEC RSS beslemesiyle eşleştirin ve ajanı yalnızca içerik analizi için kullanın, tespit için değil.

Bilanço görüşmesi transkriptlerini kapsıyor mu?

Evet — SEC Filings Search indeksi, dosyaların kendisinin yanı sıra ABD bilanço görüşmesi transkriptlerini ve equity istatistiklerini (fiyat/hacim, piyasa değeri geçmişi) içerir. Tek bir semantik query bu kaynakların herhangi birinden veri çekebilir.

Bunu ölçekli yaparsam maliyet kaldıraçları nelerdir?

Üç tane. (1) Bir SEC aramasına 120 credit harcamadan önce bir ticker'ın gerçek bir halka açık şirket olduğunu doğrulamak için Company Facts (2 credit) ile ön filtreleme yapın. (2) Arama sonuçlarını (ticker, çeyrek) bazında cache'leyin — dosyalar yalnızca takvimlerinde güncellenir. (3) Birçok dar arama yerine soru başına bir geniş arama kullanın; ajan, sonuçlar arasında sentez yapmakta iyidir.

Ajan ABD dışındaki dosyaları işleyebilir mi?

SEC Filings Search, ABD'de işlem gören şirketleri kapsar (10-K, 10-Q, 8-K). İngiltere şirketleri için UK Legal Search ve Web Search'ü eşleştirin. Diğer yargı bölgeleri için ilgili ulusal düzenleyicinin sitesinde (Companies House, SEDAR vb.) Web Search + URL Extract'a başvurun.

Halüsinasyonlu sayılardan nasıl kaçınırım?

system prompt'taki üç kural en çok fark yaratan kurallardır. (1) 'Sayıları çıkarılan metinden olduğu gibi alıntılayın — asla parafraze etmeyin ya da yuvarlamayın.' (2) 'Her zaman dosyanın formunu, mali dönemini ve bir bölüm referansını ekleyin.' (3) 'İlgili dosya çıkarılmadıysa bunu açıkça söyleyin — eğitim verisinden çıkarım yapmayın.' Bu üçü birlikte uydurmaların büyük kısmını ortadan kaldırır.

Bu makalede kullanılan API'ler

Sarah Choy
Yazan
Sarah Choy
CEO, API Pick

Sarah Choy, API Pick'in CEO'sudur. Yapay zeka ajanları ve LLM iş akışları için üretime hazır API'ler geliştirme üzerine yazılar yazar.