Перейти к содержимому

ELECTRA для финансов: эффективное предобучение для анализа финансовых текстов

ELECTRA (Efficiently Learning an Encoder that Classifies Token Replacements Accurately) — это метод предобучения языковых моделей, который заменяет задачу Masked Language Modeling (MLM) на более эффективную задачу Replaced Token Detection (RTD). Вместо маскирования токенов и их предсказания, ELECTRA обучает генератор заменять токены, а дискриминатор — обнаруживать, какие токены были заменены — по аналогии с генеративно-состязательной сетью (GAN), применённой к тексту.

В финансовой сфере преимущество ELECTRA в эффективности особенно ценно:

  • Экономичное обучение: ELECTRA достигает качества BERT при значительно меньших вычислительных затратах, что делает его практичным для финансовых учреждений
  • Лучшая эффективность выборки: обучается на ВСЕХ входных токенах (не только на замаскированных), что критически важно при ограниченности финансовых текстовых данных
  • Меньшие размеры моделей: конкурентоспособная производительность при малых размерах, что позволяет развёртывание на торговой инфраструктуре
  • Адаптация к домену: эффективная тонкая настройка на финансовых корпусах (отчёты о прибылях, документы SEC, рыночные новости)

В этой главе рассматривается теория и реализация ELECTRA для задач финансового NLP с практическим применением на данных фондового рынка и криптовалют (Bybit).

Содержание

  1. Введение в ELECTRA
  2. Архитектура ELECTRA
  3. ELECTRA vs BERT для финансов
  4. Классификация финансовых текстов
  5. Реализация на PyTorch
  6. Торговая стратегия на основе сигналов ELECTRA
  7. Бэктестинг стратегии
  8. Реализация на Rust
  9. Литература

Введение в ELECTRA

Традиционные методы предобучения, такие как BERT, используют Masked Language Modeling (MLM), где ~15% токенов маскируются и модель учится их предсказывать. Это означает, что модель обучается только на малой доле входных токенов на каждом шаге обучения.

ELECTRA предлагает принципиально другой подход:

  1. Генератор: маленькая модель MLM генерирует правдоподобные замены токенов
  2. Дискриминатор: основная модель классифицирует каждый токен как «оригинальный» или «заменённый»
Оригинал: "Акции [МАСКА] резко после [МАСКА] отчёта"
Генератор: "Акции упали резко после квартального отчёта"
^^^^^ ^^^^^^^^^^^^^^
Метки дискр.: [ориг, ориг, замен, ориг, ориг, замен, ориг]

Дискриминатор обучается на ВСЕХ токенах в каждом примере, что делает обучение примерно в 4 раза эффективнее BERT.

Почему ELECTRA важна для финансового NLP

Финансовые тексты имеют уникальные характеристики, которые делают ELECTRA особенно подходящей:

  • Доменно-специфичная лексика: финансовые термины, тикеры и жаргон требуют эффективного обучения
  • Нюансированная тональность: «Выручка выросла на 5%» может быть позитивным или негативным в зависимости от ожиданий
  • Временная чувствительность: модели необходимо быстро обучать и обновлять для рыночной актуальности
  • Ограниченные размеченные данные: финансовая разметка дорога и требует доменной экспертизы

Архитектура ELECTRA

Сеть-генератор

Генератор — это небольшой трансформер, выполняющий маскированное языковое моделирование. Он получает повреждённый вход (с ~15% замаскированных токенов) и предсказывает оригинальные токены:

P_G(x_t | x_masked) = softmax(W_G · h_G(x_masked)_t)

Генератор обычно составляет от 1/4 до 1/3 размера дискриминатора, обеспечивая хороший баланс между генерацией правдоподобных замен и минимизацией вычислительных затрат.

Сеть-дискриминатор

Дискриминатор — это основная модель ELECTRA. Он получает выход генератора (с некоторыми заменёнными токенами) и должен определить, какие токены оригинальные, а какие заменённые:

D(x_t) = sigmoid(w^T · h_D(x_replaced)_t)

Для каждой позиции t дискриминатор выдаёт вероятность того, что токен из оригинального текста, а не сгенерированный.

Целевая функция обучения

Комбинированная функция потерь балансирует потери генератора и дискриминатора:

