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

Глава 329: Вероятностное прогнозирование для трейдинга

Обзор

Вероятностное прогнозирование выходит за рамки традиционных точечных прогнозов, предоставляя полные распределения вероятностей для будущих исходов. Вместо прогноза “цена будет $100”, вероятностные методы предсказывают “цена будет между $95 и $105 с 90% уверенностью, при этом наиболее вероятное значение — $100”. Эта смена парадигмы позволяет принимать решения с учётом риска, правильно оценивать неопределённость и создавать более устойчивые торговые стратегии.

Почему вероятностное прогнозирование для трейдинга?

Проблема точечных прогнозов

Традиционные модели прогнозирования выдают одно число (точечный прогноз):

Вход: Исторические цены, признаки
Модель: LSTM, XGBoost, Линейная регрессия
Выход: Цена завтра = $45,250 (одно число)

Проблемы:

  1. Нет меры неопределённости — Насколько мы уверены в этом прогнозе?
  2. Чрезмерная уверенность — Точечные прогнозы кажутся точнее, чем есть на самом деле
  3. Плохое управление рисками — Невозможно правильно рассчитать размер позиции без оценки неопределённости
  4. Игнорирование формы распределения — Асимметричные риски (толстые хвосты) невидимы

Вероятностное решение

Вход: Исторические цены, признаки
Модель: DeepAR, Квантильная регрессия, Гауссовский процесс
Выход: Полное распределение вероятностей
- Среднее: $45,250
- 10-й перцентиль: $44,100
- 90-й перцентиль: $46,500
- 95% ДИ: [$43,800, $46,900]
- Форма распределения: Слегка асимметрична вправо

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

1. Точечные vs Вероятностные прогнозы

ТОЧЕЧНЫЙ ПРОГНОЗ:
┌─────────────────────────────────────────┐
│ │ │
│ ● $45,250 │
│ │ │
│ Вчера Сегодня Завтра │
└─────────────────────────────────────────┘
ВЕРОЯТНОСТНЫЙ ПРОГНОЗ:
┌─────────────────────────────────────────┐
│ ╭───────╮ │
│ ╱ 90% ДИ ╲ │
│ ╱ ┌─────┐ ╲ │
│ ╱ │ 50% │ ╲ │
│ ●─────────╱───│ ДИ │─────╲ │
│ └─────┘ │
│ Вчера Сегодня Завтра │
│ │
│ Мы видим: Наиболее вероятное значение │
│ + неопределённость │
└─────────────────────────────────────────┘

2. Квантильная регрессия

Квантильная регрессия оценивает конкретные перцентили условного распределения:

# Стандартная регрессия: E[Y|X] = f(X) (только среднее)
# Квантильная регрессия: Q_τ[Y|X] = f_τ(X) (любой квантиль τ)
# Примеры квантилей для трейдинга:
τ = 0.055-й перцентиль (экстремальное падение)
τ = 0.2525-й перцентиль (умеренное падение)
τ = 0.5050-й перцентиль (медиана)
τ = 0.7575-й перцентиль (умеренный рост)
τ = 0.9595-й перцентиль (экстремальный рост)

Квантильная функция потерь (Pinball Loss):

L_τ(y, q) = (τ - 1{y < q}) × (y - q)
Где:
- y = фактическое значение
- q = предсказанный квантиль
- τ = целевой уровень квантиля
- 1{y < q} = индикаторная функция
Для τ = 0.5: Эквивалентно MAE (медианная регрессия)
Для τ = 0.9: Сильнее штрафует занижение прогноза

3. Дистрибуционное прогнозирование

Вместо отдельного предсказания квантилей, моделируем всё распределение:

Параметрический подход:
┌────────────────────────────────────────────────┐
│ Предположим Y ~ Распределение(θ₁, θ₂, ...) │
│ │
│ Нормальное: Y ~ N(μ, σ²) → предсказ. μ, σ │
│ Стьюдента: Y ~ t(μ, σ, ν) → предсказ. μ,σ,ν │
│ Смесь: Y ~ Σᵢ πᵢ N(μᵢ, σᵢ²) │
│ │
│ Непараметрический: │
│ - Гистограммные прогнозы │
│ - Ядерная оценка плотности │
│ - Нормализующие потоки │
└────────────────────────────────────────────────┘

4. DeepAR: Глубокие авторегрессионные рекуррентные сети

DeepAR (Amazon) — современный метод вероятностного прогнозирования:

