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

Глава 323: Квантификация неопределённости для трейдинга

Введение: Почему неопределённость важна в торговых решениях

Финансовые рынки по своей природе неопределённы. Каждое торговое решение связано с прогнозом непознаваемого будущего, однако большинство моделей машинного обучения выдают точечные оценки, создающие ложное впечатление точности. Модель может предсказать, что BTCUSDT достигнет $72 000 завтра, но насколько она уверена в этом? Одинаково ли уверена модель в этом прогнозе по сравнению с вчерашним прогнозом, который оказался верным? Без квантификации неопределённости трейдеры действуют вслепую.

Квантификация неопределённости (uncertainty quantification, UQ) превращает сырые прогнозы в практически полезную информацию, прикрепляя меру уверенности к каждому прогнозу. Вместо единственной целевой цены UQ предоставляет распределение возможных исходов. Это позволяет осуществлять риск-ориентированное определение размера позиции, динамическое размещение стоп-лоссов и обоснованные решения о том, когда торговать, а когда оставаться в стороне. Модель, которая говорит «я предсказываю рост цены, но очень не уверена», передаёт принципиально другую информацию, чем модель, которая говорит «я предсказываю рост цены и очень в этом уверена».

В традиционных финансах концепция неопределённости всегда присутствовала через такие меры, как волатильность и Value at Risk. Однако эти подходы обычно охватывают только одно измерение неопределённости — присущую случайность рыночных данных. Современные методы машинного обучения позволяют разложить неопределённость на составляющие и оценить каждую из них отдельно, предоставляя более полную картину для принятия решений.

Практические последствия значительны. Исследования показали, что торговые стратегии с учётом неопределённости могут снизить максимальную просадку на 20-40% по сравнению со стратегиями, игнорирующими уверенность прогнозов. Масштабируя размеры позиций обратно пропорционально неопределённости, трейдеры естественным образом становятся более консервативными в волатильные или необычные периоды рынка, когда модели наименее надёжны. В этой главе исследуются теория, методы и реализация на Rust квантификации неопределённости для торговли криптовалютами.

Эпистемическая и алеаторная неопределённость

Понимание двух фундаментальных типов неопределённости критически важно для построения эффективных торговых систем.

Алеаторная неопределённость (шум данных)

Алеаторная неопределённость, также называемая неопределённостью данных или нередуцируемой неопределённостью, возникает из-за присущей случайности процесса генерации данных. На финансовых рынках она включает:

  • Шум микроструктуры: случайные колебания от потока ордеров, отскока bid-ask и деятельности маркет-мейкеров
  • Скачки из-за новостей: непредвиденные события, которые ни одна модель не может предсказать только из исторических данных
  • Смена режимов: структурные сдвиги в рыночной динамике, фундаментально меняющие поведение цен
  • Колебания ликвидности: случайные изменения глубины рынка, влияющие на воздействие на цену

Алеаторную неопределённость нельзя снизить, собирая больше данных или строя лучшие модели. Она представляет фундаментальный предел предсказуемости. Хорошо откалиброванная модель должна признавать этот шум, а не пытаться его подогнать.

На практике алеаторную неопределённость можно оценить, заставив модель выводить не только среднее предсказание, но и параметр дисперсии. Для гауссовского выхода модель предсказывает как mu (математическое ожидание), так и sigma в квадрате (дисперсию), где sigma в квадрате улавливает шум данных в каждой входной точке.

Эпистемическая неопределённость (неопределённость модели)

Эпистемическая неопределённость, также называемая неопределённостью модели или редуцируемой неопределённостью, возникает из-за ограничений самой модели. Она включает:

  • Ограниченные обучающие данные: модель не видела достаточно примеров для изучения истинной зависимости
  • Входы вне распределения: текущие рыночные условия значительно отличаются от обучающих данных
  • Неверная спецификация модели: архитектура модели не может уловить истинную сложность зависимости
  • Неопределённость параметров: несколько наборов параметров могут одинаково хорошо объяснять обучающие данные

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

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

Разделение двух типов