L = L_MLM(генератор) + λ · L_Disc(дискриминатор)

Где:

  • L_MLM — стандартная потеря маскированного языкового моделирования для генератора
  • L_Disc — бинарная кросс-энтропия для дискриминатора
  • λ (обычно 50) повышает вес потери дискриминатора, так как это основная модель

После предобучения генератор отбрасывается, и для последующих задач используется только дискриминатор.

ELECTRA vs BERT для финансов

АспектBERTELECTRA
Задача предобученияMasked LM (15% токенов)Replaced Token Detection (100% токенов)
Эффективность обученияБазовая~4x эффективнее
Производительность малых моделейЗначительно снижаетсяОстаётся конкурентоспособной
Вычислительные затратыВысокиеНиже при том же качестве
Адаптация для финансовых текстовХорошая, но дорогаяЭффективная адаптация к домену
Скорость инференсаОдинаковая архитектураОдинаковая архитектура

Для финансовых приложений преимущества ELECTRA накапливаются:

  • Частое переобучение: рынки эволюционируют; ELECTRA можно переобучить в 4 раза быстрее
  • Несколько доменов: акции, крипто, форекс — каждый требует специализированных моделей
  • Ограничения ресурсов: торговые фирмы имеют бюджеты на вычисления; ELECTRA делает больше с меньшими затратами

Классификация финансовых текстов

Анализ тональности

ELECTRA отлично справляется с классификацией финансовой тональности, где важны тонкие языковые различия:

# Примеры финансовой тональности
texts = [
"Выручка превысила прогнозы аналитиков на 12%", # Позитивный
"Выручка выросла на 3%, не дотянув до консенсуса", # Негативный (ожидания не оправданы)
"Компания подтвердила прогноз по дивидендам", # Нейтральный
"Bitcoin пробил ключевое сопротивление на $45,000", # Позитивный (крипто)
]

Модель учится различать абсолютные результаты («выручка выросла») и относительные («не дотянув до консенсуса») — критически важное различие в финансовом анализе.

Обнаружение событий

ELECTRA может классифицировать финансовые события, влияющие на торговые решения:

  • Сюрпризы в прибыли: превышение/отставание/соответствие ожиданиям
  • M&A активность: объявления о слияниях, слухи о поглощениях
  • Регуляторные действия: документы SEC, изменения политики
  • Микроструктура рынка: объявления бирж, листинг/делистинг

Реализация на PyTorch

Пример кода: модель настроений на основе ELECTRA

Директория python/ содержит полную реализацию:

import torch
import torch.nn as nn
from transformers import ElectraModel, ElectraTokenizer
class FinancialElectra(nn.Module):
"""Модель на основе ELECTRA для классификации финансовой тональности."""
def __init__(self, num_classes=3, model_name='google/electra-small-discriminator',
dropout=0.3):
super().__init__()
self.electra = ElectraModel.from_pretrained(model_name)
hidden_size = self.electra.config.hidden_size
self.classifier = nn.Sequential(
nn.Dropout(dropout),
nn.Linear(hidden_size, hidden_size // 2),
nn.GELU(),
nn.Dropout(dropout),
nn.Linear(hidden_size // 2, num_classes)
)
def forward(self, input_ids, attention_mask=None):
outputs = self.electra(input_ids=input_ids, attention_mask=attention_mask)
cls_output = outputs.last_hidden_state[:, 0, :] # Токен [CLS]
logits = self.classifier(cls_output)
return logits

Пример кода: генерация торговых сигналов

class ElectraTradingSignal:
"""Генерация торговых сигналов из финансового текста с помощью ELECTRA."""
def __init__(self, model, tokenizer, device='cpu'):
self.model = model.to(device).eval()
self.tokenizer = tokenizer
self.device = device
def predict_sentiment(self, texts):
"""Предсказание тональности для батча финансовых текстов."""
encodings = self.tokenizer(
texts, padding=True, truncation=True,
max_length=256, return_tensors='pt'
).to(self.device)
with torch.no_grad():
logits = self.model(**encodings)
probs = torch.softmax(logits, dim=-1)
# Классы: 0=негативный, 1=нейтральный, 2=позитивный
return probs.cpu().numpy()
def generate_signal(self, news_items, threshold=0.6):
"""Генерация торгового сигнала из нескольких новостей."""
if not news_items:
return 0.0, 0.0 # Нет сигнала, нет уверенности
probs = self.predict_sentiment(news_items)
avg_probs = probs.mean(axis=0)
# Сигнал: позитивная - негативная тональность
signal = avg_probs[2] - avg_probs[0]
confidence = max(avg_probs[0], avg_probs[2])
if confidence < threshold:
return 0.0, confidence # Недостаточная уверенность
return signal, confidence

Торговая стратегия на основе сигналов ELECTRA

Стратегия комбинирует сигналы тональности ELECTRA с ценовыми данными:

  1. Сбор новостей: сбор финансовых новостей и социальных медиа для целевых активов
  2. Оценка тональности: пропуск каждого текста через модель ELECTRA
  3. Агрегация сигналов: объединение нескольких оценок тональности с весами временного затухания
  4. Размер позиции: масштабирование позиций на основе уверенности в тональности
  5. Управление рисками: применение стоп-лоссов и лимитов позиций
def electra_trading_strategy(news_data, price_data, model, tokenizer,
signal_threshold=0.3, confidence_threshold=0.6):
"""Торговая стратегия на основе ELECTRA."""
signal_gen = ElectraTradingSignal(model, tokenizer)
positions = []
for date in price_data.index:
# Получаем новости за этот день
daily_news = news_data[news_data['date'] == date]['text'].tolist()
signal, confidence = signal_gen.generate_signal(
daily_news, threshold=confidence_threshold
)
if abs(signal) > signal_threshold:
position_size = min(abs(signal) * confidence, 1.0)
direction = 1 if signal > 0 else -1
positions.append({
'date': date,
'direction': direction,
'size': position_size,
'signal': signal,
'confidence': confidence
})
return pd.DataFrame(positions)

Бэктестинг стратегии

Ключевые метрики

МетрикаОписание
Коэффициент ШарпаДоходность с учётом риска: (Доходность - Rf) / Стд
Коэффициент СортиноДоходность с учётом нижестороннего риска
Максимальная просадкаНаибольшее снижение от пика к впадине
Доля прибыльных сделокПроцент прибыльных сделок
Профит-факторВаловая прибыль / Валовой убыток

Сценарии сравнения

Мы сравниваем:

  1. Базовый: стратегия «купи и держи»
  2. ELECTRA Тональность: торговля только по сигналам тональности ELECTRA
  3. ELECTRA + Технический: комбинация сигналов ELECTRA с техническими индикаторами
  4. Ансамбль: несколько моделей ELECTRA с весами уверенности

Реализация на Rust

Директория rust_examples/ содержит production-ready реализацию на Rust:

  • Интеграция с Bybit API: получение данных о криптовалютах в реальном времени
  • Предобработка текста: токенизация и извлечение признаков на Rust
  • Оценка тональности: инференс модели на основе ONNX с низкой задержкой
  • Движок бэктестинга: высокопроизводительный бэктестинг стратегий

Запуск примеров на Rust

Окно терминала
cd rust_examples
# Получение данных с Bybit
cargo run --example fetch_data
# Запуск анализа тональности и торговли
cargo run --example electra_trading
# Запуск бэктеста
cargo run --example backtest

Литература

  1. ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators

    • Clark, K., Luong, M.-T., Le, Q. V., & Manning, C. D. (2020)
    • URL: https://arxiv.org/abs/2003.10555
    • Представлен метод предобучения ELECTRA
  2. FinBERT: Financial Sentiment Analysis with Pre-trained Language Models

    • Araci, D. (2019)
    • URL: https://arxiv.org/abs/1908.10063
    • Адаптация трансформерных моделей для финансового домена
  3. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    • Devlin, J., Chang, M.-W., Lee, K., & Toutanova, K. (2019)
    • URL: https://arxiv.org/abs/1810.04805
    • Базовая модель, которую ELECTRA улучшает
  4. Attention Is All You Need

  5. Natural Language Processing in Finance: A Survey

    • Xing, F., Cambria, E., & Welsch, R. (2018)
    • URL: https://arxiv.org/abs/1807.02811
    • Обзор методов NLP для финансовых приложений