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

Глава 334: GLOW (Генеративный Поток) для Трейдинга

Обзор

GLOW (Generative Flow with Invertible 1x1 Convolutions — Генеративный Поток с Обратимыми 1x1 Свёртками) — это мощная модель генеративного потока, представленная OpenAI в 2018 году. В отличие от GAN или VAE, GLOW позволяет вычислять точное правдоподобие и эффективно генерировать выборки благодаря обратимой архитектуре. Для торговых приложений GLOW предоставляет уникальные преимущества в понимании рыночных распределений, генерации реалистичных сценариев и обнаружении аномалий.

В этой главе рассматривается применение GLOW к финансовым рынкам: использование точного вычисления правдоподобия для оценки рисков, генеративных возможностей для анализа сценариев и латентного пространства для определения рыночных режимов.

Основные Концепции

Что такое GLOW?

GLOW — это модель нормализующих потоков, которая преобразует простые распределения (например, гауссовские) в сложные распределения данных через серию обратимых преобразований:

Простое распределение (z ~ N(0,I))
[Обратимые преобразования]
Сложное распределение данных (x)
Ключевые свойства:
├── Точное правдоподобие: log p(x) = log p(z) + log|det(∂z/∂x)|
├── Эффективная выборка: x = f(z), где z ~ N(0,I)
├── Обратимость: z = f⁻¹(x) для кодирования
└── Обучаемость: Все преобразования параметризованы

Почему GLOW для Трейдинга?

  1. Точное правдоподобие: В отличие от VAE (нижняя граница) или GAN (нет правдоподобия), GLOW вычисляет точные лог-вероятности
  2. Обнаружение аномалий: Низкое правдоподобие = необычные рыночные условия
  3. Генерация сценариев: Создание реалистичных рыночных сценариев для стресс-тестирования
  4. Латентные представления: Сжатие рыночных состояний для анализа режимов
  5. Обратимость: Кодирование (рынок → латентное) и декодирование (латентное → рынок)

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

Архитектура GLOW:
├── Многоуровневая структура
│ ├── Уровень 1: Полное разрешение
│ ├── Уровень 2: Половинное разрешение (после разделения)
│ ├── Уровень 3: Четверть разрешения (после разделения)
│ └── ... (иерархическое сжатие)
├── Шаги потока (повторяются K раз на уровень):
│ ├── ActNorm: Нормализация с зависимостью от данных
│ ├── Обратимая 1x1 свёртка: Смешивание каналов
│ └── Аффинная связка: Разделить → Преобразовать → Соединить
└── Операция разделения:
├── Половина каналов → Следующий уровень
└── Половина каналов → Латентное z_i

Торговая Стратегия

Обзор стратегии: Использование GLOW для моделирования распределения рыночных состояний. Торговые сигналы генерируются на основе:

  1. Определения режима на основе правдоподобия
  2. Анализа латентного пространства для структуры рынка
  3. Генерации сценариев для управления рисками

Генерация Сигналов

1. Извлечение признаков:
- Вычисление рыночных признаков: доходности, волатильность, моментум
- Нормализация к масштабу обучающего распределения
2. Вычисление правдоподобия:
- Кодирование: z = f⁻¹(x)
- Вычисление: log p(x) = log p(z) + log|det(Якобиан)|
3. Интерпретация сигнала:
- Высокое правдоподобие → Знакомое рыночное состояние → Торговать нормально
- Низкое правдоподобие → Необычные условия → Снизить экспозицию
- Направление в латентном пространстве → Индикатор рыночного режима
4. Анализ сценариев:
- Генерация выборок из обученного распределения
- Вычисление VaR/CVaR из сгенерированных сценариев

Сигналы на Вход

  • Сигнал Long: Латентное кодирование указывает на бычий режим с высоким правдоподобием
  • Сигнал Short: Латентное кодирование указывает на медвежий режим с высоким правдоподобием
  • Без сделки: Низкое правдоподобие указывает на необычные/неопределённые условия

Управление Рисками

  • Фильтр правдоподобия: Торговать только когда log p(x) > порог
  • Размер позиции: Масштабирование по нормализованному правдоподобию
  • VaR по сценариям: Использование сгенерированных выборок для лимитов риска

Техническая Спецификация

Математические Основы

Нормализующие Потоки

Ключевая идея — формула замены переменных:

Для обратимого преобразования f: z → x = f(z)
p_x(x) = p_z(f⁻¹(x)) · |det(∂f⁻¹/∂x)|
= p_z(z) · |det(∂z/∂x)|
Логарифм правдоподобия:
log p_x(x) = log p_z(z) + log|det(∂z/∂x)|
= log p_z(z) + Σ log|det(∂h_i/∂h_{i-1})|
Где h_0 = x, h_N = z, и каждое h_i → h_{i+1} обратимо

