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

Глава 66: Chain-of-Thought Trading — Объяснимые торговые решения на основе LLM

В этой главе рассматривается применение Chain-of-Thought (CoT) промптинга для торговых приложений. Мы изучим, как пошаговое рассуждение больших языковых моделей может генерировать объяснимые, прозрачные торговые сигналы с полным аудиторским следом процесса принятия решений.

Содержание

  1. Введение в Chain-of-Thought Trading
  2. Основы Chain-of-Thought
  3. Торговые приложения
  4. Практические примеры
  5. Реализация на Rust
  6. Реализация на Python
  7. Лучшие практики
  8. Ресурсы

Введение в 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-сигналы

АспектТрадиционный MLChain-of-Thought
ОбъяснимостьНизкая (чёрный ящик)Высокая (полное рассуждение)
Регуляторное соответствиеСложноПросто
ОтладкаТрудноЛегко (проверка каждого шага)
Человеческий контрольОграниченЕстественная интеграция
АдаптивностьТребует переобученияМодификация промпта
Вычислительная стоимостьНиже (один инференс)Выше (длинная генерация)
КонсистентностьВысокаяТребует техник (self-consistency)

Ключевые преимущества

  1. Регуляторное соответствие

    • Полный аудиторский след для каждого торгового решения
    • Объяснимое обоснование для регуляторов
    • Документация рисковых соображений
  2. Управление рисками

    • Явное рассуждение о негативных сценариях
    • Чёткая артикуляция логики размера позиции
    • Прозрачное обоснование стоп-лоссов и тейк-профитов
  3. Человеко-машинное взаимодействие

    • Трейдеры могут проверять рассуждения LLM
    • Легко выявить ошибочную логику
    • Естественная интеграция с принятием решений человеком
  4. Непрерывное улучшение

    • Анализ цепочек рассуждений на паттерны
    • Выявление систематических предубеждений
    • Улучшение промптов на основе результатов

Основы 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-анализ

python/01_cot_analysis.py
import os
from typing import Dict, List, Optional
from dataclasses import dataclass
from datetime import datetime
import json
import re
@dataclass
class ReasoningStep:
"""Один шаг в цепочке рассуждений."""
step_number: int
title: str
reasoning: str
conclusion: str
@dataclass
class 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 с полной цепочкой рассуждений
"""
# Реализация анализа...
pass

02: Многошаговая генерация сигналов

python/02_signal_generation.py
from enum import Enum
from dataclasses import dataclass, field
from typing import Dict, List, Tuple
import numpy as np
class Signal(Enum):
STRONG_BUY = 2
BUY = 1
HOLD = 0
SELL = -1
STRONG_SELL = -2
@dataclass
class 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: Агрегация и решение
pass

03: Размер позиции с учётом риска

python/03_position_sizing.py
@dataclass
class 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. Финальная рекомендация
"""
pass

04: Полный конвейер бэктестинга

python/04_backtest.py
@dataclass
class 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_trading
cargo build --release
cargo 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 python
pip install -r requirements.txt
python examples/01_basic_analysis.py

Лучшие практики

1. Инжиниринг промптов для трейдинга

# ПРАВИЛЬНО: Будьте конкретны в структуре анализа
prompt = """
Анализируй используя эти конкретные шаги:
1. Проверь RSI на перепроданность/перекупленность
2. Подтверди направление пересечения MACD
3. Убедись, что объём поддерживает движение цены
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)

Распространённые ошибки

  1. Чрезмерная зависимость от рассуждений LLM: Всегда валидируйте количественными бэктестами
  2. Непоследовательные рассуждения: Используйте self-consistency и настройку temperature
  3. Лимиты токенов: Разбивайте длинные анализы на фокусированные поданализы
  4. Задержка в живом трейдинге: Предрассчитывайте шаблоны рассуждений, используйте кэширование
  5. Галлюцинированные данные: Всегда проверяйте, что LLM не придумывает рыночные данные

Ресурсы

Научные работы

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

  2. Self-Consistency Improves Chain of Thought Reasoning in Language Models

  3. Large Language Models are Zero-Shot Reasoners

Открытые альтернативы

  • LangChain: Фреймворк для цепочки вызовов LLM
  • Guidance: Ограниченная генерация для структурированных выходов
  • DSPy: Программный фреймворк для конвейеров LLM

Связанные главы

Уровень сложности

Средний до Продвинутого

Предварительные требования

  • Понимание техник промптинга LLM
  • Базовые знания торговых индикаторов
  • Опыт программирования на Python
  • Знакомство с концепциями бэктестинга

Навыки, которые вы освоите

  • Chain-of-Thought промптинг для финансов
  • Объяснимый ИИ в трейдинге
  • Системы многошагового рассуждения
  • Реализация аудиторского следа для соответствия требованиям

Ссылки

  1. Wei, J., et al. (2022). “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.” NeurIPS 2022.

  2. Wang, X., et al. (2023). “Self-Consistency Improves Chain of Thought Reasoning in Language Models.” ICLR 2023.

  3. Kojima, T., et al. (2022). “Large Language Models are Zero-Shot Reasoners.” NeurIPS 2022.

  4. Brown, T., et al. (2020). “Language Models are Few-Shot Learners.” NeurIPS 2020.

  5. OpenAI. (2023). “GPT-4 Technical Report.” arXiv:2303.08774.