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

Глава 63: LLM Alpha Mining — Генерация торговых факторов с помощью больших языковых моделей

В этой главе рассматривается LLM Alpha Mining — передовой подход, использующий большие языковые модели для автоматического обнаружения, генерации и оптимизации альфа-факторов для количественной торговли. Мы изучим, как LLM могут обрабатывать разнообразные источники финансовых данных для создания торговых сигналов, превосходящих традиционные методы поиска факторов.

Содержание

  1. Введение в LLM Alpha Mining
  2. Архитектуры LLM Alpha Mining
  3. Применение в трейдинге
  4. Практические примеры
  5. Реализация на Rust
  6. Реализация на Python
  7. Лучшие практики
  8. Ресурсы

Введение в LLM Alpha Mining

Что такое Alpha Mining?

Alpha Mining — это процесс поиска торговых сигналов (альфа-факторов), которые могут предсказывать будущую доходность активов. Традиционные количественные аналитики тратят месяцы на ручное создание математических выражений и их тестирование на исторических данных.

ТРАДИЦИОННЫЙ ПРОЦЕСС ALPHA MINING:
┌─────────────────────────────────────────────────────────────────────┐
│ 1. ФОРМИРОВАНИЕ ГИПОТЕЗЫ │
│ Квант: "Может быть, моментум за 20 дней предсказывает доходность"│
│ Время: От дней до недель │
├─────────────────────────────────────────────────────────────────────┤
│ 2. КОНСТРУИРОВАНИЕ ФАКТОРА │
│ Квант: Пишет математическую формулу │
│ Пример: alpha = (close - close_20d_ago) / close_20d_ago │
│ Время: От часов до дней │
├─────────────────────────────────────────────────────────────────────┤
│ 3. БЭКТЕСТИНГ │
│ Квант: Тестирует на исторических данных │
│ Результат: Sharpe = 0.8, IC = 0.03 │
│ Время: Часы │
├─────────────────────────────────────────────────────────────────────┤
│ 4. ИТЕРАЦИИ │
│ Квант: "А если добавить объём? Другой период?" │
│ Повторение шагов 1-3 сотни раз │
│ Время: Месяцы │
└─────────────────────────────────────────────────────────────────────┘
ОБЩЕЕ ВРЕМЯ: 3-6 месяцев на один рабочий альфа-фактор
УСПЕШНОСТЬ: ~1-5% протестированных факторов полезны

Почему LLM для поиска альфы?

LLM могут драматически ускорить поиск альфы благодаря:

  1. Генерации новых выражений факторов

    • LLM могут предлагать тысячи формул факторов на основе финансовой интуиции
    • Они понимают микроструктуру рынка, технический и фундаментальный анализ
  2. Обработке разнообразных источников данных

    • Новости, соцсети, конференц-звонки, отчёты SEC
    • Данные книги заявок, альтернативные данные
    • Кросс-рыночные корреляции
  3. Самоулучшению через обратную связь

    • LLM могут учиться на результатах бэктестинга
    • Итеративно улучшать факторы на основе метрик производительности
ПРЕИМУЩЕСТВА LLM ALPHA MINING:
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ СКОРОСТЬ Традиционно: Месяцы → LLM: Часы │
│ ───────────────────────────────────────────────────────────── │
│ │
│ ОХВАТ Традиционно: ~100 факторов/месяц │
│ LLM: ~10,000 факторов/день │
│ ───────────────────────────────────────────────────────────── │
│ │
│ НОВИЗНА Традиционно: На основе опыта кванта │
│ LLM: Комбинирует паттерны из обширных данных │
│ ───────────────────────────────────────────────────────────── │
│ │
│ ИНТЕРПРЕТИРУЕМОСТЬ Традиционно: Дизайн человека, ясная логика │
│ LLM: Может объяснить обоснование фактора │
│ │
└─────────────────────────────────────────────────────────────────────┘

Ключевые подходы

