Парсинг SEC EDGAR: від сирого HTML до структурованих даних
Ручний розбір 10-K на 400 сторінок займає в аналітика півдня. Помилки при вилученні Revenue з таблиць — кожен п'ятий запис. Ми побудували систему, яка за 5 хвилин витягує всі ключові метрики, ризики та тренди з PDF у структурований JSON. І робить це на потоці — 500 звітів на годину. На відміну від звичайних парсерів, наш пайплайн використовує LLM для адаптивного вилучення, що дозволяє обробляти звіти з нестабільною розміткою. Наприклад, SEC EDGAR змінює HTML-структуру кожен квартал, але модель за контекстом знаходить потрібні секції.
Проблеми, які вирішуємо
Rate limiting і нестабільна структура. EDGAR не дає більше 10 запитів на секунду, а HTML-розмітка звітів змінюється від кварталу до кварталу. Звичайні парсери на BeautifulSoup ламаються на першій же заміні class на id. Наш пайплайн використовує LLM для адаптивного вилучення — модель за контекстом визначає, де лежить Revenue, навіть якщо таблиця перейменована.
Вилучення неструктурованих розділів. MD&A, Risk Factors — це проза об'ємом 20–30 сторінок. Просто взяти текст — мало. Потрібно відокремити тренди від фактів, знайти числа в природній мові ("revenue increased by 12% to $5.2B") і обчислити sentiment. Для цього застосовуємо chain-of-thought промпти з few-shot прикладами з еталонних звітів.
Порівняння рік до року. Ризик, який рік тому був третім, а сьогодні — першим, сигналізує про проблеми. Система автоматично будує дельти: вилучає Item 1A поточного та попереднього року, обчислює семантичну близькість параграфів і маркує нове, посилене або ослаблене. Результат — список червоних прапорців з поясненням.
Як ми це робимо: стек і кейс
Використовуємо гібридну архітектуру: Python + LangChain + OpenAI GPT-4 (або локальний vLLM з LLaMA 3). Векторне сховище — Qdrant для семантичного пошуку за історичними звітами. Розгортання через Kubeflow на кластері GPU (A10G).
from langchain.chains import create_extraction_chain from langchain.chat_models import ChatOpenAI llm = ChatOpenAI(model="gpt-4", temperature=0.1) schema = { "properties": { "revenue": {"type": "number"}, "net_income": {"type": "number"}, "risk_factors_new": {"type": "array", "items": {"type": "string"}} } } chain = create_extraction_chain(llm, schema) result = chain.run(filing_text) Кейс: розпарсили 5000 річних звітів за ніч. Клієнт — хедж-фонд, який хотів відстежувати ротацію ритейлу в 10-K. Наша система за 8 годин обробила всі 5000 документів, виділила топ-10 компаній з різким зростанням згадок "inflation" і "supply chain". Ручна перевірка показала точність 97% за ризиками. Порівняння: три аналітика тиждень пилили б те саме. Наше рішення в 10 разів швидше і точніше. Зв'яжіться з нами, щоб обговорити аналогічний проект. Отримайте консультацію за вашими задачами.
Як система справляється з rate limit EDGAR?
SEC обмежує запити до 10 на секунду. Ми реалізували адаптивний тротлінг з чергою і повторними спробами при помилках 429. Для масового парсингу використовуємо розподілену архітектуру на базі Ray — навантаження розподіляється між інстансами, що дозволяє обробляти до 500 звітів на годину без блокування.
Технічна деталь: обробка XBRL
Багато 10-K містять iXBRL-теги. Якщо їх не парсити, втратите точність. Ми використовуємоarelle для вилучення axis/concept. Це дає структурований доступ до фінансових метрик з таблиць. Детальніше про XBRL — у [Wikipedia](https://en.wikipedia.org/wiki/XBRL).Чому точність вилучення досягає 98,5%?
Ми комбінуємо правила XPath для табличних даних і fine-tuned LLM для текстових розділів. Крос-валідація: числові дані звіряються з попередніми періодами, а текстові — за допомогою семантичного пошуку за еталонними звітами. Для фінансових показників точність ключових метрик — 98,5%.
Порівняння підходів: ручний і автоматичний парсинг
| Параметр | Ручний розбір | Наш AI-пайплайн |
|---|---|---|
| Час на 10-K | 4–6 годин | 5 хвилин |
| Точність вилучення Revenue | 80% | 98,5% |
| Пропускна здатність | 2 звіти/день | 500 звітів/год |
| Вартість за звіт | ~$200 | ~$20 |
Економія на масштабі: при обробці 1000 звітів на місяць витрати знижуються в 10 разів, що окупає впровадження за 2–3 місяці.
Етапи роботи
- Аналітика — обговорюємо які звіти, метрики та сигнали потрібні. Збираємо еталонні звіти для крос-валідації.
- Проектування — обираємо моделі (GPT-4 / LLaMA 3 / Mistral), проектуємо схему вихідних даних і пайплайн аугментації.
- Реалізація — пишемо адаптер до EDGAR, парсери, ланцюжки LangChain, модуль дельт і дашборд.
- Тестування — прогоняємо на 100 випадкових звітах, порівнюємо з ручним розбором. Досягаємо recall > 95% за ключовими полями.
- Деплой — розгортаємо у вашому кластері або SaaS. Налаштовуємо моніторинг (uptime, latency p99, кількість оброблених звітів).
Терміни та вартість
Терміни: від 4 до 12 тижнів залежно від складності (базовий парсинг vs. кастомні бізнес-правила). Вартість розраховується індивідуально — залежить від обсягу звітів, необхідних моделей та потреби в GPU-кластері. В середньому, інвестиція окупається за 2–3 місяці за рахунок скорочення часу аналітиків на 80%.
Що входить в роботу
| Модуль | Опис | Термін (тиж) |
|---|---|---|
| Адаптер EDGAR | Автоматичний обхід rate limit, черга + retry | 1-2 |
| Пайплайн вилучення | Парсинг HTML → нормалізація → NLP → JSON | 2-4 |
| Модуль дельт | Порівняння періодів з візуалізацією в Grafana | 1-2 |
| Інтеграція з DWH | Snowflake, Redshift, ClickHouse | 1-2 |
| Документація та навчання | API, архітектура + 2 сесії | 0.5 |
| Техпідтримка | 3 місяці | включено |
Типові помилки та як їх уникнути
- Ігнорувати XBRL — багато 10-K містять iXBRL-теги. Якщо їх не парсити, втратите точність. Ми використовуємо arelle для вилучення axis/concept.
- Надто агресивний rate limit — блокування IP на добу. Ставимо time.sleep(0.15) між запитами та моніторимо заголовок X-RateLimit-Remaining.
- Не перевіряти encoding — SEC зберігає документи в Windows-1252. Без перекодування зламається UTF-8. Застосовуємо chardet і автоматично конвертуємо.
Наш досвід — 7+ років у NLP, 30+ проектів у фінансовій аналітиці. Надаємо гарантію на точність вилучення (98%+ за контрактом). Замовте пілотний парсинг 50 документів — результат покажемо за 2 дні. Отримайте консультацію за вашими задачами. Детальніше про формат EDGAR — Wikipedia.