Архитектура:
┌────────────────────────────────────────────────────────────┐
│ DeepAR │
│ │
│ Энкодер (LSTM/GRU): │
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │
│ │ h₁ │ → │ h₂ │ → │ h₃ │ → │ hₜ │ │
│ └────┘ └────┘ └────┘ └────┘ │
│ ↑ ↑ ↑ ↑ │
│ [x₁,z₁] [x₂,z₂] [x₃,z₃] [xₜ,zₜ] │
│ │
│ Декодер (Авторегрессионный): │
│ ┌────┐ ┌────┐ ┌────┐ │
│ │ hₜ │ → │hₜ₊₁│ → │hₜ₊₂│ → ... │
│ └────┘ └────┘ └────┘ │
│ ↓ ↓ ↓ │
│ θₜ₊₁ θₜ₊₂ θₜ₊₃ │
│ ↓ ↓ ↓ │
│ Сэмпл Сэмпл Сэмпл → Монте-Карло прогнозы │
│ │
│ xᵢ = целевые значения (цена, доходность) │
│ zᵢ = ковариаты (объём, индикаторы, временные признаки) │
│ θᵢ = параметры распределения (μ, σ для Гауссовского) │
└────────────────────────────────────────────────────────────┘

Ключевые особенности:

  • Обучается на множестве связанных временных рядов одновременно
  • Обрабатывает пропущенные значения и различную длину истории
  • Создаёт согласованные вероятностные прогнозы через сэмплирование
  • Улавливает паттерны между рядами (например, коррелированные активы)

Строгие правила оценки (Proper Scoring Rules)

Почему правила оценки важны

Для оценки вероятностных прогнозов нужны строгие правила оценки — метрики, оптимизируемые когда прогнозист сообщает своё истинное убеждение:

Строгое правило оценки: S(P, y)
- P = предсказанное распределение вероятностей
- y = наблюдаемый исход
- Максимизируется (или минимизируется) когда P равно
истинному распределению
Ключевое свойство: Нельзя "обмануть" метрику, сообщая
что-то отличное от истинного убеждения

CRPS (Continuous Ranked Probability Score)

CRPS — золотой стандарт оценки вероятностных прогнозов непрерывных переменных:

CRPS(F, y) = ∫_{-∞}^{∞} (F(x) - 1{y ≤ x})² dx
Где:
- F(x) = предсказанная CDF в точке x
- y = наблюдаемое значение
- 1{y ≤ x} = ступенчатая функция (0 до y, 1 после y)
Интерпретация:
- Измеряет "расстояние" между предсказанной CDF и идеальным прогнозом
- Меньше = лучше
- Сводится к MAE при детерминированном прогнозе
- Декомпозируется: CRPS = Надёжность + Разрешение - Неопределённость

Визуализация CRPS:

┌────────────────────────────────────────────────────┐
│ 1.0 ─────────────────────────●━━━━━━━━━━━━━━━━━━ │
│ │ ╱ │
│ │ ╱ │
│ CDF │ ╱╱ ┌──────────────┐ │
│ │ ╱╱ │ Закрашенная │ │
│ 0.0 ─●═══════════════╱ │ площадь=CRPS │ │
│ │ ↑ └──────────────┘ │
│ └──────────────┼──────────────────────── │
│ y=наблюдаемое │
│ │
│ ── = Предсказанная CDF (F) │
│ ── = Ступенчатая функция в наблюдаемом значении │
└────────────────────────────────────────────────────┘

Log Score (Логарифмическая оценка)

LogScore(p, y) = log(p(y))
Где:
- p(y) = предсказанная плотность вероятности в наблюдаемом y
- Больше = лучше (или -LogScore: меньше = лучше)
Свойства:
- Сильно штрафует уверенные неверные прогнозы
- Чувствителен к поведению хвостов
- Также называется "отрицательное логарифмическое правдоподобие"

Сравнение правил оценки

Правило оценкиЧувствительность к хвостамЛокальностьДекомпозируемость
CRPSУмереннаяДаДа
Log ScoreВысокаяДаНет
Оценка БрайераН/П (классификация)ДаДа
Квантильная оценкаЗависит от квантиляДаДа

Калибровка

Что такое калибровка?

Вероятностный прогноз калиброван, если предсказанные вероятности соответствуют наблюдаемым частотам:

Определение калибровки:
Если мы предсказываем "80% вероятность положительной доходности" много раз,
то положительная доходность должна наблюдаться ~80% этих случаев.
Формально: P(Y ≤ y | F(y) = p) = p для всех p ∈ [0,1]