ПодходОписаниеПример
Прямая генерацияLLM выдаёт выражения факторов напрямую”Сгенерируй альфа-фактор на основе моментума”
Синтез кодаLLM пишет код на Python/Rust для факторов”Напиши фактор используя RSI и объём”
АгентныйLLM итеративно улучшает факторыСамообучающийся цикл QuantAgent
МультимодальныйLLM объединяет текст + числовые данныеТональность новостей + ценовые данные

Архитектуры LLM Alpha Mining

LLM как генератор альфы

Простейший подход использует LLM для прямой генерации выражений факторов:

┌──────────────────────────────────────────────────────────────────────────────┐
│ LLM КАК ГЕНЕРАТОР АЛЬФЫ │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌───────────────────┐ ┌─────────────────────┐ │
│ │ │ │ │ │ │ │
│ │ Рыночные │────▶│ LLM │────▶│ Выражение фактора │ │
│ │ данные + промпт│ │ (GPT/Claude) │ │ + Объяснение │ │
│ │ │ │ │ │ │ │
│ └─────────────────┘ └───────────────────┘ └─────────────────────┘ │
│ │
│ ВХОДНОЙ ПРОМПТ: │
│ "Сгенерируй альфа-фактор возврата к среднему для BTC, используя │
│ данные цены и объёма с периодом 5 дней." │
│ │
│ ВЫХОД: │
│ Фактор: (close - rolling_mean(close, 5)) / rolling_std(close, 5) │
│ Логика: Покупать когда цена ниже скользящей средней (перепроданность) │
│ Риск: Высоковолатильные активы могут давать ложные сигналы │
│ │
└──────────────────────────────────────────────────────────────────────────────┘

LLM как оптимизатор факторов

Более продвинутые системы используют LLM для оптимизации существующих факторов:

┌──────────────────────────────────────────────────────────────────────────────┐
│ LLM КАК ОПТИМИЗАТОР ФАКТОРОВ │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ЦИКЛ ОПТИМИЗАЦИИ: │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Начальный │───▶│ Движок │───▶│ Метрики │───▶│ LLM │ │
│ │ фактор │ │ бэктеста │ │ производит. │ │ оптимизатор │ │
│ └─────────────┘ └──────────────┘ └─────────────┘ └──────┬──────┘ │
│ ▲ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ Улучшенный фактор │
│ │
│ ПРИМЕР ИТЕРАЦИИ: │
│ │
│ Итерация 1: │
│ Фактор: momentum_5d │
│ Sharpe: 0.65, IC: 0.02 │
│ │
│ Итерация 2: │
│ LLM: "Добавь подтверждение объёмом для уменьшения ложных сигналов" │
│ Фактор: momentum_5d * sign(volume - avg_volume_20d) │
│ Sharpe: 0.89, IC: 0.04 │
│ │
│ Итерация 3: │
│ LLM: "Учти режим волатильности для корректировки риска" │
│ Фактор: momentum_5d * volume_signal / realized_vol_10d │
│ Sharpe: 1.12, IC: 0.05 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘

Самообучающиеся агенты (QuantAgent)

Фреймворк QuantAgent вводит двухуровневый механизм самоулучшения:

