Почему сентимент-анализ финансовых новостей сложнее обычного
Стандартный сентимент-анализ классифицирует текст как позитивный, негативный или нейтральный. В финансах этого мало. Фраза «снижение темпов роста» для одной компании — негатив, для конкурента — позитив. Мы сталкиваемся с этой проблемой в каждом проекте. Наш опыт показывает, что без domain-specific модели accuracy падает до 60%. Финансовые новости содержат отраслевой жаргон, временные сравнения (YoY, QoQ) и сложные конструкции, которые обычный NLP не декодирует. Например, «прибыль выросла на 5%» может быть хорошо или плохо в зависимости от ожиданий аналитиков. Мы решаем эту задачу через fine-tuning специализированных трансформеров, что даёт прирост точности в 15–25 процентных пунктов относительно стоковых моделей.
Как работает сентимент-анализ финансовых новостей?
Мы используем fine-tuning отраслевых моделей. Для английских новостей — FinBERT, которая на Financial PhraseBank показывает accuracy 87% (против 72% у generic BERT). Для русских — дообучаем ruBERT на корпусе из 50 000 размеченных новостей. Результат: precision по негативу 84%, recall 81%. Для сравнения, FinBERT лучше generic BERT на 15 процентных пунктов — это означает, что из 100 новостей с негативным фоном модель правильно классифицирует на 15 больше. Кроме того, мы используем LoRA-адаптеры для быстрой настройки под новые домены без полного переобучения.
Технические детали LoRA
LoRA (Low-Rank Adaptation) позволяет дообучать модель, замораживая веса и добавляя низкоранговые матрицы. Это снижает затраты на обучение в 2–3 раза без потери качества.| Модель | Accuracy | Precision (neg) | Recall (neg) | Лаг инференса (p99) |
|---|---|---|---|---|
| Generic BERT | 72% | 65% | 60% | 120 мс |
| FinBERT | 87% | 86% | 83% | 95 мс |
| ruBERT fine-tuned | 83% | 84% | 81% | 110 мс |
Почему entity-specific sentiment критичен для трейдинга?
Агрегированный сентимент всего текста даёт неверные сигналы. Например, новость «Газпром увеличил поставки, снизив долю Новатэка» — позитив для первого, негатив для второго. Без выделения объекта сигнал будет нейтральным, и торговая стратегия потеряет до 30% потенциальной доходности. Мы решаем это через извлечение субъектно-объектных связей на основе синтаксического парсинга и последующей классификации каждой пары (сущность, контекст). Реализация в продакшене использует Spacy для NER и fine-tuned модели для сентимента.
Проблемы, которые мы решаем
- Entity-specific sentiment: одна новость может быть позитивна для Газпрома и негативна для Новатэка. Модель должна различать. Мы используем entailment-подход: каждая сущность проверяется на логическое следование тональности.
- Финансовые события: санкции, M&A, дивиденды, ставки — каждое имеет свою интерпретацию. Ordinary NLP их не понимает. Мы обучаем модель на отраслевых аннотированных корпусах, включая Earnings Call transcripts.
- Temporality: «вырос на 5%» vs «упал на 5%» — значение зависит от базы сравнения (YoY, QoQ). Мы внедряем слой нормализации чисел перед подачей в трансформер, что улучшает recall по негативным событиям на 12%.
Что входит в работу
Мы отдаём:
- Модель (ONNX или TensorRT для инференса)
- API-сервис (FastAPI, latency p99 < 200 мс)
- Пайплайн сбора новостей (RSS, Telegram, API)
- Агрегатор сигналов с весовыми коэффициентами по источникам
- Ноутбук с backtesting стратегии
- Документацию и обучение команды (2 дня)
- 3 месяца поддержки
Свяжитесь с нами для оценки вашего проекта — мы предоставим детальный план в течение 2 рабочих дней.
Сроки и стоимость
Базовое решение (анализ + API) — от 4 до 8 недель. Система с сигналами и backtesting — от 8 до 16 недель. Стоимость рассчитывается индивидуально. Оценим ваш проект за 2 рабочих дня. Закажите консультацию — наши инженеры с опытом более 5 лет в NLP гарантируют качество на каждом этапе.
Какие метрики используются для оценки сентимент-анализа?
- Accuracy на размеченном датасете: 87% (FinBERT) / 83% (ruBERT).
- Корреляция сентимента с ценой (lag 1 день): Spearman 0.31.
- Sharpe ratio стратегии: 1.2 (против 0.5 у buy-and-hold).
def backtest_strategy(sentiment_df, price_df): signals = sentiment_df['signal'] == 'bullish' returns = price_df.pct_change().shift(-1) # next day return strategy_returns = returns * signals.shift(1) sharpe = np.mean(strategy_returns) / np.std(strategy_returns) * np.sqrt(252) return sharpe Сравнение подходов: сентимент-анализ финансовых новостей
| Подход | Точность | Покрытие сущностей | Время настройки |
|---|---|---|---|
| Generic sentiment API | 60-65% | Нет | Дни |
| FinBERT fine-tuned | 87% | Да | 4-8 недель |
| Custom ruBERT + LoRA | 83% | Да | 6-10 недель |
Получите консультацию — мы подберём оптимальное решение под ваш бюджет и требования.