PIT (Probability Integral Transform)

Для хорошо калиброванного прогноза:
- Преобразуем наблюдения используя предсказанную CDF: u = F(y)
- u должно быть равномерно распределено на [0, 1]
Проверка калибровки:
1. Вычислить PIT значения: uᵢ = Fᵢ(yᵢ) для каждого прогноза
2. Построить гистограмму значений uᵢ
3. Должна быть плоской (равномерной) при хорошей калибровке
Типичные проблемы:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ ████████ │ │ ██████ │ │ ██ ██ │
│ ████████ │ │ ████████ │ │████ ████ │
│ ████████ │ │ ██████████ │ │████████████ │
└─────────────┘ └─────────────┘ └─────────────┘
Хорошая Переуверенность Недоуверенность
калибровка (U-образная) (обратная U)

Калибровка vs Резкость (Sharpness)

Хорошие прогнозы требуют ОБОИХ:
КАЛИБРОВКА: Вероятности честные
РЕЗКОСТЬ: Прогнозы точные (узкие интервалы)
Компромисс:
┌─────────────────────────────────────────────────┐
│ │
│ Калибровано, но не резко: "50% шанс вверх/вниз"│
│ (Всегда 50-50 → калибровано, но бесполезно) │
│ │
│ Резко, но не калибровано: "99% уверенность" │
│ (Всегда уверен → точно, но неверно) │
│ │
│ ЦЕЛЬ: Резко И калибровано │
└─────────────────────────────────────────────────┘

Принятие решений в условиях неопределённости

Теория ожидаемой полезности

Оптимальное действие = argmax_a E[U(исход | действие a)]
Где:
- U = функция полезности (прибыль, риск-скорр. доходность)
- Мат. ожидание по предсказательному распределению
Пример:
- Предсказательное распределение: Цена ~ N($100, $5²)
- Действие: Купить если ожидаемая прибыль > 0
- Полезность: U = Позиция × (Цена - Вход) - Комиссии

Value at Risk (VaR) из вероятностных прогнозов

VaR_α = квантиль_α предсказанного распределения доходности
Пример:
Предсказанное распределение доходности на завтра:
- Среднее: +0.5%
- Станд. откл.: 2.0%
- VaR(95%): -2.8% (5% шанс потерять более 2.8%)
Использование:
- Размер позиции
- Лимиты риска
- Маржинальные требования

Expected Shortfall (CVaR)

ES_α = E[Убыток | Убыток > VaR_α]
Более консервативный чем VaR:
- Усредняет по всем убыткам за VaR
- Лучше захватывает хвостовой риск
- Когерентная мера риска (VaR — нет)
Из вероятностного прогноза:
ES = (1/(1-α)) × ∫_{-∞}^{VaR_α} x × f(x) dx

Критерий Келли с вероятностными прогнозами

Классический критерий Келли

f* = (p × b - q) / b
Где:
- f* = оптимальная доля капитала для ставки
- p = вероятность выигрыша
- q = 1 - p = вероятность проигрыша
- b = коэффициенты (чистая прибыль на единицу ставки)
Пример:
- 60% шанс доходности +10% (p=0.6, b=0.10)
- 40% шанс убытка -5% (q=0.4)
- Доля Келли: (0.6 × 0.10 - 0.4 × 0.05) / 0.10 = 40%

Келли с полным распределением

Для непрерывных распределений:
f* = argmax_f E[log(1 + f × R)]
Где:
- R = случайная величина доходности из предсказ. распределения
- Мат. ожидание по предсказанному распределению
- Решается численно для сложных распределений
Практическая реализация:
1. Сэмплировать N доходностей из предсказ. распределения
2. Для каждого кандидата f: вычислить среднюю лог-доходность
3. Найти f, максимизирующий среднюю лог-доходность
4. Применить "дробный Келли" (напр., f*/2) для безопасности

Келли с неопределённостью в вероятностях

Когда сами вероятности неопределённы:
Байесовский Келли:
- p имеет апостериорное распределение (не точечную оценку)
- Интегрировать по неопределённости в p
f*_робаст = E_p[Kelly(p)] или max_p min_исход Kelly(p)
Это естественно приводит к более консервативным позициям,
когда мы неуверены в наших прогнозах!

Архитектура модели