┌──────────────────────────────────────────────────────────────────────────────┐
│ АРХИТЕКТУРА QUANTAGENT │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ╔═══════════════════════════════════════════════════════════════════════╗ │
│ ║ ВНЕШНИЙ ЦИКЛ (Обучение) ║ │
│ ║ ║ │
│ ║ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ ║ │
│ ║ │ Генерация │───▶│ Реальный │───▶│ Обновление базы знаний │ ║ │
│ ║ │ фактора │ │ бэктест │ │ с обратной связью │ ║ │
│ ║ └─────────────┘ └─────────────┘ └─────────────────────────┘ ║ │
│ ║ ▲ │ ║ │
│ ║ │ │ ║ │
│ ║ └─────────────────────────────────────────┘ ║ │
│ ║ ║ │
│ ╚═══════════════════════════════════════════════════════════════════════╝ │
│ │ │
│ ▼ │
│ ╔═══════════════════════════════════════════════════════════════════════╗ │
│ ║ ВНУТРЕННИЙ ЦИКЛ (Рассуждение) ║ │
│ ║ ║ │
│ ║ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ ║ │
│ ║ │ Писатель │───▶│ Генерация │───▶│ Судья │───▶│ Улучшен.│ ║ │
│ ║ │ агент │ │ ответа │ │ агент │ │ ответ │ ║ │
│ ║ └────────────┘ └────────────┘ └────────────┘ └──────────┘ ║ │
│ ║ │ │ ║ │
│ ║ ▼ ▼ ║ │
│ ║ ┌────────────────────────────────────────────────────────────────┐ ║ │
│ ║ │ БАЗА ЗНАНИЙ │ ║ │
│ ║ │ • Успешные паттерны факторов │ ║ │
│ ║ │ • Неудачные подходы для избежания │ ║ │
│ ║ │ • Инсайты о рыночных режимах │ ║ │
│ ║ │ • Бенчмарки производительности │ ║ │
│ ║ └────────────────────────────────────────────────────────────────┘ ║ │
│ ╚═══════════════════════════════════════════════════════════════════════╝ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘

Ключевые компоненты:

  1. Агент-писатель: Генерирует начальные выражения факторов используя базу знаний
  2. Агент-судья: Оценивает и выставляет баллы сгенерированным факторам, даёт рекомендации по улучшению
  3. База знаний: Хранит успешные паттерны и неудачные попытки
  4. Обратная связь из реального мира: Результаты бэктеста обновляют базу знаний

Применение в трейдинге

Генерация выражений факторов

LLM могут генерировать факторы в нескольких форматах:

# Примеры выражений факторов, сгенерированных LLM
# 1. Математическое выражение
factor_math = "(close - SMA(close, 20)) / STD(close, 20)"
# 2. DSL (Доменно-специфичный язык)
factor_dsl = "zscore(close, 20) * rank(volume)"
# 3. Python код
def factor_python(df):
"""
Фактор возврата к среднему с подтверждением объёмом.
Сигнал на покупку когда цена ниже скользящей средней и объём растёт.
"""
zscore = (df['close'] - df['close'].rolling(20).mean()) / df['close'].rolling(20).std()
volume_signal = df['volume'] / df['volume'].rolling(20).mean()
return -zscore * np.where(volume_signal > 1, 1.5, 1.0)

Мультимодальный Alpha Mining

Объединение текстовых и числовых данных для более богатых сигналов:

┌──────────────────────────────────────────────────────────────────────────────┐
│ МУЛЬТИМОДАЛЬНЫЙ ALPHA MINING │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ТЕКСТОВЫЕ ИСТОЧНИКИ ЧИСЛОВЫЕ ИСТОЧНИКИ │
│ ───────────────── ───────────────── │
│ • Новостные статьи • OHLCV ценовые данные │
│ • Социальные сети • Снимки книги заявок │
│ • Конференц-звонки • Ставки финансирования (крипто) │
│ • Отчёты SEC • Технические индикаторы │
│ • Аналитические отчёты • Ончейн метрики │
│ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ Текстовый │ │ Числовая │ │
│ │ эмбеддинг │ │ инженерия │ │
│ │ (LLM) │ │ признаков │ │
│ └──────────────┘ └──────────────────┘ │
│ │ │ │
│ └──────────────┬───────────────────┘ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ МОДУЛЬ СЛИЯНИЯ │ │
│ │ (Cross-Attention) │ │
│ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ АЛЬФА СИГНАЛ │ │
│ │ Комбинированный │ │
│ └──────────────────────┘ │
│ │
│ ПРИМЕР: │
│ Новость: "Обновление Ethereum успешно развёрнуто, комиссии снизились на 40%"│
│ Цена: ETH на $2,450, рост 2% за последний час │
│ Объём: 150% от 20-дневного среднего │
│ │
│ Комбинированная альфа: Сильный сигнал ПОКУПАТЬ (уверенность 0.85) │
│ - Позитивное фундаментальное развитие │
│ - Подтверждение ценового моментума │
│ - Валидация всплеска объёма │
│ │
└──────────────────────────────────────────────────────────────────────────────┘