Шаги Потока GLOW

Каждый шаг потока состоит из трёх обратимых операций:

1. Нормализация активаций (ActNorm)

Прямой проход: y = (x - μ) / σ
Обратный проход: x = y · σ + μ
Log-det: Σ log|σ| (по каналам)
Примечание: μ, σ инициализируются статистиками первого батча

2. Обратимая 1x1 Свёртка

Прямой проход: y = Wx, где W — матрица весов d×d
Обратный проход: x = W⁻¹y
Log-det: log|det(W)|
Оптимизация: LU-разложение для O(d) вместо O(d³)
W = PL(U + diag(s)), где L нижнетреугольная, U верхнетреугольная
log|det(W)| = Σ log|s_i|

3. Аффинный Связующий Слой

Разделение: x → [x_a, x_b] (разделение по каналам)
Прямой проход:
x_a без изменений
(log_s, t) = NN(x_a) # Нейронная сеть
y_b = x_b ⊙ exp(log_s) + t
y = [x_a, y_b]
Обратный проход:
[y_a, y_b] = y
(log_s, t) = NN(y_a)
x_b = (y_b - t) ⊙ exp(-log_s)
x = [y_a, x_b]
Log-det: Σ log_s

Диаграмма Архитектуры

Поток рыночных данных
┌─────────────────────────────┐
│ Инженерия признаков │
│ ├── Доходности (разные │
│ │ масштабы) │
│ ├── Метрики волатильности │
│ ├── Паттерны объёма │
│ └── Технические индикаторы │
└──────────────┬──────────────┘
▼ x (рыночное состояние)
┌─────────────────────────────┐
│ Модель GLOW │
│ │
│ ┌───────────────────────┐ │
│ │ Уровень 1 (K шагов) │ │
│ │ ├── ActNorm │ │
│ │ ├── 1x1 свёртка │ │
│ │ └── Аффинная связка │ │
│ └───────────┬───────────┘ │
│ │ разделение │
│ ┌───────────┴───────────┐ │
│ │ z_1 │ h_1 │ │
│ │ (латентное)│ (далее) │ │
│ └────────────┴────┬─────┘ │
│ │ │
│ ┌───────────────────────┐ │
│ │ Уровень 2 (K шагов) │ │
│ └───────────┬───────────┘ │
│ │ разделение │
│ ┌───────────┴───────────┐ │
│ │ z_2 │ h_2 │ │
│ └────────────┴────┬─────┘ │
│ │ │
│ ... (L уровней) │
│ │ │
│ ┌───────────────────────┐ │
│ │ Уровень L (K шагов) │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ z_L (финальное) │
└──────────────┬──────────────┘
┌──────────────┴──────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Лог- │ │ Латентный │ │ Генерация │
│ правдоподо- │ │ анализ │ │ сценариев │
│ бие │ │ │ │ │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────┼───────────────┘
┌─────────────────────────────┐
│ Торговое решение │
│ ├── Определение режима │
│ ├── Оценка риска │
│ ├── Размер позиции │
│ └── Генерация сигнала │
└─────────────────────────────┘

Инженерия Признаков для GLOW

import numpy as np
import pandas as pd
def compute_glow_features(df: pd.DataFrame, lookback: int = 20) -> np.ndarray:
"""
Создание вектора признаков для модели GLOW
Признаки спроектированы для захвата рыночного состояния в нескольких измерениях
"""
features = {}
# Доходности на разных масштабах
returns = df['close'].pct_change()
for period in [1, 5, 10, 20]:
features[f'return_{period}'] = returns.rolling(period).sum().iloc[-1]
# Признаки волатильности
features['volatility_5'] = returns.rolling(5).std().iloc[-1]
features['volatility_20'] = returns.rolling(20).std().iloc[-1]
features['vol_ratio'] = features['volatility_5'] / (features['volatility_20'] + 1e-8)
# Признаки моментума
features['momentum_10'] = df['close'].iloc[-1] / df['close'].iloc[-10] - 1
features['momentum_20'] = df['close'].iloc[-1] / df['close'].iloc[-20] - 1
# Признаки объёма
volume_ma = df['volume'].rolling(20).mean()
features['volume_ratio'] = df['volume'].iloc[-1] / (volume_ma.iloc[-1] + 1e-8)
# Позиция цены в диапазоне
high_20 = df['high'].rolling(20).max().iloc[-1]
low_20 = df['low'].rolling(20).min().iloc[-1]
features['price_position'] = (df['close'].iloc[-1] - low_20) / (high_20 - low_20 + 1e-8)
# Паттерны OHLC
features['body_ratio'] = (df['close'].iloc[-1] - df['open'].iloc[-1]) / (df['high'].iloc[-1] - df['low'].iloc[-1] + 1e-8)
features['upper_shadow'] = (df['high'].iloc[-1] - max(df['open'].iloc[-1], df['close'].iloc[-1])) / (df['high'].iloc[-1] - df['low'].iloc[-1] + 1e-8)
features['lower_shadow'] = (min(df['open'].iloc[-1], df['close'].iloc[-1]) - df['low'].iloc[-1]) / (df['high'].iloc[-1] - df['low'].iloc[-1] + 1e-8)
return np.array(list(features.values()))