┌─────────────────────────────────────────────────────────────────┐
│ МОДЕЛЬ ВЕРОЯТНОСТНОГО ПРОГНОЗИРОВАНИЯ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ВХОДНОЙ СЛОЙ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Признаки временных рядов: │ │
│ │ - Исторические доходности (1м, 5м, 15м, 1ч, 4ч, 1д) │ │
│ │ - Профиль объёма и VWAP │ │
│ │ - Меры волатильности (реализ., подразумеваемая) │ │
│ │ - Дисбаланс ордербука │ │
│ │ Календарные признаки: │ │
│ │ - Час дня, день недели (циклическое кодирование) │ │
│ │ - Время с момента рыночных событий │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ВРЕМЕННОЙ ЭНКОДЕР (LSTM/Transformer) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Захватывает временные паттерны и зависимости │ │
│ │ Выход: Контекстный вектор h_t │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ГОЛОВА РАСПРЕДЕЛЕНИЯ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Вариант A: Параметрическое распределение │ │
│ │ h_t → Линейный → [μ, log(σ), ν, ...] │ │
│ │ Распределение доходности: Student-t(μ, σ, ν) │ │
│ │ │ │
│ │ Вариант B: Квантильные выходы │ │
│ │ h_t → Линейный → [q_0.05, q_0.25, q_0.50, q_0.75, q_0.95]│ │
│ │ │ │
│ │ Вариант C: Сеть смеси плотностей │ │
│ │ h_t → Линейный → [π_k, μ_k, σ_k] для k=1..K компонент │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ВЫХОД: Полное предсказательное распределение │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ - PDF/CDF в любой точке │ │
│ │ - Сэмплы через Монте-Карло │ │
│ │ - Квантили любого уровня │ │
│ │ - Среднее, дисперсия, асимметрия, эксцесс │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

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

Генерация сигналов с учётом неопределённости

def generate_probabilistic_signals(forecast_distribution, current_price):
"""
Генерация торговых сигналов с использованием
вероятностных прогнозов.
"""
# Извлечение статистик распределения
mean_return = forecast_distribution.mean()
std_return = forecast_distribution.std()
var_95 = forecast_distribution.quantile(0.05)
upside_prob = forecast_distribution.prob_greater_than(0)
# Оптимальный размер позиции по Келли
kelly_fraction = compute_kelly(forecast_distribution)
# Риск-скорректированный сигнал
signal = SignalType.HOLD
position_size = 0.0
if upside_prob > 0.60 and mean_return > 0.005:
# Сильный бычий сигнал
signal = SignalType.LONG
# Масштабируем позицию по уверенности и Келли
position_size = min(kelly_fraction * 0.5, MAX_POSITION)
elif upside_prob < 0.40 and mean_return < -0.005:
# Сильный медвежий сигнал
signal = SignalType.SHORT
position_size = min(-kelly_fraction * 0.5, MAX_POSITION)
# Корректировка на неопределённость прогноза
uncertainty_penalty = std_return / BASELINE_VOLATILITY
position_size *= max(0.5, 1.0 - uncertainty_penalty)
return Signal(
direction=signal,
size=position_size,
confidence=abs(upside_prob - 0.5) * 2,
var_95=var_95,
expected_return=mean_return
)

Размер позиции с ограничениями VaR

def size_position_with_var(forecast, risk_budget, current_portfolio):
"""
Определение размера позиции так, чтобы VaR портфеля
оставался в рамках бюджета риска.
"""
portfolio_var = compute_portfolio_var(current_portfolio, forecast)
max_size = risk_budget / forecast.var_95
kelly_size = compute_kelly(forecast)
# Берём минимум из Келли и VaR-ограниченного размера
position_size = min(kelly_size, max_size)
return position_size

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

Качество прогнозов

МетрикаФормулаИнтерпретация
CRPSСм. вышеМеньше = лучше вероятностная точность
Log Scorelog(p(y))Больше = лучше; чувствителен к хвостам
Ошибка калибровкиF(y) - U
РезкостьСредняя ширина интервалаМеньше = точнее
Покрытие% в 90% ДИДолжно равняться 90%

Торговая эффективность

МетрикаЦельОписание
Sharpe Ratio> 2.0Риск-скорр. доходность
Sortino Ratio> 2.5С учётом нисходящего риска
Макс. просадка< 15%Наибольшее падение от пика
Win Rate> 55%Процент прибыльных сделок
Profit Factor> 1.5Валовая прибыль / Валовый убыток
Рост по Келли> 10%Годовой оптимальный рост

Детали реализации

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