Альфа для крипторынка

LLM особенно эффективны для крипторынков благодаря:

  1. Круглосуточному новостному циклу: Непрерывный поток информации требует автоматической обработки
  2. Ончейн данным: LLM могут интерпретировать метрики блокчейна
  3. Социальному сентименту: Сигналы из Twitter, Reddit, Telegram
  4. DeFi метрикам: TVL, APY фарминга, уровни ликвидаций
# Крипто-специфичные альфа-факторы, которые могут генерировать LLM
crypto_factors = {
"funding_momentum": """
Сигнал на основе изменений ставки финансирования бессрочных фьючерсов.
Отрицательный фандинг + восстановление цены = потенциальный лонг сигнал.
""",
"whale_accumulation": """
Мониторинг паттернов накопления крупных кошельков.
Увеличение холдингов китов при консолидации цены = бычий сигнал.
""",
"exchange_flow": """
Отслеживание нетто притоков/оттоков с бирж.
Крупные оттоки на холодные кошельки = снижение давления продаж.
""",
"social_momentum": """
Агрегированный сентимент из Twitter, Reddit, Telegram.
Дивергенция сентимента от цены = потенциальный сигнал разворота.
""",
"defi_tvl_momentum": """
Моментум Total Value Locked в DeFi протоколах.
Растущий TVL + приток стейблкоинов = сигнал роста экосистемы.
"""
}

Практические примеры

01: Базовая генерация альфа-факторов