Требования к Данным

Исторические OHLCV данные:
├── Минимум: 1 год данных для обучения
├── Рекомендуется: 2+ года для надёжного обучения
├── Частота: от 1 часа до дневных
└── Источник: Bybit, Binance или другие биржи
Обязательные поля:
├── timestamp
├── open, high, low, close
├── volume
└── Опционально: ставка финансирования, открытый интерес
Предобработка:
├── Вычисление признаков: 15-20 признаков на временную точку
├── Нормализация: Z-score по каждому признаку
├── Обработка выбросов: Обрезка до ±5 std
├── Разделение Train/Val/Test: 70/15/15
└── Размерность признаков должна быть степенью 2 (для разделений)

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

  • Отрицательное лог-правдоподобие (NLL): Целевая функция обучения (меньше — лучше)
  • Биты на измерение: NLL / (num_features * log(2))
  • Лог-правдоподобие: Индикатор качества модели (больше — лучше)
  • Точность режимов: Если режимы известны
  • VaR/CVaR: Из сгенерированных сценариев
  • Коэффициент Шарпа: Доходность с поправкой на риск
  • Максимальная просадка: Наибольшее падение от пика до дна

Зависимости

# Основные
numpy>=1.23.0
pandas>=1.5.0
scipy>=1.10.0
# Глубокое обучение
torch>=2.0.0
# Рыночные данные
ccxt>=4.0.0
# Кластеризация
scikit-learn>=1.2.0
# Визуализация
matplotlib>=3.6.0
seaborn>=0.12.0
# Утилиты
tqdm>=4.65.0

Ожидаемые Результаты

  1. Оценка плотности: GLOW улавливает мультимодальные рыночные распределения
  2. Обнаружение аномалий: Низкое правдоподобие сигнализирует о необычных условиях
  3. Идентификация режимов: Кластеризация латентного пространства выявляет рыночные состояния
  4. Генерация сценариев: Реалистичные выборки для управления рисками
  5. Оценка рисков: VaR/CVaR из сгенерированных сценариев
  6. Результаты бэктеста: Ожидаемый коэффициент Шарпа 0.7-1.3 при правильной настройке

Сравнение с Другими Методами

МетодПравдоподобиеВыборкаЛатентное пространствоОбучение
GLOWТочноеБыстраяДетерминированноеСтабильное
VAEНижняя границаБыстраяСтохастическоеСтабильное
GANНетБыстраяНетНестабильное
Score MatchingПриближённоеMCMCНетУмеренное
ДиффузияПриближённоеМедленнаяНетСтабильное

Ссылки

  1. Glow: Generative Flow with Invertible 1x1 Convolutions (Kingma & Dhariwal, 2018)

  2. Density Estimation Using Real-NVP (Dinh et al., 2016)

  3. NICE: Non-linear Independent Components Estimation (Dinh et al., 2014)

  4. Normalizing Flows for Probabilistic Modeling and Inference (Papamakarios et al., 2019)

  5. Normalizing Flows: An Introduction and Review (Kobyzev et al., 2020)

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

Эта глава включает полную реализацию на Rust для высокопроизводительной торговли на основе GLOW с данными криптовалют от Bybit. См. директорию rust/.

Особенности:

  • Получение данных в реальном времени от Bybit API
  • Модель GLOW с ActNorm, обратимой 1x1 свёрткой и аффинной связкой
  • Точное вычисление лог-правдоподобия
  • Генерация сценариев для анализа рисков
  • Фреймворк для бэктестинга с комплексными метриками
  • Модульный и расширяемый дизайн

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

⭐⭐⭐⭐⭐ (Эксперт)

Требуется понимание: Теории вероятностей, Замены переменных, Линейной алгебры (Якобианы), Нейронных сетей, Моделей на основе потоков, Торговых систем