Общая прогнозная неопределённость является суммой алеаторной и эпистемической компонент:

Общая неопределённость = Алеаторная неопределённость + Эпистемическая неопределённость

Ансамбли (Deep Ensembles) и байесовские методы естественным образом разделяют неопределённость таким образом. Алеаторная компонента определяется средней дисперсией, предсказанной членами ансамбля, а эпистемическая — дисперсией средних значений между членами ансамбля. Это разложение предоставляет практическую информацию: высокая алеаторная неопределённость означает, что рынок сам по себе непредсказуем в данной точке, тогда как высокая эпистемическая неопределённость означает, что модели нужно больше данных для обучения в данном режиме.

Методы квантификации неопределённости

Метод Монте-Карло с дропаутом (MC Dropout)

MC Dropout — простейший подход к квантификации неопределённости. Во время обучения дропаут случайным образом деактивирует нейроны для предотвращения переобучения. Ключевое наблюдение Gal и Ghahramani (2016) состоит в том, что сохранение дропаута активным во время инференса и многократный прогон модели даёт различные предсказания каждый раз. Разброс этих предсказаний аппроксимирует байесовскую неопределённость.

Алгоритм:

  1. Обучить нейронную сеть со слоями дропаута как обычно
  2. Во время инференса оставить дропаут активным (не переключаться в режим eval)
  3. Пропустить один и тот же вход через модель T раз (обычно T = 50-100)
  4. Вычислить среднее предсказание как итоговый прогноз
  5. Вычислить дисперсию предсказаний как оценку неопределённости

Преимущества:

  • Прост в реализации — просто оставьте дропаут включённым при инференсе
  • Работает с любой существующей моделью, обученной с дропаутом
  • Вычислительно дёшев по сравнению с полным байесовским выводом

Ограничения:

  • Оценки неопределённости зависят от уровня и размещения дропаута
  • Может недооценивать неопределённость по сравнению с полностью байесовскими методами
  • Качество неопределённости зависит от конкретной архитектуры дропаута

Глубокие ансамбли (Deep Ensembles)

Глубокие ансамбли, предложенные Lakshminarayanan и др. (2017), обучают несколько нейронных сетей независимо с различными случайными инициализациями. Каждая модель сходится к своему локальному минимуму в ландшафте функции потерь, и разногласие между моделями улавливает эпистемическую неопределённость.

Алгоритм:

  1. Обучить M независимых моделей (обычно M = 5-10) с разными случайными зёрнами
  2. Каждая модель предсказывает среднее и дисперсию (улавливая алеаторную неопределённость)
  3. Итоговое предсказание — среднее индивидуальных средних
  4. Эпистемическая неопределённость — дисперсия индивидуальных средних
  5. Алеаторная неопределённость — среднее индивидуальных дисперсий
  6. Общая неопределённость — сумма обеих компонент

Преимущества:

  • Лучшие на практике оценки неопределённости
  • Естественным образом разделяет алеаторную и эпистемическую неопределённость
  • Модели можно обучать параллельно
  • Не требуется модификация архитектуры

Ограничения:

  • Требуется обучение нескольких моделей (M-кратная вычислительная стоимость)
  • Требования к хранению линейно масштабируются с размером ансамбля

Байесовские нейронные сети

Байесовские нейронные сети (BNN) устанавливают вероятностные распределения над весами сети вместо изучения точечных оценок. Вместо одного значения веса каждый вес характеризуется средним и дисперсией, представляющими убеждение об истинном значении параметра.

Ключевые концепции:

  • Априорное распределение: начальное убеждение о распределениях весов (до наблюдения данных)
  • Правдоподобие: насколько хорошо веса объясняют наблюдаемые данные
  • Апостериорное распределение: обновлённое убеждение после наблюдения данных (через теорему Байеса)

Полный байесовский вывод для весов нейронной сети неосуществим для больших сетей. Практические приближения включают вариационный вывод (обучение приближённого апостериорного распределения) и SWAG (Stochastic Weight Averaging Gaussian), который подгоняет гауссиан к траектории итераций SGD.

