Глава 66: Chain-of-Thought Trading — Объяснимые торговые решения на основе LLM
В этой главе рассматривается применение Chain-of-Thought (CoT) промптинга для торговых приложений. Мы изучим, как пошаговое рассуждение больших языковых моделей может генерировать объяснимые, прозрачные торговые сигналы с полным аудиторским следом процесса принятия решений.
Содержание
- Введение в Chain-of-Thought Trading
- Основы Chain-of-Thought
- Торговые приложения
- Практические примеры
- Реализация на Rust
- Реализация на Python
- Лучшие практики
- Ресурсы
Введение в Chain-of-Thought Trading
Chain-of-Thought промптинг революционизирует использование LLM для трейдинга, делая процесс рассуждений явным и проверяемым. Вместо простого сигнала “покупать” или “продавать” мы получаем полную разбивку учтённых факторов и того, как они привели к финальному решению.
Почему объяснимость важна в трейдинге
ТРАДИЦИОННЫЕ ML-ТОРГОВЫЕ СИГНАЛЫ:┌──────────────────────────────────────────────────────────────────┐│ Вход: Рыночные данные + Новости + Индикаторы ││ │ ││ ▼ ││ ┌──────────────┐ ││ │ ЧЁРНЫЙ ЯЩИК │ ││ │ МОДЕЛЬ │ ││ └──────────────┘ ││ │ ││ ▼ ││ Выход: "ПОКУПАТЬ" (уверенность: 0.73) ││ ││ Проблема: ПОЧЕМУ покупать? Мы не знаем! │└──────────────────────────────────────────────────────────────────┘
CHAIN-OF-THOUGHT TRADING:┌──────────────────────────────────────────────────────────────────┐│ Вход: Рыночные данные + Новости + Индикаторы ││ │ ││ ▼ ││ Шаг 1: "RSI на уровне 32, указывает на перепроданность..." ││ │ ││ ▼ ││ Шаг 2: "Последняя прибыль превысила ожидания на 15%..." ││ │ ││ ▼ ││ Шаг 3: "Секторный моментум положительный, аналоги +3%..." ││ │ ││ ▼ ││ Шаг 4: "Соотношение риск/доходность благоприятно для лонга..." ││ │ ││ ▼ ││ Выход: "ПОКУПАТЬ" с полной цепочкой рассуждений ││ ││ Преимущество: Полный аудиторский след для каждого решения! │└──────────────────────────────────────────────────────────────────┘CoT vs традиционные ML-сигналы
| Аспект | Традиционный ML | Chain-of-Thought |
|---|---|---|
| Объяснимость | Низкая (чёрный ящик) | Высокая (полное рассуждение) |
| Регуляторное соответствие | Сложно | Просто |
| Отладка | Трудно | Легко (проверка каждого шага) |
| Человеческий контроль | Ограничен | Естественная интеграция |
| Адаптивность | Требует переобучения | Модификация промпта |
| Вычислительная стоимость | Ниже (один инференс) | Выше (длинная генерация) |
| Консистентность | Высокая | Требует техник (self-consistency) |
Ключевые преимущества
-
Регуляторное соответствие
- Полный аудиторский след для каждого торгового решения
- Объяснимое обоснование для регуляторов
- Документация рисковых соображений
-
Управление рисками
- Явное рассуждение о негативных сценариях
- Чёткая артикуляция логики размера позиции
- Прозрачное обоснование стоп-лоссов и тейк-профитов
-
Человеко-машинное взаимодействие
- Трейдеры могут проверять рассуждения LLM
- Легко выявить ошибочную логику
- Естественная интеграция с принятием решений человеком
-
Непрерывное улучшение
- Анализ цепочек рассуждений на паттерны
- Выявление систематических предубеждений
- Улучшение промптов на основе результатов
Основы Chain-of-Thought
Техника CoT-промптинга
Chain-of-Thought промптинг, представленный Wei et al. (2022), позволяет LLM декомпозировать сложные задачи на промежуточные шаги рассуждения:
# Стандартный промптингprompt_standard = """Проанализируй акции AAPL и дай торговый сигнал."""# Выход: "Покупать" (без объяснения)
# Chain-of-Thought промптингprompt_cot = """Проанализируй акции AAPL и дай торговый сигнал.Рассуждай пошагово:
1. Сначала проанализируй текущее ценовое движение и технические индикаторы2. Затем рассмотри недавние фундаментальные события3. Далее оцени рыночный сентимент и секторные тренды4. Оцени соотношение риск/доходность5. Наконец, дай торговую рекомендацию с обоснованием"""# Выход: Детальный пошаговый анализ с финальной рекомендациейZero-Shot vs Few-Shot CoT
Zero-Shot CoT: Просто добавьте “Давай рассуждать пошагово” к промпту
zero_shot_cot = """Даны следующие рыночные данные для BTCUSDT:- Текущая цена: $43,250- Изменение за 24ч: +2.3%- RSI(14): 58- Объём: 1.2x от среднего
Стоит ли открывать длинную позицию?
Давай рассуждать пошагово."""Few-Shot CoT: Предоставьте примеры цепочек рассуждений
few_shot_cot = """Пример 1:Рынок: ETHUSDT по $2,150, RSI: 28, Объём: 2x от среднегоАнализ:Шаг 1: RSI на 28 указывает на зону перепроданности (ниже 30)Шаг 2: Высокий объём говорит о сильном интересе на этих уровняхШаг 3: Такая комбинация часто предшествует отскокуРешение: ЛОНГ с плотным стопом на $2,050
Пример 2:Рынок: BTCUSDT по $45,000, RSI: 72, Объём: 0.8x от среднегоАнализ:Шаг 1: RSI на 72 указывает на перекупленностьШаг 2: Объём ниже среднего говорит о слабом моментумеШаг 3: Риск отката повышенРешение: СОКРАТИТЬ позицию или остаться в КЭШЕ
Теперь проанализируй:Рынок: SOLUSDT по $98, RSI: 45, Объём: 1.5x от среднего"""Self-Consistency декодирование
Для более надёжных торговых сигналов можно использовать self-consistency:
SELF-CONSISTENCY ДЛЯ ТОРГОВЫХ РЕШЕНИЙ═══════════════════════════════════════════════════════════════════
Вход: Запрос на анализ рынка
┌─────────────────────┐ │ Один промпт │ │ несколько раз │ └─────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Путь 1 │ │ Путь 2 │ │ Путь 3 │ │Рассужд-е │ │Рассужд-е │ │Рассужд-е │ └──────────┘ └──────────┘ └──────────┘ │ │ │ ▼ ▼ ▼ ПОКУПАТЬ ПОКУПАТЬ ДЕРЖАТЬ 0.8 0.6 0.4
┌─────────────────────┐ │Мажоритарный голос: │ │ПОКУПАТЬ (2/3 путей) │ │Средн. уверенн.: 0.6 │ └─────────────────────┘
Преимущество: Более надёжные решения за счёт выборки нескольких путей рассужденияТорговые приложения
Анализ рынка с CoT
MARKET_ANALYSIS_PROMPT = """Вы - эксперт-количественный аналитик. Проанализируйте следующие рыночные данныеи предоставьте комплексную оценку.
=== РЫНОЧНЫЕ ДАННЫЕ ===Актив: {symbol}Текущая цена: ${price}Изменение за 24ч: {change_24h}%Изменение за 7д: {change_7d}%
Технические индикаторы:- RSI(14): {rsi}- MACD: {macd} (Сигнал: {macd_signal})- Полосы Боллинджера: Нижняя={bb_lower}, Средняя={bb_middle}, Верхняя={bb_upper}- ATR(14): {atr}
Анализ объёма:- Текущий объём: {volume}- Средний объём за 20 дней: {avg_volume}- Отношение объёма: {volume_ratio}x
=== СТРУКТУРА АНАЛИЗА ===Продумайте каждый шаг тщательно:
ШАГ 1 - АНАЛИЗ ТРЕНДА:Проанализируйте текущее направление и силу тренда на основе ценового движенияи скользящих средних.
ШАГ 2 - ОЦЕНКА МОМЕНТУМА:Оцените моментум используя RSI и MACD. Выявите дивергенции.
ШАГ 3 - КОНТЕКСТ ВОЛАТИЛЬНОСТИ:Рассмотрите текущую волатильность (ATR, Полосы Боллинджера) и её влияниена размер позиции и установку стопов.
ШАГ 4 - ПОДТВЕРЖДЕНИЕ ОБЪЁМОМ:Оцените, поддерживает ли объём текущее ценовое движение.
ШАГ 5 - РАСЧЁТ РИСК/ДОХОДНОСТЬ:Рассчитайте потенциальные уровни входа, стоп-лосса и тейк-профита.Определите соотношение риск/доходность.
ШАГ 6 - ФИНАЛЬНАЯ РЕКОМЕНДАЦИЯ:Дайте чёткий торговый сигнал (СИЛЬНО ПОКУПАТЬ, ПОКУПАТЬ, ДЕРЖАТЬ, ПРОДАВАТЬ, СИЛЬНО ПРОДАВАТЬ)с уровнем уверенности и конкретными действиями.
Начните анализ:"""Цепочки оценки риска
RISK_ASSESSMENT_PROMPT = """Вы - риск-менеджер в квантовой торговой фирме. Оценитеследующую предлагаемую сделку используя структурированную оценку рисков.
=== ПРЕДЛАГАЕМАЯ СДЕЛКА ===Актив: {symbol}Направление: {direction}Цена входа: ${entry}Размер позиции: ${size}Стоимость счёта: ${account_value}Текущие позиции: {current_positions}
=== ЦЕПОЧКА ОЦЕНКИ РИСКОВ ===
ШАГ 1 - РИСК РАЗМЕРА ПОЗИЦИИ:Какой процент портфеля представляет эта сделка?Находится ли это в допустимых пределах концентрации?
ШАГ 2 - КОРРЕЛЯЦИОННЫЙ РИСК:Как эта позиция коррелирует с существующими активами?Увеличивает или уменьшает диверсификацию портфеля?
ШАГ 3 - РИСК ЛИКВИДНОСТИ:Можно ли быстро выйти из этой позиции при необходимости?Каково ожидаемое проскальзывание при экстренном выходе?
ШАГ 4 - ХВОСТОВОЙ РИСК:Каков худший сценарий для этой сделки?Как движение в 3 сигмы повлияет на портфель?
ШАГ 5 - АЛЬТЕРНАТИВНЫЕ ИЗДЕРЖКИ:Какой капитал выделяется на эту сделку?Есть ли лучшие возможности с учётом риска?
ШАГ 6 - РЕШЕНИЕ ПО РИСКУ:ОДОБРИТЬ, ОДОБРИТЬ С ИЗМЕНЕНИЯМИ, или ОТКЛОНИТЬЕсли нужны изменения, укажите:- Скорректированный размер позиции- Необходимые хеджи- Требования к стоп-лоссу
Предоставьте оценку рисков:"""Практические примеры
01: Базовый CoT-анализ
import osfrom typing import Dict, List, Optionalfrom dataclasses import dataclassfrom datetime import datetimeimport jsonimport re
@dataclassclass ReasoningStep: """Один шаг в цепочке рассуждений.""" step_number: int title: str reasoning: str conclusion: str
@dataclassclass CoTAnalysis: """Полный результат chain-of-thought анализа.""" symbol: str timestamp: datetime steps: List[ReasoningStep] final_signal: str confidence: float reasoning_summary: str raw_response: str
class ChainOfThoughtAnalyzer: """ Chain-of-Thought торговый анализатор на основе LLM.
Демонстрирует использование CoT-промптинга для объяснимых торговых решений. """
def __init__( self, model: str = "gpt-4", temperature: float = 0.3, api_key: Optional[str] = None ): self.model = model self.temperature = temperature self.api_key = api_key or os.getenv("OPENAI_API_KEY") self._client = None
def analyze( self, symbol: str, market_data: Dict, news: Optional[List[str]] = None ) -> CoTAnalysis: """ Выполнить chain-of-thought анализ рыночных данных.
Args: symbol: Торговый символ market_data: Словарь с ценой, индикаторами и т.д. news: Необязательный список последних новостных заголовков
Returns: CoTAnalysis с полной цепочкой рассуждений """ # Реализация анализа... pass02: Многошаговая генерация сигналов
from enum import Enumfrom dataclasses import dataclass, fieldfrom typing import Dict, List, Tupleimport numpy as np
class Signal(Enum): STRONG_BUY = 2 BUY = 1 HOLD = 0 SELL = -1 STRONG_SELL = -2
@dataclassclass CoTSignal: """Торговый сигнал с chain-of-thought обоснованием.""" symbol: str signal: Signal confidence: float reasoning_chain: List[str] entry_price: Optional[float] = None stop_loss: Optional[float] = None take_profit: Optional[float] = None position_size_pct: float = 0.0
class MultiStepSignalGenerator: """ Генерация торговых сигналов с многошаговым рассуждением.
Каждый сигнал создаётся через цепочку аналитических шагов, обеспечивая полную прозрачность процесса принятия решений. """
def generate_signal( self, symbol: str, price_data: Dict, indicators: Dict, fundamentals: Optional[Dict] = None, sentiment: Optional[Dict] = None ) -> CoTSignal: """ Генерация торгового сигнала с полной цепочкой рассуждений. """ # Шаг 1: Анализ тренда # Шаг 2: Анализ моментума # Шаг 3: Анализ объёма # Шаг 4: Анализ сентимента # Шаг 5: Расчёт риск/доходность # Шаг 6: Агрегация и решение pass03: Размер позиции с учётом риска
@dataclassclass PositionSizeResult: """Результат расчёта размера позиции с обоснованием.""" symbol: str recommended_size: float size_in_units: int risk_amount: float reasoning_chain: List[str] risk_metrics: Dict[str, float]
class CoTPositionSizer: """ Chain-of-Thought определение размера позиции.
Использует явные шаги рассуждения для определения оптимальных размеров позиций на основе толерантности к риску, размера счёта и рыночных условий. """
def calculate_position_size( self, symbol: str, entry_price: float, stop_loss: float, signal_confidence: float, current_positions: Optional[Dict[str, float]] = None, correlations: Optional[Dict[str, float]] = None, volatility: Optional[float] = None ) -> PositionSizeResult: """ Расчёт размера позиции с явной цепочкой рассуждений.
Шаги: 1. Расчёт риска на единицу 2. Базовый размер из толерантности к риску 3. Корректировка по уверенности 4. Корректировка по волатильности 5. Проверка корреляционных ограничений 6. Применение максимального размера позиции 7. Финальная рекомендация """ pass04: Полный конвейер бэктестинга
@dataclassclass BacktestResult: """Результаты бэктестинга с полным аудитом рассуждений.""" trades: List[Trade] equity_curve: pd.Series metrics: Dict[str, float] reasoning_audit: List[Dict]
class CoTBacktester: """ Бэктестинг Chain-of-Thought торговых стратегий.
Этот бэктестер сохраняет полные аудиторские следы всех цепочек рассуждений, приведших к торговым решениям. """
def run( self, prices: pd.DataFrame, signal_generator, start_date: Optional[datetime] = None, end_date: Optional[datetime] = None ) -> BacktestResult: """ Запуск бэктеста на исторических данных.
Returns: BacktestResult со сделками, кривой капитала и аудитом рассуждений """ passРеализация на Rust
Реализация на Rust обеспечивает высокопроизводительный Chain-of-Thought торговый анализ.
Структура проекта
rust_cot_trading/├── Cargo.toml├── src/│ ├── lib.rs│ ├── analysis.rs # Логика CoT-анализа│ ├── signals.rs # Генерация сигналов│ ├── position.rs # Размер позиции│ ├── backtest.rs # Движок бэктестинга│ ├── data.rs # Загрузка данных│ ├── api.rs # Клиент LLM API│ └── bin/│ ├── analysis_demo.rs│ ├── signal_demo.rs│ └── backtest_demo.rsБыстрый старт (Rust)
cd rust_cot_tradingcargo build --releasecargo run --bin analysis_demoРеализация на Python
Структура директорий
python/├── __init__.py├── cot_analyzer.py # Chain-of-Thought анализатор├── signal_generator.py # Многошаговая генерация сигналов├── position_sizer.py # Размер позиции с рассуждениями├── backtest.py # Движок бэктестинга├── data_loader.py # Утилиты загрузки данных├── requirements.txt└── examples/ ├── 01_basic_analysis.py ├── 02_signal_generation.py ├── 03_position_sizing.py └── 04_backtest_demo.pyБыстрый старт (Python)
cd pythonpip install -r requirements.txtpython examples/01_basic_analysis.pyЛучшие практики
1. Инжиниринг промптов для трейдинга
# ПРАВИЛЬНО: Будьте конкретны в структуре анализаprompt = """Анализируй используя эти конкретные шаги:1. Проверь RSI на перепроданность/перекупленность2. Подтверди направление пересечения MACD3. Убедись, что объём поддерживает движение цены4. Рассчитай соотношение риск/доходность5. Дай конкретные вход, стоп и цель"""
# НЕПРАВИЛЬНО: Используйте размытые промптыprompt = "Скажи, стоит ли покупать эту акцию"2. Self-Consistency для надёжности
def get_reliable_signal(analyzer, data, n_samples=5): """Используйте self-consistency для более надёжных сигналов.""" signals = [] for _ in range(n_samples): result = analyzer.analyze(data) signals.append(result.final_signal)
# Мажоритарное голосование from collections import Counter most_common = Counter(signals).most_common(1)[0]
return { 'signal': most_common[0], 'agreement': most_common[1] / n_samples, 'all_signals': signals }3. Аудиторский след рассуждений
class AuditableAnalyzer: """Ведение полного аудиторского следа для соответствия требованиям."""
def __init__(self): self.audit_log = []
def analyze(self, symbol, data): result = self._perform_analysis(symbol, data)
# Логирование для аудита self.audit_log.append({ 'timestamp': datetime.now(), 'symbol': symbol, 'input_data': data, 'reasoning_chain': result.reasoning_chain, 'signal': result.signal, 'confidence': result.confidence })
return result
def export_audit(self, filepath): """Экспорт аудиторского следа для проверки соответствия.""" with open(filepath, 'w') as f: json.dump(self.audit_log, f, indent=2, default=str)Распространённые ошибки
- Чрезмерная зависимость от рассуждений LLM: Всегда валидируйте количественными бэктестами
- Непоследовательные рассуждения: Используйте self-consistency и настройку temperature
- Лимиты токенов: Разбивайте длинные анализы на фокусированные поданализы
- Задержка в живом трейдинге: Предрассчитывайте шаблоны рассуждений, используйте кэширование
- Галлюцинированные данные: Всегда проверяйте, что LLM не придумывает рыночные данные
Ресурсы
Научные работы
-
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
- Wei et al., 2022
- https://arxiv.org/abs/2201.11903
-
Self-Consistency Improves Chain of Thought Reasoning in Language Models
- Wang et al., 2023
- https://arxiv.org/abs/2203.11171
-
Large Language Models are Zero-Shot Reasoners
- Kojima et al., 2022
- https://arxiv.org/abs/2205.11916
Открытые альтернативы
- LangChain: Фреймворк для цепочки вызовов LLM
- Guidance: Ограниченная генерация для структурированных выходов
- DSPy: Программный фреймворк для конвейеров LLM
Связанные главы
- Глава 61: FinGPT Financial LLM
- Глава 62: BloombergGPT Trading
- Глава 65: RAG для трейдинга
- Глава 71: Prompt Engineering Trading
Уровень сложности
Средний до Продвинутого
Предварительные требования
- Понимание техник промптинга LLM
- Базовые знания торговых индикаторов
- Опыт программирования на Python
- Знакомство с концепциями бэктестинга
Навыки, которые вы освоите
- Chain-of-Thought промптинг для финансов
- Объяснимый ИИ в трейдинге
- Системы многошагового рассуждения
- Реализация аудиторского следа для соответствия требованиям
Ссылки
-
Wei, J., et al. (2022). “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.” NeurIPS 2022.
-
Wang, X., et al. (2023). “Self-Consistency Improves Chain of Thought Reasoning in Language Models.” ICLR 2023.
-
Kojima, T., et al. (2022). “Large Language Models are Zero-Shot Reasoners.” NeurIPS 2022.
-
Brown, T., et al. (2020). “Language Models are Few-Shot Learners.” NeurIPS 2020.
-
OpenAI. (2023). “GPT-4 Technical Report.” arXiv:2303.08774.