Парсинг 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. Настраиваем мониторинг (аптайм, 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.







