Глава 329: Вероятностное прогнозирование для трейдинга
Обзор
Вероятностное прогнозирование выходит за рамки традиционных точечных прогнозов, предоставляя полные распределения вероятностей для будущих исходов. Вместо прогноза “цена будет $100”, вероятностные методы предсказывают “цена будет между $95 и $105 с 90% уверенностью, при этом наиболее вероятное значение — $100”. Эта смена парадигмы позволяет принимать решения с учётом риска, правильно оценивать неопределённость и создавать более устойчивые торговые стратегии.
Почему вероятностное прогнозирование для трейдинга?
Проблема точечных прогнозов
Традиционные модели прогнозирования выдают одно число (точечный прогноз):
Вход: Исторические цены, признакиМодель: LSTM, XGBoost, Линейная регрессияВыход: Цена завтра = $45,250 (одно число)Проблемы:
- Нет меры неопределённости — Насколько мы уверены в этом прогнозе?
- Чрезмерная уверенность — Точечные прогнозы кажутся точнее, чем есть на самом деле
- Плохое управление рисками — Невозможно правильно рассчитать размер позиции без оценки неопределённости
- Игнорирование формы распределения — Асимметричные риски (толстые хвосты) невидимы
Вероятностное решение
Вход: Исторические цены, признакиМодель: 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.05 → 5-й перцентиль (экстремальное падение)τ = 0.25 → 25-й перцентиль (умеренное падение)τ = 0.50 → 50-й перцентиль (медиана)τ = 0.75 → 75-й перцентиль (умеренный рост)τ = 0.95 → 95-й перцентиль (экстремальный рост)Квантильная функция потерь (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 Score | log(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/MAE | CRPS, 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Ссылки
-
Probabilistic Forecasting (Gneiting & Katzfuss, 2014)
- Annual Review of Statistics: Основы вероятностного прогнозирования
-
DeepAR: Probabilistic Forecasting with Autoregressive RNNs (Salinas et al., 2020)
-
Strictly Proper Scoring Rules, Prediction, and Estimation (Gneiting & Raftery, 2007)
- Journal of the American Statistical Association
-
Quantile Regression (Koenker, 2005)
- Cambridge University Press
-
Kelly Criterion in Portfolio Optimization (MacLean et al., 2011)
- The Kelly Capital Growth Investment Criterion
-
Calibration of Probabilistic Forecasts (Gneiting et al., 2007)
Уровень сложности
Продвинутый — Требуется понимание:
- Теория вероятностей и статистика
- Анализ временных рядов
- Концепции байесовского вывода
- Принципы управления рисками
- Архитектуры глубокого обучения
Предупреждение
Эта глава предназначена только для образовательных целей. Торговля криптовалютами связана со значительным риском. Стратегии, описанные здесь, не были проверены в реальной торговле и должны быть тщательно протестированы перед любым реальным применением. Прошлые результаты не гарантируют будущих результатов. Вероятностные прогнозы предоставляют оценки неопределённости, но не могут устранить риск.