Глава 322: Торговля с использованием гауссовских процессов
1. Введение: Гауссовские процессы для торговли с учётом неопределённости
Финансовые рынки по своей природе неопределённы, однако большинство моделей машинного обучения, используемых в торговле, выдают точечные прогнозы без какой-либо меры уверенности. Модель, предсказывающая, что биткоин будет стоить $68 000 завтра, гораздо менее полезна, чем та, которая говорит: «Я прогнозирую $68 000 с 95% доверительным интервалом [$65 500, $70 500]». Именно это и обеспечивают гауссовские процессы (GP): принципиальную количественную оценку неопределённости наряду с прогнозами.
Гауссовский процесс — это непараметрический байесовский подход к регрессии (и классификации). Вместо обучения фиксированного набора весов, как в нейронных сетях, GP определяет распределение над функциями. На основе наблюдаемых данных мы можем вычислить апостериорное распределение над функциями, которое даёт нам как среднее предсказание, так и дисперсию (неопределённость) в каждой точке. В торговле это означает, что мы можем:
- Масштабировать позиции пропорционально уверенности: когда GP высоко уверен в росте цены, выделять больше капитала. При неуверенности — сокращать экспозицию или оставаться вне рынка.
- Обнаруживать смену режимов: резкое увеличение апостериорной дисперсии сигнализирует о том, что рынок ведёт себя иначе, чем в обучающих данных, указывая на потенциальную смену режима.
- Устанавливать динамические стоп-лоссы и тейк-профиты: доверительные интервалы предоставляют естественные уровни для управления рисками.
GP имеют богатую теоретическую основу, уходящую корнями в байесовскую статистику, и применяются в науке и инженерии на протяжении десятилетий. Их применение к финансовым временным рядам особенно убедительно, поскольку рынки демонстрируют нестационарное поведение, сложные корреляции и распределения с тяжёлыми хвостами — всё это выигрывает от модели, которая честно сообщает о своих ограничениях.
В этой главе мы разработаем полноценную торговую систему на основе гауссовских процессов на Rust, применяя её к данным BTCUSDT с биржи Bybit. Мы рассмотрим математические основы, практические детали реализации и стратегии для масштабирования GP до уровня, достаточного для торговли в реальном времени.
2. Математические основы
2.1 Определение гауссовского процесса
Гауссовский процесс — это совокупность случайных величин, любое конечное число которых имеет совместное гауссовское распределение. GP полностью определяется:
- Функцией среднего m(x) = E[f(x)]
- Ковариационной (ядерной) функцией k(x, x’) = E[(f(x) - m(x))(f(x’) - m(x’))]
Мы записываем: f(x) ~ GP(m(x), k(x, x’))
Для простоты обычно полагаем m(x) = 0, поскольку любое ненулевое среднее может быть поглощено ядром или обработано при предобработке данных.
2.2 Ядерные функции
Ядерная функция кодирует наши априорные убеждения о моделируемой функции — её гладкость, периодичность, амплитуду и масштаб длины. Три ядра особенно полезны для финансовых временных рядов:
Радиальная базисная функция (RBF) / Квадратичная экспоненциальная:
k(x, x’) = sigma_f^2 * exp(-||x - x’||^2 / (2 * l^2))
где sigma_f^2 — дисперсия сигнала (контролирует амплитуду), а l — масштаб длины (контролирует скорость затухания корреляций с расстоянием). Ядро RBF порождает бесконечно дифференцируемые (очень гладкие) функции. В торговле это отражает медленно движущиеся тренды.
Ядро Матерна 5/2:
k(x, x’) = sigma_f^2 * (1 + sqrt(5) * r / l + 5 * r^2 / (3 * l^2)) * exp(-sqrt(5) * r / l)
где r = ||x - x’||. Ядро Матерна 5/2 дважды дифференцируемо и порождает функции, которые гладкие, но не нереалистично. Это часто лучший выбор по умолчанию для финансовых данных, которые демонстрируют более грубое поведение, чем предполагает ядро RBF.
Периодическое ядро:
k(x, x’) = sigma_f^2 * exp(-2 * sin^2(pi * |x - x’| / p) / l^2)
где p — период. Это ядро отражает повторяющиеся закономерности, полезное для моделирования внутридневной сезонности, эффектов дня недели или месячных циклов на крипторынках.
Ядра можно комбинировать сложением и умножением. Например, ядро RBF + Периодическое может моделировать гладкий тренд с сезонными колебаниями.
2.3 Апостериорное распределение GP (Предсказание)
Для обучающих данных X (n x d) и наблюдений y (n x 1) с дисперсией шума sigma_n^2, а также тестовых точек X* (m x d), апостериорное распределение GP:
Апостериорное среднее: mu* = K(X*, X) [K(X, X) + sigma_n^2 I]^(-1) y
Апостериорная ковариация: Sigma* = K(X*, X*) - K(X*, X) [K(X, X) + sigma_n^2 I]^(-1) K(X, X*)
где K(A, B) обозначает матрицу ядра с элементами k(a_i, b_j).
Ключевое наблюдение: апостериорное среднее даёт наш прогноз, а диагональ апостериорной ковариации — неопределённость (дисперсию) в каждой тестовой точке. Вдали от обучающих данных дисперсия возвращается к априорной дисперсии sigma_f^2; вблизи обучающих данных дисперсия уменьшается.
2.4 Численная устойчивость: разложение Холецкого
Прямое обращение K + sigma_n^2 I численно неустойчиво и вычислительно дорого (O(n^3)). Вместо этого мы используем разложение Холецкого:
L = cholesky(K(X, X) + sigma_n^2 I)
Затем решаем с помощью прямой/обратной подстановки:
alpha = L^T \ (L \ y) mu* = K(X*, X) alpha
Это быстрее и численно устойчивее, чем явное обращение матрицы.
2.5 Логарифм маргинального правдоподобия
Логарифм маргинального правдоподобия (LML) — ключевая величина для выбора модели и оптимизации гиперпараметров:
log p(y | X, theta) = -0.5 * y^T alpha - sum(log(diag(L))) - (n/2) * log(2 * pi)
где theta представляет гиперпараметры (sigma_f, l, sigma_n). Максимизация LML балансирует между качеством подгонки (первый член) и сложностью модели (второй член), обеспечивая автоматическую бритву Оккама.
2.6 Оптимизация гиперпараметров
Мы оптимизируем гиперпараметры, максимизируя логарифм маргинального правдоподобия. Хотя градиентные методы (использующие частные производные LML по гиперпараметрам) эффективны, безградиентный подход с использованием сеточного или случайного поиска в логарифмическом пространстве проще в реализации и часто достаточен:
- Определить диапазоны: log(l) в [-2, 2], log(sigma_f) в [-2, 2], log(sigma_n) в [-4, 0]
- Вычислить LML в точках-кандидатах
- Выбрать гиперпараметры с наибольшим LML
3. Применение в торговле
3.1 Прогнозирование цены с доверительными интервалами
Наиболее прямое применение: обучить GP на недавних ценовых данных и предсказать будущие цены. Апостериорное среднее даёт прогнозируемую цену, а апостериорная дисперсия — доверительные интервалы.
Торговые сигналы на основе прогнозов GP:
- Сигнал на покупку: предсказанное среднее > текущая цена + 2 * sigma (95% уверенность в значительном росте цены)
- Сигнал на продажу: предсказанное среднее < текущая цена - 2 * sigma
- Размер позиции: обратно пропорционален предсказанной дисперсии. Высокая уверенность -> большая позиция; низкая уверенность -> меньшая позиция или отсутствие позиции.
3.2 Обнаружение смены режима через неопределённость
Когда апостериорная дисперсия GP резко возрастает для прогнозов в пределах выборки, это указывает на то, что текущие данные несовместимы с обученной моделью GP. Это естественный детектор смены режима:
- Период низкой дисперсии: рынок ведёт себя в соответствии с обученной моделью. Продолжать торговлю.
- Период высокой дисперсии: рынок изменился. Сократить размер позиций, приостановить торговлю или переобучить модель.
Этот подход не требует размеченных данных о режимах — он возникает естественно из байесовской неопределённости GP.
3.3 Моделирование поверхности волатильности
GP отлично подходят для моделирования поверхностей подразумеваемой волатильности при ценообразовании опционов. Структура ядра естественно отражает гладкую, непараметрическую форму поверхности волатильности по страйкам и срокам экспирации.
4. Разреженные GP и индуцирующие точки для масштабируемости
Вычислительная стоимость O(n^3) стандартных GP ограничивает их применимость наборами данных из нескольких тысяч точек. Для больших наборов данных необходимы аппроксимации разреженных GP.
4.1 Подход с индуцирующими точками
Вместо обусловливания на все n обучающих точек мы выбираем m << n индуцирующих точек Z = {z_1, …, z_m} и аппроксимируем апостериорное распределение:
q(f*) = integral p(f* | u) q(u) du
где u = f(Z) — значения функции в индуцирующих точках. Основные методы аппроксимации:
- Подмножество регрессоров (SoR): использует q(u) = p(u | y), давая сложность O(nm^2).
- Полностью независимое обучающее условное (FITC): добавляет диагональную поправку для лучших оценок неопределённости.
- Вариационная свободная энергия (VFE): оптимизирует расположение индуцирующих точек совместно с гиперпараметрами через вариационную границу.
4.2 Практические соображения
Для торговых приложений:
- Используйте m = 50-200 индуцирующих точек для наборов данных из 1000-10000 точек
- Размещайте индуцирующие точки с помощью k-means на обучающих входах как начальную инициализацию
- Периодически переобучайте (например, ежедневно) для адаптации к эволюции рынка
5. Обзор реализации на Rust
Наша реализация на Rust состоит из нескольких основных компонентов:
5.1 Трейт ядра и реализации
Мы определяем трейт Kernel с методом evaluate, затем реализуем RBFKernel и Matern52Kernel. Каждое ядро хранит свои гиперпараметры (масштаб длины l и дисперсию сигнала sigma_f).
5.2 Структура GP
Структура GaussianProcess содержит:
- Обучающие данные (X, y)
- Выбор ядра и гиперпараметры
- Дисперсию шума sigma_n
- Кэшированный множитель Холецкого L и вектор alpha (для эффективного предсказания после обучения)
5.3 Конвейер предсказания
- Вычислить матрицу ядра K(X, X) + sigma_n^2 I
- Разложение Холецкого -> L
- Решить L alpha = y для alpha (прямая/обратная подстановка)
- Для тестовых точек: mu* = k* . alpha, sigma*^2 = k** - v^T v где L v = k*
5.4 Интеграция с Bybit
Мы получаем данные свечей BTCUSDT с API Bybit v5:
- Эндпоинт:
GET /v5/market/kline - Параметры: category=linear, symbol=BTCUSDT, interval=D (дневные)
- Парсинг цен закрытия и временных меток
- Нормализация для входа GP (масштабирование в диапазон [0, 1] для лучшей обусловленности)
5.5 Генерация торговых сигналов
На основе прогнозов GP с неопределённостью:
if predicted_mean > current_price + 2.0 * predicted_std { signal = "СИЛЬНАЯ ПОКУПКА"} else if predicted_mean > current_price + predicted_std { signal = "ПОКУПКА"} else if predicted_mean < current_price - 2.0 * predicted_std { signal = "СИЛЬНАЯ ПРОДАЖА"} else if predicted_mean < current_price - predicted_std { signal = "ПРОДАЖА"} else { signal = "УДЕРЖИВАТЬ"}6. Работа с криптоданными Bybit
6.1 Конвейер данных
Наша реализация получает реальные дневные свечи BTCUSDT с биржи Bybit:
- API-запрос: запрос к эндпоинту
/v5/market/klineдля дневных данных OHLCV - Формирование признаков: извлечение цен закрытия, вычисление логарифмических доходностей и нормализация временных меток
- Подготовка входа GP: масштабирование признаков для улучшения числовой обусловленности матриц ядра
- Разделение обучение/тест: использование последних N дней для обучения, прогноз на следующие M дней
6.2 Прогноз с полосами неопределённости
GP выдаёт прогнозы с полосами неопределённости, которые естественно расширяются по мере удаления горизонта прогноза. Это критическое преимущество перед моделями точечного прогноза:
- 1 день вперёд: узкие доверительные интервалы (GP имеет сильную информацию)
- 5 дней вперёд: более широкие интервалы (растущая неопределённость)
- 10 дней вперёд: очень широкие интервалы (GP честно сообщает, что не может предсказывать далеко вперёд)
Эта честная количественная оценка неопределённости предотвращает чрезмерно уверенные торговые решения.
6.3 Пример вывода
=== Прогнозы GP для BTCUSDT ===Текущая цена: $67,245.30
День +1: $67,512.40 +/- $423.18 [66,666.04 - 68,358.76] -> УДЕРЖИВАТЬДень +2: $67,891.20 +/- $891.45 [66,108.30 - 69,674.10] -> УДЕРЖИВАТЬДень +3: $68,234.10 +/- $1,534.22 [65,165.66 - 71,302.54] -> УДЕРЖИВАТЬДень +5: $68,890.50 +/- $2,891.33 [63,107.84 - 74,673.16] -> УДЕРЖИВАТЬОбратите внимание, как неопределённость растёт с увеличением горизонта прогноза — отличительный признак честного вероятностного моделирования.
6.4 Практические советы для торговли с GP
- Переобучайте часто: финансовые данные нестационарны. Переобучайте GP ежедневно или когда LML значительно падает.
- Используйте логарифмические доходности, а не цены: логарифмические доходности ближе к стационарным и лучше подходят как целевые переменные GP.
- Комбинируйте ядра: ядро Матерна 5/2 + Периодическое может отражать как тренды, так и недельные циклы.
- Мониторьте апостериорную дисперсию: рост дисперсии в пределах выборки — ранний предупреждающий сигнал о смене режима.
- Держите окна обучения небольшими: 30-100 точек данных часто работают лучше, чем тысячи, поскольку далёкая история может быть нерелевантной.
7. Ключевые выводы
-
Гауссовские процессы предоставляют как прогнозы, так и оценки неопределённости, что делает их идеальными для торговых систем с учётом риска. В отличие от нейронных сетей или моделей на деревьях, GP естественно количественно оценивают свою уверенность.
-
Выбор ядра кодирует рыночные априорные убеждения: ядро RBF предполагает гладкие функции; Матерна 5/2 допускает более грубое поведение, более соответствующее финансовым данным; периодические ядра отражают сезонность. Комбинирование ядер позволяет моделировать сложную рыночную структуру.
-
Логарифм маргинального правдоподобия обеспечивает принципиальный выбор модели: гиперпараметры оптимизируются путём максимизации LML, которая автоматически балансирует подгонку и сложность без необходимости в валидационном наборе.
-
Разложение Холецкого необходимо для численной устойчивости: никогда не инвертируйте матрицы ядра явно. Всегда используйте факторизацию Холецкого с прямой/обратной подстановкой.
-
Аппроксимации разреженных GP обеспечивают масштабируемость: методы индуцирующих точек снижают сложность O(n^3) до O(nm^2), делая GP практичными для больших торговых наборов данных.
-
Размер позиции на основе неопределённости — естественный инструмент управления рисками: масштабируйте позиции обратно пропорционально предсказанной дисперсии. Это автоматически снижает экспозицию, когда модель не уверена.
-
Обнаружение смены режима возникает естественно из неопределённости GP: рост апостериорной дисперсии на данных внутри выборки сигнализирует о том, что рынок изменился, обеспечивая автоматический детектор смены режима без размеченных данных.
-
GP наиболее эффективны для краткосрочных прогнозов: честные полосы неопределённости быстро расширяются с горизонтом прогноза, делая GP наиболее подходящими для прогнозов от внутридневных до нескольких дней, а не для долгосрочных предсказаний.
-
Реализация на Rust обеспечивает производительность, необходимую для торговли в реальном времени: матричные операции на Rust в сочетании с эффективным разложением Холецкого делают вывод GP достаточно быстрым для живых торговых систем.
-
Всегда сочетайте прогнозы GP с традиционным управлением рисками: GP — мощный инструмент, но должен быть частью более широкой торговой системы, включающей стоп-лоссы, диверсификацию и лимиты максимальной просадки.