python/01_alpha_generation.py
import openai
from typing import Dict, List, Tuple
import pandas as pd
import numpy as np
class LLMAlphaGenerator:
"""
Генерация альфа-факторов с помощью больших языковых моделей.
Этот класс демонстрирует, как использовать LLM для создания
торговых факторов из описаний на естественном языке.
"""
def __init__(self, api_key: str = None, model: str = "gpt-4"):
self.model = model
if api_key:
openai.api_key = api_key
def generate_factor(
self,
asset_type: str,
factor_type: str,
lookback_period: int = 20,
additional_context: str = ""
) -> Dict:
"""
Генерация альфа-фактора на основе спецификаций.
Args:
asset_type: "stock", "crypto", "forex"
factor_type: "momentum", "mean_reversion", "volatility", и т.д.
lookback_period: Количество периодов для расчётов
additional_context: Дополнительные инструкции или ограничения
Returns:
Dict с выражением фактора, объяснением и кодом
"""
prompt = self._build_prompt(
asset_type, factor_type, lookback_period, additional_context
)
response = self._call_llm(prompt)
return self._parse_response(response)
def _build_prompt(
self,
asset_type: str,
factor_type: str,
lookback: int,
context: str
) -> str:
"""Построение промпта для генерации фактора."""
return f"""Ты количественный аналитик, специализирующийся на разработке альфа-факторов.
Сгенерируй альфа-фактор со следующими спецификациями:
- Тип актива: {asset_type}
- Тип фактора: {factor_type}
- Период: {lookback} периодов
- Дополнительные требования: {context if context else "Нет"}
Предоставь ответ в следующем формате:
FACTOR_NAME: [Название фактора]
MATHEMATICAL_EXPRESSION: [Математическая формула в стандартной нотации]
PYTHON_CODE:
```python
def calculate_factor(df):
# df содержит: open, high, low, close, volume
# Возврат: Series значений фактора
pass

RATIONALE: [2-3 предложения объясняющих почему этот фактор может работать]

RISK_FACTORS: [Потенциальные слабости или рыночные условия где может не работать]

EXPECTED_PERFORMANCE:

  • Типичный IC: [Ожидаемый диапазон Information Coefficient]

  • Оборот: [Ожидаемый процент дневного оборота]

  • Подходящий период удержания: [Внутридневной/Дневной/Недельный] """

    def _call_llm(self, prompt: str) -> str: """Вызов LLM API.""" # Для демонстрации возвращаем мок ответ # В продакшене используется реальный API вызов return self._mock_response()

    def _mock_response(self) -> str: """Мок ответ для демонстрации.""" return """ FACTOR_NAME: Volume-Adjusted Momentum (Моментум скорректированный на объём)

MATHEMATICAL_EXPRESSION: momentum = (close - close_lag_5) / close_lag_5 vol_ratio = volume / SMA(volume, 20) factor = momentum * log(vol_ratio + 1) * sign(momentum)

PYTHON_CODE:

def calculate_factor(df):
# Расчёт ценового моментума
momentum = (df['close'] - df['close'].shift(5)) / df['close'].shift(5)
# Расчёт коэффициента объёма
vol_ma = df['volume'].rolling(20).mean()
vol_ratio = df['volume'] / vol_ma
# Комбинирование с подтверждением объёмом
factor = momentum * np.log(vol_ratio + 1) * np.sign(momentum)
return factor

RATIONALE: Этот фактор комбинирует ценовой моментум с подтверждением объёмом. Сильные ценовые движения, сопровождаемые объёмом выше среднего, более вероятно продолжатся, тогда как движения с низким объёмом часто возвращаются к среднему. Логарифмическое преобразование предотвращает доминирование экстремальных всплесков объёма.

RISK_FACTORS:

  • Может хуже работать на низковолатильных, боковых рынках
  • Паттерны объёма различаются между крипто (24/7) и традиционными рынками
  • События отчётностей/новостей могут вызывать всплески объёма искажающие сигналы

EXPECTED_PERFORMANCE:

  • Типичный IC: 0.02 - 0.05

  • Оборот: 15-25% ежедневно

  • Подходящий период удержания: От дневного до недельного """

    def _parse_response(self, response: str) -> Dict: """Парсинг ответа LLM в структурированный формат.""" sections = {} current_section = None current_content = []

    for line in response.strip().split('\n'):
    if line.startswith('FACTOR_NAME:'):
    sections['name'] = line.replace('FACTOR_NAME:', '').strip()
    elif line.startswith('MATHEMATICAL_EXPRESSION:'):
    current_section = 'expression'
    current_content = []
    elif line.startswith('PYTHON_CODE:'):
    if current_section:
    sections[current_section] = '\n'.join(current_content).strip()
    current_section = 'code'
    current_content = []
    elif line.startswith('RATIONALE:'):
    if current_section:
    sections[current_section] = '\n'.join(current_content).strip()
    current_section = 'rationale'
    current_content = []
    elif line.startswith('RISK_FACTORS:'):
    if current_section:
    sections[current_section] = '\n'.join(current_content).strip()
    current_section = 'risks'
    current_content = []
    elif line.startswith('EXPECTED_PERFORMANCE:'):
    if current_section:
    sections[current_section] = '\n'.join(current_content).strip()
    current_section = 'performance'
    current_content = []
    elif current_section:
    current_content.append(line)
    if current_section:
    sections[current_section] = '\n'.join(current_content).strip()
    return sections

def calculate_volume_adjusted_momentum(df: pd.DataFrame) -> pd.Series: """ Пример реализации фактора.

Это автономная функция демонстрирующая логику фактора,
которую можно использовать напрямую без генерации LLM.
"""
# Расчёт ценового моментума
momentum = (df['close'] - df['close'].shift(5)) / df['close'].shift(5)
# Расчёт коэффициента объёма
vol_ma = df['volume'].rolling(20).mean()
vol_ratio = df['volume'] / vol_ma
# Комбинирование с подтверждением объёмом
factor = momentum * np.log(vol_ratio + 1) * np.sign(momentum)
return factor

Пример использования

