Глава 61: FinGPT — Открытая Финансовая Языковая Модель
В этой главе рассматривается FinGPT — открытая большая языковая модель, специально разработанная для финансовой сферы. В отличие от проприетарных моделей, таких как BloombergGPT, FinGPT предоставляет доступные и настраиваемые решения для задач финансовой обработки естественного языка, включая анализ настроений, понимание новостей и генерацию торговых сигналов.
Содержание
- Введение в FinGPT
- Подход к обучению FinGPT
- Торговые приложения
- Практические примеры
- Реализация на Rust
- Реализация на Python
- Сравнение с другими моделями
- Лучшие практики
- Ресурсы
Введение в FinGPT
FinGPT — это открытая инициатива фонда AI4Finance Foundation, направленная на демократизацию финансовых больших языковых моделей. В то время как проприетарные модели, такие как BloombergGPT, требуют значительных ресурсов и недоступны публично, FinGPT предоставляет фреймворк для создания и тонкой настройки финансовых LLM с использованием публично доступных данных и открытых базовых моделей.
Почему открытые финансовые LLM?
ПРОБЛЕМЫ С ПРОПРИЕТАРНЫМИ ФИНАНСОВЫМИ LLM:┌──────────────────────────────────────────────────────────────────┐│ 1. ДОСТУПНОСТЬ ││ BloombergGPT: Недоступен публично ││ FinGPT: Открытый код, любой может использовать и изменять │├──────────────────────────────────────────────────────────────────┤│ 2. НАСТРАИВАЕМОСТЬ ││ BloombergGPT: Фиксированная модель, без тонкой настройки ││ FinGPT: Настройка под ваш конкретный случай использования │├──────────────────────────────────────────────────────────────────┤│ 3. АКТУАЛЬНОСТЬ ДАННЫХ ││ Проприетарные: Данные обучения могут устареть ││ FinGPT: Непрерывные обновления с пайплайнами реальных данных │├──────────────────────────────────────────────────────────────────┤│ 4. СТОИМОСТЬ ││ Проприетарные: Дорогие API, лицензионные платежи ││ FinGPT: Бесплатно для использования, хостинга и модификации │├──────────────────────────────────────────────────────────────────┤│ 5. ПРОЗРАЧНОСТЬ ││ Проприетарные: Черный ящик, неизвестные смещения ││ FinGPT: Полная видимость данных и методов обучения │└──────────────────────────────────────────────────────────────────┘Обзор архитектуры FinGPT
FinGPT использует модульный, дата-центричный подход:
┌──────────────────────────────────────────────────────────────────────────────┐│ АРХИТЕКТУРА FinGPT │├──────────────────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ СЛОЙ ДАННЫХ │ ││ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ ││ │ │ Новостные │ │ SEC-отчеты │ │ Соцсети │ │ Рыночные │ │ ││ │ │ API │ │ (EDGAR, │ │ (Twitter, │ │ данные │ │ ││ │ │ (Reuters) │ │ 10-K/Q) │ │ Reddit) │ │ (Bybit) │ │ ││ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ ││ │ │ │ │ │ │ ││ │ └────────────────┴────────────────┴────────────────┘ │ ││ │ │ │ ││ │ ▼ │ ││ │ ┌──────────────────────────────────────────────────────────────────┐ │ ││ │ │ ИНЖЕНЕРИЯ И ПРЕДОБРАБОТКА ДАННЫХ │ │ ││ │ │ • Очистка и нормализация финансового текста │ │ ││ │ │ • Извлечение структурированных данных (сущности, числа, даты) │ │ ││ │ │ • Создание наборов данных для обучения по инструкциям │ │ ││ │ └──────────────────────────────────────────────────────────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ СЛОЙ МОДЕЛИ │ ││ │ ┌──────────────────────────────────────────────────────────────────┐ │ ││ │ │ ВАРИАНТЫ БАЗОВЫХ МОДЕЛЕЙ │ │ ││ │ │ LLaMA-2 (7B/13B/70B) | Falcon | MPT | Mistral | ChatGLM │ │ ││ │ └────────────────────────────────┬─────────────────────────────────┘ │ ││ │ │ │ ││ │ ▼ │ ││ │ ┌──────────────────────────────────────────────────────────────────┐ │ ││ │ │ МЕТОДЫ ТОНКОЙ НАСТРОЙКИ │ │ ││ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ ││ │ │ │ LoRA │ │ QLoRA │ │ Полная настройка │ │ │ ││ │ │ │ (Низкоранг. │ │ (Квантов. │ │ (Ресурсоемкая) │ │ │ ││ │ │ │ адаптеры) │ │ LoRA) │ │ │ │ │ ││ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │ ││ │ └──────────────────────────────────────────────────────────────────┘ │ ││ │ │ │ ││ │ ▼ │ ││ │ ┌──────────────────────────────────────────────────────────────────┐ │ ││ │ │ ОБУЧЕНИЕ С ПОДКРЕПЛЕНИЕМ │ │ ││ │ │ RLSP - выравнивание прогнозов с реальной доходностью │ │ ││ │ └──────────────────────────────────────────────────────────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ СЛОЙ ПРИЛОЖЕНИЙ │ ││ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │ ││ │ │ Анализ │ │ Торговые │ │ Робо- │ │ Оценка рисков │ │ ││ │ │ настроений │ │ сигналы │ │ советник │ │ и комплаенс │ │ ││ │ └────────────┘ └────────────┘ └────────────┘ └────────────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ │└──────────────────────────────────────────────────────────────────────────────┘Ключевые особенности
-
Дата-центричный дизайн
- Автоматизированные пайплайны данных для финансовой информации в реальном времени
- Поддержка множества источников данных (новости, отчеты, соцсети)
- Встроенная очистка и предобработка данных
-
Эффективная тонкая настройка
- LoRA и QLoRA для параметрически-эффективного обучения
- Обучение на потребительских GPU (RTX 3090, 4090)
- Быстрая адаптация к новым доменам
-
Новые методы обучения
- RLSP (обучение с подкреплением на основе цен акций)
- Выравнивание выходов модели с реальной рыночной доходностью
- Улучшенная генерация торговых сигналов
-
Множество базовых моделей
- Поддержка LLaMA-2, Falcon, MPT, Mistral
- Выбор в зависимости от вашего оборудования и требований
- Легкая замена и эксперименты
Подход к обучению FinGPT
Дата-центричная архитектура
FinGPT делает акцент на качестве и актуальности данных, а не на размере модели:
# Концепция пайплайна данных FinGPTclass FinGPTDataPipeline: """ Получение и обработка данных в реальном времени для FinGPT. """
def __init__(self): self.sources = { "news": ["reuters", "finnhub", "alpaca_news"], "filings": ["sec_edgar"], "social": ["twitter", "reddit_wallstreetbets"], "market": ["yahoo_finance", "binance", "bybit"] }
def collect_data(self, source_type: str, symbols: list): """Сбор данных из указанных источников.""" pass
def preprocess(self, raw_data): """ Этапы предобработки: 1. Удаление дубликатов 2. Очистка HTML/спецсимволов 3. Нормализация дат и чисел 4. Извлечение сущностей 5. Создание формата instruction-following """ pass
def create_training_samples(self, data, task_type: str): """ Создание обучающих примеров.
Формат примера: { "instruction": "Проанализируйте настроение этого заголовка.", "input": "Apple отчитывается о рекордной выручке за Q4", "output": "ПОЗИТИВНОЕ. Заголовок указывает на сильные финансовые..." } """ passОбучение с подкреплением на основе цен акций (RLSP)
Ключевое нововведение FinGPT — это RLSP, который выравнивает прогнозы модели с реальными рыночными результатами:
RLSP: ОБУЧЕНИЕ С ПОДКРЕПЛЕНИЕМ НА ОСНОВЕ ЦЕН АКЦИЙ═══════════════════════════════════════════════════════════════════════════════
ТРАДИЦИОННЫЙ ПОДХОД (Метки настроений):┌─────────────────────────────────────────────────────────────────────────────┐│ ││ Текст новости ──────► LLM ──────► Настроение ──────► Торговый сигнал ││ │ (Людские метки) ││ │ ││ Проблема: Людские метки могут не коррелировать с реальным движением цен! ││ ││ "Apple сохраняет прогноз" → Человек: НЕЙТРАЛЬНО → Акция: ВВЕРХ на 5% ││ │└─────────────────────────────────────────────────────────────────────────────┘
ПОДХОД RLSP (Обратная связь от цен акций):┌─────────────────────────────────────────────────────────────────────────────┐│ ││ Текст новости ──────► LLM ──────► Прогноз ──────► Сравнение с ││ │ Реальной доходностью ││ │ │ ││ │◄─────────────── Награда/Потеря ◄──┘ ││ ││ Модель учится, какие новости РЕАЛЬНО двигают цены! ││ ││ "Apple сохраняет прогноз" → RLSP: +0.7 сигнал → Акция: ВВЕРХ на 5% ✓ ││ │└─────────────────────────────────────────────────────────────────────────────┘Концепция реализации RLSP:
def compute_rlsp_reward( prediction: float, # Прогноз направления модели (-1 до 1) actual_return: float, # Реальная доходность акции confidence: float # Уверенность модели) -> float: """ Расчет награды для обучения RLSP.
Args: prediction: Направленный прогноз модели actual_return: Реальная рыночная доходность confidence: Оценка уверенности модели
Returns: Сигнал награды для RL-обучения """ # Награда за правильное предсказание направления direction_match = (prediction * actual_return) > 0
if direction_match: # Положительная награда, масштабированная уверенностью и величиной reward = abs(actual_return) * confidence else: # Штраф за неверное направление reward = -abs(actual_return) * confidence
return rewardТонкая настройка с помощью LoRA
FinGPT использует LoRA для эффективной тонкой настройки:
LoRA: ПАРАМЕТРИЧЕСКИ-ЭФФЕКТИВНАЯ ТОНКАЯ НАСТРОЙКА═══════════════════════════════════════════════════════════════════════════════
ПОЛНАЯ ТОНКАЯ НАСТРОЙКА (Традиционная):┌─────────────────────────────────────────────────────────────────────────────┐│ Базовая модель: 7B параметров ──► Обновление ВСЕХ 7B параметров ││ ││ Требования: ││ • GPU-память: 80GB+ (A100) ││ • Время обучения: Дни или недели ││ • Стоимость: $$$$$ │└─────────────────────────────────────────────────────────────────────────────┘
LoRA НАСТРОЙКА (FinGPT):┌─────────────────────────────────────────────────────────────────────────────┐│ ││ Базовая модель (Заморожена): 7B + LoRA-адаптеры: 8M параметров ││ ┌────────────────────┐ ┌────────────────┐ ││ │ │ │ │ ││ │ W (оригинал) │ + │ BA (LoRA) │ ││ │ [4096 x 4096] │ │ [4096 x r] │ ││ │ (ЗАМОРОЖЕН) │ │ x [r x 4096] │ ││ │ │ │ r = 8 (ранг) │ ││ └────────────────────┘ │ (ОБУЧАЕМЫЕ) │ ││ └────────────────┘ ││ ││ Требования: ││ • GPU-память: 16GB (RTX 4090) ││ • Время обучения: Часы ││ • Стоимость: $ │└─────────────────────────────────────────────────────────────────────────────┘Конфигурация LoRA для FinGPT:
from peft import LoraConfig, get_peft_model
# Конфигурация LoRA для FinGPTlora_config = LoraConfig( r=8, # Ранг матриц адаптации lora_alpha=32, # Коэффициент масштабирования target_modules=[ # Какие слои адаптировать "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj" ], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM")
# Применение LoRA к базовой моделиmodel = get_peft_model(base_model, lora_config)
# Вывод обучаемых параметровtrainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)total_params = sum(p.numel() for p in model.parameters())print(f"Обучаемые: {trainable_params:,} / {total_params:,} = {100*trainable_params/total_params:.2f}%")# Вывод: Обучаемые: 8,388,608 / 6,738,415,616 = 0.12%Торговые приложения
Анализ настроений
FinGPT отлично справляется с анализом финансовых настроений:
# Пример: промпт анализа настроений FinGPTprompt = """Инструкция: Какое настроение этой новости? Выберите ответ из {негативное/нейтральное/позитивное}.
Ввод: NVIDIA сообщает о рекордной выручке благодаря спросу на AI-чипы, акции выросли на 10%.
Ответ:"""
# Ответ FinGPT: "позитивное"Результаты бенчмарков (Точность):
| Датасет | FinGPT-LLaMA | FinBERT | ChatGPT | BloombergGPT |
|---|---|---|---|---|
| FPB (Financial PhraseBank) | 87.2% | 86.5% | 78.3% | - |
| FiQA-SA | 85.4% | 83.7% | 73.2% | - |
| TFNS (Twitter Financial) | 82.1% | 80.3% | 71.5% | - |
| Headlines | 79.8% | 77.2% | 68.4% | - |
Торговые сигналы на основе новостей
Преобразование настроений в действенные сигналы:
class FinGPTSignalGenerator: """Генерация торговых сигналов на основе анализа настроений FinGPT."""
def __init__(self, model, confidence_threshold: float = 0.7): self.model = model self.confidence_threshold = confidence_threshold
# Маппинг сигналов self.sentiment_to_signal = { "positive": 1.0, "neutral": 0.0, "negative": -1.0 }
def generate_signal( self, news: str, symbol: str ) -> dict: """ Генерация торгового сигнала из новостного текста.
Returns: dict с сигналом, уверенностью и обоснованием """ # Получение прогноза FinGPT prompt = self._create_prompt(news) response = self.model.generate(prompt)
sentiment, confidence = self._parse_response(response)
if confidence < self.confidence_threshold: return { "symbol": symbol, "signal": 0.0, "action": "HOLD", "confidence": confidence, "reason": "Низкая уверенность прогноза" }
signal = self.sentiment_to_signal[sentiment] * confidence
return { "symbol": symbol, "signal": signal, "action": "BUY" if signal > 0.3 else "SELL" if signal < -0.3 else "HOLD", "confidence": confidence, "reason": f"Настроение: {sentiment}" }Анализ криптовалют
FinGPT поддерживает анализ крипторынка с данными Bybit:
class CryptoAnalyzer: """Анализ криптовалютных рынков с помощью FinGPT."""
def __init__(self, fingpt_model, bybit_client): self.model = fingpt_model self.bybit = bybit_client
async def analyze_crypto_news( self, symbol: str = "BTCUSDT", news_items: list = None ) -> dict: """ Анализ крипто-новостей и генерация торговых сигналов.
Args: symbol: Торговая пара (например, BTCUSDT) news_items: Список новостных заголовков
Returns: Анализ с настроением и сигналом """ # Получение данных о ценах с Bybit price_data = await self.bybit.get_klines( symbol=symbol, interval="1h", limit=24 )
# Анализ каждой новости signals = [] for news in news_items: signal = self._analyze_single_news(news, symbol) signals.append(signal)
# Агрегация сигналов avg_signal = sum(s["signal"] for s in signals) / len(signals)
return { "symbol": symbol, "current_price": price_data[-1]["close"], "24h_change": self._calc_change(price_data), "news_signal": avg_signal, "recommendation": self._get_recommendation(avg_signal), "individual_signals": signals }Практические примеры
Полные примеры доступны в каталоге python/examples/:
01_sentiment_demo.py— Анализ настроений финансовых текстов02_signal_generation.py— Генерация торговых сигналов из новостей03_crypto_bybit.py— Анализ криптовалют с данными Bybit04_backtest_demo.py— Бэктестинг стратегий на основе FinGPT
Реализация на Rust
rust_fingpt/├── Cargo.toml├── README.md├── src/│ ├── lib.rs # Основные экспорты библиотеки│ ├── sentiment.rs # Анализ настроений│ ├── signals.rs # Генерация торговых сигналов│ ├── backtest.rs # Движок бэктестинга│ ├── data.rs # Загрузка рыночных данных│ ├── api.rs # Клиенты внешних API│ └── error.rs # Типы ошибок└── src/bin/ ├── sentiment_demo.rs # Демо анализа настроений ├── signal_demo.rs # Демо генерации сигналов ├── crypto_demo.rs # Крипто-анализ с Bybit └── backtest_demo.rs # Демо бэктестингаБыстрый старт (Rust)
cd rust_fingpt
# Запуск демо анализа настроенийcargo run --bin sentiment_demo
# Генерация торговых сигналовcargo run --bin signal_demo -- --symbol AAPL
# Крипто-анализ с Bybitcargo run --bin crypto_demo -- --symbol BTCUSDT
# Запуск бэктестаcargo run --bin backtest_demo -- --start 2024-01-01 --end 2024-12-31Реализация на Python
python/├── __init__.py├── fingpt_sentiment.py # Анализ настроений├── signals.py # Генерация торговых сигналов├── backtest.py # Движок бэктестинга├── data_loader.py # Утилиты загрузки данных├── bybit_client.py # Клиент API Bybit├── requirements.txt # Зависимости└── examples/ ├── 01_sentiment_demo.py ├── 02_signal_generation.py ├── 03_crypto_bybit.py └── 04_backtest_demo.pyБыстрый старт (Python)
cd python
# Установка зависимостейpip install -r requirements.txt
# Запуск анализа настроенийpython examples/01_sentiment_demo.py
# Генерация торговых сигналовpython examples/02_signal_generation.py
# Крипто-анализpython examples/03_crypto_bybit.py
# Запуск бэктестаpython examples/04_backtest_demo.pyСравнение с другими моделями
| Особенность | FinGPT | BloombergGPT | FinBERT | ChatGPT |
|---|---|---|---|---|
| Открытый код | ✅ Да | ❌ Нет | ✅ Да | ❌ Нет |
| Финансовое обучение | ✅ Обширное | ✅ Обширное | ✅ Финансовое | ❌ Общее |
| Настраиваемость | ✅ LoRA настройка | ❌ Фиксирован | ✅ Настраиваемый | ❌ Только API |
| Реальные данные | ✅ Пайплайны данных | ❌ Статическое | ❌ Статическое | ❌ Отсечка знаний |
| RLSP обучение | ✅ Да | ❌ Нет | ❌ Нет | ❌ Нет |
| Размеры моделей | 7B-70B | 50B | 110M | ~1T |
| Требования к оборудованию | Потребительский GPU | Датацентр | Низкие | API |
| Стоимость | Бесплатно | $$$$$ | Бесплатно | $$ |
Лучшие практики
Когда использовать FinGPT
Идеальные случаи использования:
- Анализ настроений финансовых новостей
- Построение собственных пайплайнов торговых сигналов
- Исследования и эксперименты
- Приложения с ограниченным бюджетом
- Собственный хостинг
Рассмотрите альтернативы когда:
- Требуется сверхнизкая задержка (используйте FinBERT)
- Критична максимальная точность (рассмотрите коммерческие решения)
- Нет опыта в ML (используйте ChatGPT API)
Советы по тонкой настройке
-
Качество данных
# Всегда очищайте и валидируйте обучающие данныеdef clean_financial_text(text: str) -> str:# Удаление HTMLtext = re.sub(r'<[^>]+>', '', text)# Нормализация пробеловtext = ' '.join(text.split())# Сохранение финансовых сущностейreturn text -
Конфигурация LoRA
# Рекомендуемые настройки для FinGPTlora_config = LoraConfig(r=8, # Начните с r=8, увеличьте при недообученииlora_alpha=32, # alpha = 4 * r — распространенная практикаtarget_modules=[ # Целевые слои внимания"q_proj", "v_proj", "k_proj", "o_proj"],lora_dropout=0.05, # Легкая регуляризация) -
Гиперпараметры обучения
training_args = TrainingArguments(learning_rate=2e-4, # Выше, чем при полной настройкеnum_train_epochs=3, # Обычно достаточноper_device_train_batch_size=4,gradient_accumulation_steps=4, # Эффективный batch=16warmup_steps=100,fp16=True, # Смешанная точность)
Ресурсы
Научные статьи
- FinGPT: Open-Source Financial Large Language Models — Оригинальная статья FinGPT (2023)
- FinGPT-HPC: Efficient Pretraining and Fine-tuning — Высокопроизводительные вычисления для FinGPT
- Instruct-FinGPT: Financial Sentiment Analysis — Обучение по инструкциям для финансов
Репозитории
- FinGPT Official — Основной репозиторий FinGPT
- FinRL — Сопутствующая библиотека RL
- FinNLP — Инструменты финансовой NLP
Связанные главы
- Глава 62: BloombergGPT Trading — Проприетарная альтернатива
- Глава 241: FinBERT Sentiment — Меньшая, быстрая модель
- Глава 67: LLM Sentiment Analysis — Глубокий анализ настроений
- Глава 70: Fine-tuning LLM for Finance — Продвинутая настройка
Уровень сложности
Средний — Продвинутый
Предварительные требования:
- Понимание архитектуры трансформеров и LLM
- Опыт программирования на Python
- Базовые знания о финансовых рынках
- Знакомство с PyTorch (для тонкой настройки)
Ссылки
- Yang, H., et al. (2023). “FinGPT: Open-Source Financial Large Language Models.” arXiv:2306.06031
- Liu, X., et al. (2023). “FinGPT-HPC: Efficient Pretraining and Finetuning Large Language Models for Financial Applications.”
- Wu, S., et al. (2023). “BloombergGPT: A Large Language Model for Finance.” arXiv:2303.17564
- Araci, D. (2019). “FinBERT: Financial Sentiment Analysis with Pre-trained Language Models.”