Конформное предсказание для торговых сигналов

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

Алгоритм (Split Conformal):

  1. Разделить данные на обучающую и калибровочную выборки
  2. Обучить модель на обучающей выборке
  3. Вычислить баллы несоответствия на калибровочной выборке: scores = |y_факт - y_прогноз|
  4. Для желаемого уровня покрытия (1 - alpha) найти (1 - alpha)-квантиль баллов
  5. На этапе тестирования интервал предсказания = [y_pred - q, y_pred + q]

Для торговых приложений:

  • Адаптивные интервалы: интервалы расширяются в волатильные периоды и сужаются в спокойные при использовании локально взвешенных конформных методов
  • Гарантия покрытия: со временем ровно (1 - alpha) доля истинных значений попадает в интервал
  • Генерация сигналов: торговать только когда интервал предсказания не содержит ноль (уверенный направленный сигнал)

Конформное предсказание особенно привлекательно для соответствия нормативным требованиям, поскольку обеспечивает статистические гарантии без предположений о распределении.

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

Мы реализуем основные методы квантификации неопределённости на Rust для критически важных по производительности торговых приложений. Реализация включает симуляцию MC Dropout, глубокие ансамбли, конформное предсказание и интеграцию с API Bybit.

Основные структуры данных

pub struct PredictionWithUncertainty {
pub mean: f64,
pub epistemic_uncertainty: f64,
pub aleatoric_uncertainty: f64,
pub total_uncertainty: f64,
pub confidence_interval: (f64, f64),
pub confidence_level: f64,
}
pub struct EnsembleMember {
pub weights: Vec<Vec<f64>>,
pub biases: Vec<f64>,
pub seed: u64,
}

Реализация MC Dropout

pub fn mc_dropout_predict(
input: &[f64],
weights: &[Vec<f64>],
dropout_rate: f64,
n_samples: usize,
) -> PredictionWithUncertainty {
let mut predictions = Vec::with_capacity(n_samples);
let mut rng = rand::thread_rng();
for _ in 0..n_samples {
let masked: Vec<f64> = weights.iter()
.map(|w| {
let dot: f64 = w.iter().zip(input.iter())
.map(|(wi, xi)| {
if rng.gen::<f64>() > dropout_rate {
wi * xi / (1.0 - dropout_rate)
} else {
0.0
}
})
.sum();
dot
})
.collect();
let pred: f64 = masked.iter().sum::<f64>() / masked.len() as f64;
predictions.push(pred);
}
compute_uncertainty(&predictions, 0.95)
}

Предсказание глубокого ансамбля

pub fn ensemble_predict(
input: &[f64],
members: &[EnsembleMember],
) -> PredictionWithUncertainty {
let predictions: Vec<f64> = members.iter()
.map(|m| {
m.weights.iter()
.map(|w| w.iter().zip(input).map(|(a, b)| a * b).sum::<f64>())
.sum::<f64>() / m.weights.len() as f64
+ m.biases.iter().sum::<f64>() / m.biases.len() as f64
})
.collect();
compute_uncertainty(&predictions, 0.95)
}

Конформное предсказание

pub fn conformal_intervals(
calibration_errors: &[f64],
prediction: f64,
alpha: f64,
) -> (f64, f64) {
let mut sorted = calibration_errors.to_vec();
sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
let idx = ((1.0 - alpha) * sorted.len() as f64).ceil() as usize;
let quantile = sorted[idx.min(sorted.len() - 1)];
(prediction - quantile, prediction + quantile)
}

Интеграция с криптоданными Bybit

Реализация получает реальные данные OHLCV через публичный API Bybit для дневных свечей BTCUSDT и ETHUSDT. Эти данные служат основой для обучения ансамблевых моделей и генерации прогнозов с учётом неопределённости.

pub async fn fetch_bybit_klines(
symbol: &str,
interval: &str,
limit: u32,
) -> Result<Vec<Candle>> {
let url = format!(
"https://api.bybit.com/v5/market/kline?category=linear&symbol={}&interval={}&limit={}",
symbol, interval, limit
);
let resp = reqwest::get(&url).await?.json::<BybitResponse>().await?;
Ok(candles)
}