def main(): # Инициализация генератора generator = LLMAlphaGenerator()

# Генерация фактора моментума для крипто
factor_spec = generator.generate_factor(
asset_type="crypto",
factor_type="momentum",
lookback_period=5,
additional_context="Фокус на подтверждении объёмом, подходит для BTC и ETH"
)
print("Сгенерированный фактор:")
print(f"Название: {factor_spec.get('name', 'Неизвестно')}")
print(f"\nВыражение:\n{factor_spec.get('expression', 'Н/Д')}")
print(f"\nОбоснование:\n{factor_spec.get('rationale', 'Н/Д')}")
# Тест на примерных данных
print("\n--- Тестирование на примерных данных ---")
# Создание примерных крипто данных
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100, freq='D')
df = pd.DataFrame({
'open': 40000 + np.random.randn(100).cumsum() * 500,
'high': 40500 + np.random.randn(100).cumsum() * 500,
'low': 39500 + np.random.randn(100).cumsum() * 500,
'close': 40000 + np.random.randn(100).cumsum() * 500,
'volume': np.random.exponential(1e9, 100)
}, index=dates)
# Расчёт фактора
df['factor'] = calculate_volume_adjusted_momentum(df)
print(f"\nСтатистика фактора:")
print(f" Среднее: {df['factor'].mean():.4f}")
print(f" Стд: {df['factor'].std():.4f}")
print(f" Мин: {df['factor'].min():.4f}")
print(f" Макс: {df['factor'].max():.4f}")
# Показать примерные значения
print(f"\nПримерные значения фактора:")
print(df[['close', 'volume', 'factor']].tail(10))

if name == “main”: main()

### 02: Мультиисточниковый Alpha Mining
Смотрите английскую версию для полного примера кода `02_multi_source_alpha.py`, демонстрирующего комбинирование нескольких источников данных для комплексного поиска альфы.
### 03: Самообучающийся Alpha Agent
Смотрите английскую версию для полного примера кода `03_quantagent.py`, реализующего двухуровневую архитектуру самоулучшения.
### 04: Бэктестинг LLM альфы
Смотрите английскую версию для полного примера кода `04_backtest_alphas.py` с полнофункциональным движком бэктестинга.
## Реализация на Rust
Для production-grade alpha mining мы предоставляем реализацию на Rust с высокой производительностью и низкой задержкой.

rust_llm_alpha/ ├── Cargo.toml ├── README.md ├── src/ │ ├── lib.rs # Основные экспорты библиотеки │ ├── alpha/ # Генерация альфы │ │ ├── mod.rs │ │ ├── generator.rs # Генерация факторов │ │ ├── optimizer.rs # Оптимизация факторов │ │ └── expressions.rs # DSL выражений факторов │ ├── data/ # Обработка данных │ │ ├── mod.rs │ │ ├── bybit.rs # Клиент Bybit API │ │ ├── yahoo.rs # Клиент Yahoo Finance │ │ └── types.rs # Структуры данных │ ├── backtest/ # Движок бэктестинга │ │ ├── mod.rs │ │ ├── engine.rs # Основная логика бэктеста │ │ └── metrics.rs # Метрики производительности │ └── agent/ # Реализация QuantAgent │ ├── mod.rs │ ├── writer.rs # Агент-писатель │ ├── judge.rs # Агент-судья │ └── knowledge.rs # База знаний └── examples/ ├── generate_alpha.rs ├── backtest_factor.rs └── quantagent_demo.rs

