SEC फाइलिंग्स (10-K, 10-Q, 8-K, अर्निंग्स) पर ड्यू-डिलिजेंस एजेंट बनाना

10-K पढ़ना ज़्यादातर Ctrl+F है। पचास कंपनियों के लिए यही करना एक पूरी नौकरी है। उबाऊ 80% को SEC EDGAR पर एक search-and-extract एजेंट से बदल दें — और जो 20% मानव ऐनालिस्ट के लिए मायने रखता है, उसे बचाए रखें।
TL;DR
- •आर्किटेक्चर: ticker lookup → SEC Filings Search (filings + अर्निंग्स + equity आँकड़े) → लंबे अंशों के लिए URL Extract → सेक्शन-स्तर के साइटेशन के साथ LLM जवाब।
- •लागत की सीमा: SEC Filings Search प्रति कॉल 120 credits है (≈$0.12); एक सामान्य 3-सवाल वाली कंपनी समीक्षा पर ~$0.40 credits + ~$0.05 LLM token खर्च होते हैं।
- •एजेंट किसमें सही रहता है: तथ्यात्मक lookups (सेगमेंट रेवेन्यू, capex रुझान, गवर्नेंस, रिस्क-फैक्टर में साल-दर-साल बदलाव), एग्जीक्यूटिव कम्पेंसेशन के सारांश, हाल के 8-K इवेंट।
- •जिसके लिए अब भी मानव चाहिए: मैनेजमेंट की गुणवत्ता पर निर्णय, बाज़ार में पोज़िशनिंग, डील-विशिष्ट मुद्दे, और फाइलिंग की भाषा से बाहर की कोई भी बात।
इसे ऑटोमेट करना क्यों फ़ायदेमंद है
किसी पब्लिक कंपनी पर पहली बार की ड्यू-डिलिजेंस पढ़ाई ज़्यादातर यांत्रिक होती है: नवीनतम 10-K निकालना, रिस्क फैक्टर्स और MD&A को स्कैन करना, हाल के 8-K जाँचना, सबसे ताज़ा अर्निंग्स कॉल पर एक नज़र डालना। एक associate-स्तर का ऐनालिस्ट प्रति कंपनी इस पर 2–4 घंटे लगाता है। नतीजा शायद ही कोई गहरी अंतर्दृष्टि होता है — यह एक संरचित तथ्य-पैटर्न होता है जिस पर बाद में कोई और, ज़्यादा वरिष्ठ व्यक्ति सोच-विचार करता है।
वही तथ्य-पैटर्न वाला चरण ठीक वही है जो एक छोटा एजेंट संभाल सकता है। SEC में सर्च करें, संबंधित अंश निकालें, साइटेशन के साथ सारांश दें। वरिष्ठ व्यक्ति अब भी सोच-विचार करता है — पर वह 4 घंटे की बजाय 5 मिनट की पढ़ाई से शुरुआत करता है।
तीन चीज़ें इसे अभी व्यावहारिक बनाती हैं:
- filings पर सेमांटिक सर्च का मतलब है कि आप पूछ सकते हैं 'सेगमेंट रेवेन्यू कैसे बदला' और 200 पन्ने पढ़ने के बजाय सही form से सही पैराग्राफ वापस पा सकते हैं।
- लंबे-कॉन्टेक्स्ट वाले LLM एक पूरा 10-K और कुछ 8-K को वर्किंग मेमोरी में रख सकते हैं और दस्तावेज़ों के बीच के सवालों के जवाब दे सकते हैं।
- prompt में साइटेशन अनुशासन आउटपुट को सेकंडों में सत्यापन-योग्य बना देता है — ठीक वही जो compliance और समीक्षा वर्कफ़्लो को चाहिए।
आर्किटेक्चर
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। तीन-सवाल वाली कंपनी समीक्षा (फ़ाइनेंशियल रुझान, रिस्क-फैक्टर diff, हाल की महत्वपूर्ण घटनाएँ) ~$0.45–$0.60 पर आती है। किसी भी उचित बिल रेट पर एक ऐनालिस्ट घंटे की तुलना में, गणित स्पष्ट है।
वह system prompt जो अपनी कीमत वसूल करता है
फ़ाइनेंशियल RAG में आउटपुट की गुणवत्ता का सबसे बड़ा निर्धारक system prompt है। जो हम इस्तेमाल करते हैं:
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 (शालीन "मुझे नहीं पता") ही इसे एक ऐसे chatbot से अलग करता है जो आत्मविश्वास से आँकड़े गढ़ देता है।
नमूना queries जिन्हें एजेंट साफ़-सुथरे ढंग से संभालता है
- 'पिछले 5 फ़िस्कल वर्षों में Apple के सर्विसेज़ रेवेन्यू के रुझान की तुलना करें।' → संबंधित 10-K से खींचता है, MD&A के साइटेशन के साथ एक टेबल लौटाता है।
- 'FY2023 और FY2025 के बीच NVIDIA के रिस्क फैक्टर्स में क्या बदला?' → दस्तावेज़ों के बीच diff, हर form में Item 1A का हवाला देते हुए।
- '$TICKER के पिछले 4 8-K का सारांश दें।' → 8-K पर फ़िल्टर की गई सेमांटिक सर्च, filing तारीख के अनुसार क्रमबद्ध।
- 'सबसे ताज़ा अर्निंग्स कॉल पर Microsoft के CFO ने AI capex के बारे में क्या कहा?' → ट्रांसक्रिप्ट्स में सर्च करता है, संबंधित Q&A अंश निकालता है, हू-ब-हू उद्धृत करता है।
जहाँ यह कमज़ोर पड़ता है — और सही मानव हैंडऑफ़
एजेंट तीन अनुमानित जगहों पर लड़खड़ाता है:
- मैनेजमेंट की गुणवत्ता पर निर्णय। filing आपको बताता है कि उन्होंने क्या किया, यह नहीं कि वे सक्षम हैं या नहीं। एजेंट से मत पूछिए।
- filing से बाहर के इंडस्ट्री तुलनात्मक आँकड़े। अगर सवाल है 'यह gross margin peers की तुलना में कैसा है', तो एजेंट केवल वही जानता है जो खोजी गई filings में है। peer तुलना के लिए आपको या तो एक अलग dataset चाहिए या एजेंट को हर कंपनी पर एक बार चलाकर एकत्र करना होगा।
- भविष्योन्मुखी टिप्पणी। filings में forward-looking statements होते हैं, पर मॉडल उन्हें अन्यथा बताए जाने तक उनके अंकित मूल्य पर ले लेता है। prompt में जोड़ें: 'forward-looking statements को स्पष्ट रूप से flag करें। guidance को तथ्य के रूप में प्रस्तुत न करें।'
न्यूनतम व्यवहार्य build
वही Claude tool-use loop पैटर्न जो research-agent वॉकथ्रू में है, यहाँ लागू होता है — केवल tools और 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."))इसे आगे कहाँ ले जाएँ
- दोहराने योग्य समीक्षाओं के लिए templates। एजेंट को एक छोटी CLI में लपेटें जो एक ticker लेती है और एक तय-फ़ॉर्मैट markdown brief देती है: 'हाल के 8-K', 'सेगमेंट रेवेन्यू रुझान', 'रिस्क-फैक्टर डेल्टा'। वही एजेंट, स्क्रिप्टेड prompts।
- Watchlist मोड। एजेंट को हर सुबह किसी ticker पर चलाएँ और आज के जवाब का कल के जवाब से diff करें। केवल डेल्टा को सामने लाएँ। यह morning-briefing पैटर्न के साथ अच्छा बैठता है।
- पेटेंट और prediction markets के साथ जोड़ें। tech / biotech नामों के लिए, IP बदलावों हेतु Patent Search और भीड़-निहित परिणामों (जैसे किसी दवा के अनुमोदन की संभावना) हेतु Prediction Markets को परत-दर-परत जोड़ें।
यह पैटर्न सामान्यीकृत होता है। SEC सबसे सघन, सबसे schema-friendly corpus है जो हम देते हैं — पर यह loop ('सेमांटिक सर्च → URL extract → साइटेशन के साथ जवाब') किसी भी संरचित-दस्तावेज़ corpus पर लागू होता है जिसकी आपको परवाह है: लीगल फाइलिंग्स, वैज्ञानिक abstracts, पेटेंट दावे। पहले डिलिजेंस एजेंट बनाएँ, फिर आर्किटेक्चर को बग़ल में पोर्ट करें।
अक्सर पूछे जाने वाले प्रश्न
SEC इंडेक्स कितना ताज़ा रहता है?
EDGAR द्वारा स्वीकार किए जाने के कुछ घंटों के भीतर फाइलिंग्स इंडेक्स हो जाती हैं। 8-K (जो समय-संवेदनशील होते हैं — महत्वपूर्ण घटनाएँ, नेतृत्व में बदलाव, अधिग्रहण) के लिए यह आमतौर पर एंड-ऑफ-डे वर्कफ़्लो के लिए काफ़ी तेज़ है। अगर आपको नए 8-K की एक घंटे से कम में सूचना चाहिए, तो सर्च को एक अलग SEC RSS फ़ीड के साथ जोड़ें और एजेंट को केवल कंटेंट विश्लेषण के लिए इस्तेमाल करें, डिटेक्शन के लिए नहीं।
क्या यह अर्निंग्स कॉल ट्रांसक्रिप्ट्स को कवर करता है?
हाँ — SEC Filings Search इंडेक्स में फाइलिंग्स के साथ-साथ US अर्निंग्स कॉल ट्रांसक्रिप्ट्स और equity आँकड़े (कीमत/वॉल्यूम, मार्केट कैप इतिहास) शामिल हैं। एक ही सेमांटिक query इनमें से किसी भी स्रोत से डेटा खींच सकती है।
अगर मैं इसे बड़े पैमाने पर करूँ तो लागत के लीवर क्या हैं?
तीन। (1) SEC सर्च पर 120 credits खर्च करने से पहले यह पुष्टि करने के लिए कि ticker एक असली पब्लिक कंपनी है, Company Facts (2 credits) से प्री-फ़िल्टर करें। (2) सर्च परिणामों को (ticker, तिमाही) के हिसाब से cache करें — filings केवल शेड्यूल पर ही अपडेट होती हैं। (3) कई संकीर्ण सर्च के बजाय हर सवाल पर एक चौड़ी सर्च का इस्तेमाल करें; एजेंट परिणामों के बीच संश्लेषण में अच्छा है।
क्या एजेंट गैर-US फाइलिंग्स संभाल सकता है?
SEC Filings Search US-लिस्टेड कंपनियों (10-K, 10-Q, 8-K) को कवर करता है। UK कंपनियों के लिए, UK Legal Search और Web Search को जोड़ें। अन्य अधिकार-क्षेत्रों के लिए, संबंधित राष्ट्रीय रेगुलेटर की साइट (Companies House, SEDAR, आदि) पर Web Search + URL Extract का सहारा लें।
मैं मनगढ़ंत आँकड़ों से कैसे बचूँ?
system prompt में तीन नियम सबसे ज़्यादा असर डालते हैं। (1) 'निकाले गए टेक्स्ट से आँकड़ों को हू-ब-हू उद्धृत करें — कभी paraphrase या राउंड न करें।' (2) 'हमेशा filing का form, फ़िस्कल अवधि और एक सेक्शन reference शामिल करें।' (3) 'अगर संबंधित filing नहीं निकाली गई थी, तो स्पष्ट रूप से कहें — ट्रेनिंग डेटा से अनुमान न लगाएँ।' ये तीनों मिलकर ज़्यादातर मनगढ़ंत बातों को हटा देते हैं।
इस लेख में उपयोग की गई APIs
Sarah Choy, API Pick की CEO हैं। वे AI एजेंट्स और LLM वर्कफ़्लो के लिए प्रोडक्शन-रेडी APIs बनाने के बारे में लिखती हैं।