Данные криптовалютного рынка:
├── OHLCV данные (минимум 1-минутное разрешение)
│ └── Несколько таймфреймов для признаков
├── Снэпшоты ордербука
│ └── Метрики глубины и дисбаланса
├── Данные о потоке сделок
│ └── Индикаторы давления покупки/продажи
└── Данные о волатильности
├── Историческая реализованная волатильность
└── Подразумеваемая волатильность (если доступна)
Инженерия признаков:
├── Доходности на разных горизонтах
├── Скользящие меры волатильности
├── Признаки, взвешенные по объёму
├── Технические индикаторы (RSI, MACD, BB)
└── Календарные/сезонные признаки

Конфигурация обучения

model:
type: "deepar" # или "quantile_regression", "mixture_density"
hidden_size: 128
num_layers: 2
dropout: 0.1
distribution: "student_t" # или "gaussian", "negative_binomial"
quantiles: # если используется квантильная регрессия
- 0.05
- 0.10
- 0.25
- 0.50
- 0.75
- 0.90
- 0.95
training:
batch_size: 64
learning_rate: 0.001
epochs: 100
early_stopping_patience: 10
data:
sequence_length: 120 # 2 часа 1-минутных данных
prediction_horizons: [5, 15, 60] # минут вперёд
train_ratio: 0.7
val_ratio: 0.15
test_ratio: 0.15

Преимущества вероятностного прогнозирования

АспектТочечные прогнозыВероятностные прогнозы
НеопределённостьСкрытаЯвная
Управление рискамиРучной VaRИнтегрированный
Размер позицииЭвристическийПринципиальный (Келли)
Принятие решенийНа основе пороговОжидаемая полезность
КалибровкаН/ПИзмеримая
Хвостовой рискИгнорируетсяЗахватывается
Выбор моделиТолько MSE/MAECRPS, Log Score

Структура директории

329_probabilistic_forecasting/
├── README.md # English version
├── README.ru.md # Этот файл
├── readme.simple.md # Простое объяснение (English)
├── readme.simple.ru.md # Простое объяснение (Russian)
├── python/ # Python реализация
│ ├── requirements.txt
│ ├── config.yaml
│ ├── data_fetcher.py # Данные Bybit через CCXT
│ ├── features.py # Инженерия признаков
│ ├── models/
│ │ ├── quantile_regression.py
│ │ ├── deepar.py
│ │ └── mixture_density.py
│ ├── scoring.py # CRPS, Log Score, калибровка
│ ├── strategy.py # Торговая стратегия
│ ├── backtest.py # Движок бэктестинга
│ └── examples/
│ ├── train_model.py
│ ├── evaluate_forecasts.py
│ └── run_backtest.py
└── rust_probabilistic/ # Rust реализация
├── Cargo.toml
├── src/
│ ├── lib.rs
│ ├── api/ # Bybit API клиент
│ ├── distributions/ # Распределения вероятностей
│ ├── models/ # Модели прогнозирования
│ ├── scoring/ # Строгие правила оценки
│ ├── strategy/ # Торговая стратегия
│ └── backtest/ # Движок бэктестинга
└── examples/
├── fetch_data.rs
├── quantile_forecast.rs
└── backtest.rs

Ссылки

  1. Probabilistic Forecasting (Gneiting & Katzfuss, 2014)

    • Annual Review of Statistics: Основы вероятностного прогнозирования
  2. DeepAR: Probabilistic Forecasting with Autoregressive RNNs (Salinas et al., 2020)

  3. Strictly Proper Scoring Rules, Prediction, and Estimation (Gneiting & Raftery, 2007)

    • Journal of the American Statistical Association
  4. Quantile Regression (Koenker, 2005)

    • Cambridge University Press
  5. Kelly Criterion in Portfolio Optimization (MacLean et al., 2011)

    • The Kelly Capital Growth Investment Criterion
  6. Calibration of Probabilistic Forecasts (Gneiting et al., 2007)

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

Продвинутый — Требуется понимание:

  • Теория вероятностей и статистика
  • Анализ временных рядов
  • Концепции байесовского вывода
  • Принципы управления рисками
  • Архитектуры глубокого обучения

Предупреждение

Эта глава предназначена только для образовательных целей. Торговля криптовалютами связана со значительным риском. Стратегии, описанные здесь, не были проверены в реальной торговле и должны быть тщательно протестированы перед любым реальным применением. Прошлые результаты не гарантируют будущих результатов. Вероятностные прогнозы предоставляют оценки неопределённости, но не могут устранить риск.