Смотрите [rust_llm_alpha](rust_llm_alpha/) для полной реализации на Rust.
### Быстрый старт (Rust)
```bash
cd rust_llm_alpha
# Запуск примера генерации альфы
cargo run --example generate_alpha
# Бэктест фактора на данных Bybit
cargo run --example backtest_factor -- --symbol BTCUSDT --days 30
# Запуск демо самообучающегося цикла QuantAgent
cargo run --example quantagent_demo

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

Смотрите python/ для реализации на Python.

python/
├── __init__.py
├── alpha_generator.py # Генерация факторов
├── multi_source_alpha.py # Мультимодальный майнинг
├── quantagent.py # Самообучающийся агент
├── backtest.py # Движок бэктестинга
├── data_loader.py # Утилиты данных
├── requirements.txt # Зависимости
└── examples/
├── 01_basic_generation.py
├── 02_multi_source.py
├── 03_quantagent.py
└── 04_full_backtest.py

Быстрый старт (Python)

Окно терминала
cd python
# Установка зависимостей
pip install -r requirements.txt
# Запуск базовой генерации альфы
python examples/01_basic_generation.py
# Мультиисточниковый alpha mining
python examples/02_multi_source.py --symbol BTCUSDT
# Запуск QuantAgent
python examples/03_quantagent.py
# Полный бэктест
python examples/04_full_backtest.py --capital 100000

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

Рекомендации по генерации факторов

  1. Указывайте чёткие ограничения

    # Хороший промпт
    "Сгенерируй фактор моментума для BTC с периодом 5 дней,
    включая подтверждение объёмом, подходящий для часовой ребалансировки"
    # Плохой промпт
    "Сгенерируй торговый фактор"
  2. Итеративное улучшение

    # Начинайте просто, добавляйте сложность на основе производительности
    iteration_1: "momentum_5d" # Простой моментум
    iteration_2: "momentum_5d * volume_ratio" # Добавляем объём
    iteration_3: "momentum_5d * volume_ratio / volatility" # Корректировка на риск
  3. Требования валидации

    # Всегда валидируйте сгенерированные факторы
    validation_checks = {
    "no_lookahead": check_lookahead_bias(factor),
    "reasonable_values": factor.abs().quantile(0.99) < 10,
    "sufficient_variation": factor.std() > 0.01,
    "low_correlation": abs(factor.corr(existing_factors)) < 0.7
    }

Лучшие практики бэктестинга

  1. Реалистичные издержки

    • Включайте транзакционные издержки (5-20 бп в зависимости от актива)
    • Учитывайте проскальзывание (особенно для крипто)
    • Учитывайте ставки финансирования для бессрочных фьючерсов
  2. Тестирование вне выборки

    • Обучение на 70% данных
    • Валидация на 15%
    • Тест на финальных 15%
  3. Тестирование на разных режимах

    • Бычьи рынки
    • Медвежьи рынки
    • Периоды высокой волатильности
    • Периоды низкой ликвидности

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

  1. Переобучение на данных обучения LLM - LLM могут предлагать факторы похожие на те, что в их обучающих данных
  2. Look-ahead Bias - Убедитесь, что сгенерированный код не использует будущую информацию
  3. Survivorship Bias - Тестируйте также на делистинговых активах
  4. Игнорирование издержек - Факторы с высоким оборотом могут выглядеть хорошо до учёта издержек

Ресурсы

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

Open-Source инструменты

ИнструментОписаниеСсылка
FinGPTOpen-source финансовая LLMGitHub
QlibПлатформа количественных исследованийGitHub
BacktraderPython библиотека бэктестингаGitHub
FreqtradeКрипто торговый ботGitHub

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


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

Продвинутый

Предпосылки:

  • Понимание альфа-факторов и количественной торговли
  • Опыт работы с LLM и prompt engineering
  • Опыт программирования на Python/Rust
  • Знакомство с концепциями бэктестинга

Литература

  1. Wang, S., et al. (2024). “QuantAgent: Seeking Holy Grail in Trading by Self-Improving Large Language Model.” arXiv:2402.03755
  2. Li, H., et al. (2024). “Can Large Language Models Mine Interpretable Financial Factors More Effectively?” ACL Findings 2024
  3. Nie, Y., et al. (2024). “Large Language Model Agent in Financial Trading: A Survey.” arXiv:2408.06361
  4. Yang, H., et al. (2023). “FinGPT: Open-Source Financial Large Language Models.” arXiv:2306.06031