API возвращает стандартные данные OHLCV, которые мы преобразуем в признаки для ансамблевой модели:

  • Доходности: логарифмические доходности за 1, 5 и 20 периодов
  • Волатильность: скользящее стандартное отклонение доходностей
  • Коэффициент объёма: текущий объём относительно скользящего среднего
  • Позиция цены: где текущая цена находится в пределах недавнего диапазона максимум-минимум

Торговля с поправкой на риск с использованием оценок неопределённости

Оценки неопределённости обеспечивают продвинутое управление рисками, выходящее за рамки простых стоп-лоссов.

Определение размера позиции

Критерий Келли может быть расширен с учётом неопределённости:

размер_позиции = базовый_размер * (1 - нормализованная_неопределённость)

Когда неопределённость высока, размеры позиций сокращаются. Когда модель уверена, позиции приближаются к базовому размеру. Это естественным образом реализует политику «торгуй меньше, когда не уверен».

Фильтрация сигналов

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

fn should_trade(prediction: &PredictionWithUncertainty) -> bool {
let (lower, upper) = prediction.confidence_interval;
(lower > 0.0 && upper > 0.0) || (lower < 0.0 && upper < 0.0)
}

Динамические стоп-лоссы

Установка уровней стоп-лосса на основе ширины интервала предсказания:

стоп_лосс = цена_входа - k * общая_неопределённость

Где k — параметр толерантности к риску. Более широкая неопределённость приводит к более широким стопам, предотвращая преждевременный выход в действительно неопределённых условиях.

Обнаружение смены режима

Резкий скачок эпистемической неопределённости может сигнализировать о смене режима. Когда модель сталкивается с рыночными условиями, не похожими ни на что в её обучающих данных, эпистемическая неопределённость резко возрастает. Это может вызвать:

  • Уменьшение размеров позиций по всем стратегиям
  • Увеличение коэффициентов хеджирования
  • Оповещения для ручной проверки торговой команде

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

  1. Квантификация неопределённости превращает точечные прогнозы в вероятностные распределения, обеспечивая принятие решений с учётом риска на основе уверенности модели.

  2. Алеаторная и эпистемическая неопределённость служат разным целям: алеаторная улавливает нередуцируемый рыночный шум, а эпистемическая сигнализирует, когда модель работает за пределами своей зоны компетенции.

  3. Глубокие ансамбли обеспечивают лучшие практические оценки неопределённости, обучая несколько моделей и измеряя их разногласие. Они естественным образом разлагают общую неопределённость на алеаторную и эпистемическую компоненты.

  4. MC Dropout предлагает легковесную альтернативу, не требующую архитектурных изменений — просто оставьте дропаут активным при инференсе и выполните несколько прямых проходов.

  5. Конформное предсказание обеспечивает гарантии без предположений о распределении для покрытия интервалов предсказания, что подходит для приложений, требующих статистических гарантий.

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

  7. Скачки эпистемической неопределённости служат детекторами смены режима. Когда модель сталкивается с условиями, далёкими от обучающего распределения, эпистемическая неопределённость резко возрастает, обеспечивая ранний предупреждающий сигнал.

  8. Реализация на Rust обеспечивает квантификацию неопределённости в реальном времени с производительностью, необходимой для живых торговых систем, а интеграция с API Bybit предоставляет доступ к данным криптовалютного рынка для пар BTCUSDT и ETHUSDT.

  9. Комбинирование нескольких методов UQ (ансамбли для предсказания, конформное предсказание для калибровки) обеспечивает наиболее робастные оценки неопределённости для продуктивных торговых систем.

  10. Ценность квантификации неопределённости накапливается со временем. Даже небольшие улучшения в определении размера позиций и фильтрации сигналов благодаря осведомлённости о неопределённости приводят к значительно лучшей доходности с поправкой на риск на протяжении сотен или тысяч сделок.