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

Глава 321: Байесовская оптимизация для гиперпараметров торговых стратегий

1. Введение

Каждая торговая стратегия содержит гиперпараметры: окно ретроспективного анализа для скользящей средней, порог для сигнала возврата к среднему, бюджет риска в оптимизаторе портфеля, параметр агрессивности алгоритма исполнения. Правильный выбор этих параметров — это разница между прибыльной стратегией и той, которая теряет деньги на транзакционных издержках и несвоевременных входах.

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

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

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

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

2.1 Задача оптимизации

Мы стремимся максимизировать дорогостоящую функцию чёрного ящика:

x* = argmax f(x), x ∈ X ⊂ R^d

где f — метрика производительности стратегии (коэффициент Шарпа, общая доходность и т.д.), x — вектор гиперпараметров, а X — ограниченное пространство поиска. Мы предполагаем, что f не имеет известного аналитического выражения, и каждая оценка требует полного бэктеста.

2.2 Суррогатная модель на основе гауссовского процесса

Гауссовский процесс (ГП) определяет распределение над функциями. Для наблюдений D = {(x_1, y_1), ..., (x_n, y_n)} апостериорное распределение ГП в новой точке x* имеет вид:

μ(x*) = k(x*, X) [K + σ²I]⁻¹ y
σ²(x*) = k(x*, x*) - k(x*, X) [K + σ²I]⁻¹ k(X, x*)

где:

  • K — матрица ядра (ковариационная) с K_ij = k(x_i, x_j)
  • k — функция ядра (мы используем ядро RBF / квадратичную экспоненту)
  • σ² — дисперсия шума наблюдений
  • y — вектор наблюдённых значений

Ядро RBF определяется как:

k(x, x') = σ_f² exp(-||x - x'||² / (2 l²))

где σ_f² — дисперсия сигнала, а l — масштаб длины. Масштаб длины контролирует, как быстро изменяется функция: малое l означает быстрые изменения, а большое l подразумевает плавные вариации.

2.3 Функции приобретения

Функция приобретения α(x) определяет, какую точку оценивать следующей, балансируя исследование и эксплуатацию.

Ожидаемое улучшение (EI)

EI измеряет ожидаемую величину, на которую новая точка улучшит текущее лучшее наблюдение f_best:

EI(x) = E[max(f(x) - f_best, 0)]
= (μ(x) - f_best) Φ(Z) + σ(x) φ(Z)

где:

Z = (μ(x) - f_best) / σ(x)

Φ — функция стандартного нормального распределения (CDF), а φ — плотность стандартного нормального распределения (PDF). Когда σ(x) = 0, EI(x) = 0.

EI естественно балансирует исследование (высокое σ(x)) и эксплуатацию (высокое μ(x)). Она равна нулю в уже наблюдённых точках и положительна везде в другом месте.

Верхняя граница доверия (UCB)

UCB строит оптимистичную оценку значения функции:

UCB(x) = μ(x) + κ σ(x)

где κ > 0 — параметр баланса исследования и эксплуатации. Более высокое κ поощряет большее исследование. Типичный выбор — κ = 2.0. Теоретическая гарантия для GP-UCB устанавливает κ_t = √(2 log(t² d π² / 6δ)), где t — итерация, d — размерность, а δ — вероятность ошибки.

Вероятность улучшения (PI)

PI измеряет вероятность того, что новая точка улучшит текущий лучший результат:

PI(x) = P(f(x) > f_best) = Φ(Z)

PI проще, чем EI, но склонна к чрезмерной жадности (эксплуатации), часто застревая в локальных оптимумах. Иногда полезна как вторичный критерий.

2.4 Цикл байесовской оптимизации

1. Инициализация: Оценить f в n_init случайных точках
2. Повторять для t = 1, 2, ..., T:
a. Обучить ГП на всех наблюдениях D_t
b. Найти x_{t+1} = argmax α(x) по X
c. Оценить y_{t+1} = f(x_{t+1}) + ε
d. Обновить D_{t+1} = D_t ∪ {(x_{t+1}, y_{t+1})}
3. Вернуть x с наибольшим наблюдённым f(x)

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

3. Применения в трейдинге

3.1 Настройка параметров стратегии

Наиболее прямое применение — настройка гиперпараметров торговой стратегии. Рассмотрим простую стратегию пересечения скользящих средних (MA) с параметрами:

  • Окно быстрой MA (w_fast): от 5 до 50 периодов
  • Окно медленной MA (w_slow): от 20 до 200 периодов
  • Процент стоп-лосса (sl): от 0.5% до 5%

Цель — максимизировать коэффициент Шарпа на историческом бэктесте. БО может найти почти оптимальные параметры за 20-30 оценок, по сравнению с сотнями для перебора по сетке.

Более сложные стратегии могут иметь 10-20 параметров (пороги входа, пороги выхода, правила размера позиции, фильтры режима). БО эффективно обрабатывает эти пространства большей размерности, поскольку ГП может моделировать корреляции между параметрами и сосредотачиваться на перспективных областях.

3.2 Оптимизация портфеля

БО может оптимизировать параметры построения портфеля:

  • Коэффициент неприятия риска в оптимизации средне-дисперсионной модели
  • Частота ребалансировки и ограничения оборота
  • Лимиты факторной экспозиции в ограниченной оптимизации
  • Интенсивность сжатия для оценки ковариационной матрицы

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

3.3 Оптимизация исполнения

Алгоритмы исполнения (TWAP, VWAP, Implementation Shortfall) имеют параметры, влияющие на качество исполнения:

  • Коэффициент участия и срочность
  • Размер среза и тайминг
  • Соотношение пассивного/агрессивного исполнения

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

3.4 Предотвращение переобучения

Критическая проблема при оптимизации параметров стратегии — переобучение к бэктесту. Байесовская оптимизация помогает несколькими способами:

  1. Меньше оценок означает меньше возможностей для оптимизатора найти ложные закономерности
  2. Априорное распределение ГП действует как регуляризатор, предполагая гладкость целевой функции
  3. Кросс-валидация может быть включена: используйте walk-forward валидацию как целевую функцию
  4. Моделирование шума в ГП явно учитывает стохастическую природу доходностей

Лучшая практика — оптимизировать на обучающем наборе, валидировать на отложенном периоде и принимать только параметры, которые хорошо работают на обоих.

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

Наша реализация предоставляет:

  • GaussianProcess: ГП с ядром RBF, поддерживающий операции обучения и предсказания. Матрица ядра инвертируется с помощью разложения Холецкого для числовой устойчивости.
  • BayesianOptimizer: Основной цикл оптимизации с настраиваемой функцией приобретения (EI, UCB или PI), границами пространства поиска и бюджетом итераций.
  • TradingBacktester: Простой бэктестер пересечения скользящих средних, вычисляющий коэффициент Шарпа, общую доходность и максимальную просадку.
  • BybitClient: Получает исторические OHLCV данные из публичного API Bybit.

Ключевые проектные решения:

  • Мы используем ndarray для операций линейной алгебры
  • ГП использует шумовой член σ² = 1e-6 для числовой устойчивости
  • Оптимизация функции приобретения использует случайную выборку (1000 кандидатов за итерацию) для простоты и надёжности
  • Бэктестер обрабатывает ограничение w_fast < w_slow, возвращая штрафное значение

Пример использования:

use bayesian_optimization_trading::*;
// Определение пространства поиска: [быстрое_окно, медленное_окно]
let bounds = vec![(5.0, 50.0), (20.0, 200.0)];
let mut optimizer = BayesianOptimizer::new(bounds, AcquisitionFunction::ExpectedImprovement);
// Запуск оптимизации
let result = optimizer.optimize(|params| {
let fast = params[0] as usize;
let slow = params[1] as usize;
backtester.run(fast, slow, &prices)
}, 30); // 30 итераций
println!("Лучшие параметры: {:?}, Шарп: {:.4}", result.best_params, result.best_value);

5. Интеграция с Bybit

Реализация получает исторические данные свечей (kline) из публичного REST API Bybit:

GET https://api.bybit.com/v5/market/kline
?category=linear
&symbol=BTCUSDT
&interval=60
&limit=1000

Данные разбираются в свечи OHLCV, и цены закрытия извлекаются для бэктестинга. API не требует аутентификации для публичных рыночных данных, что упрощает интеграцию.

Мы используем reqwest в блокирующем режиме для простоты примера и serde для десериализации JSON. API Bybit возвращает данные в обратном хронологическом порядке, поэтому мы разворачиваем их перед использованием.

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

  1. Байесовская оптимизация эффективна по числу выборок: Она обычно находит почти оптимальные параметры за 10-50 оценок, по сравнению с сотнями или тысячами для перебора по сетке/случайного поиска.

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

  3. Функции приобретения формализуют баланс исследования и эксплуатации: EI — наиболее популярный выбор за его баланс и аналитическую трактуемость. UCB предлагает настраиваемый параметр исследования. PI проще, но жаднее.

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

  5. БО дополняет другие методы оптимизации: Для задач малой размерности (< 20 параметров) БО превосходит. Для больших размерностей рассмотрите комбинирование БО со случайными вложениями (REMBO) или использование методов на основе деревьев (TPE).

  6. Сама суррогатная модель информативна: Обученный ГП показывает, какие параметры наиболее важны (через масштабы длины) и как они взаимодействуют, обеспечивая интерпретируемость помимо просто оптимальной точки.

  7. Rust обеспечивает производительность, необходимую для использования в реальном времени: Комбинация быстрого бэктестинга и эффективного вывода ГП делает возможным запуск БО в производственных конвейерах, где важна задержка.

Ссылки

  • Snoek, J., Larochelle, H., & Adams, R. P. (2012). “Practical Bayesian Optimization of Machine Learning Algorithms.” NeurIPS.
  • Shahriari, B., et al. (2016). “Taking the Human Out of the Loop: A Review of Bayesian Optimization.” Proceedings of the IEEE.
  • Brochu, E., Cora, V. M., & de Freitas, N. (2010). “A Tutorial on Bayesian Optimization.” arXiv:1012.2599.
  • Rasmussen, C. E., & Williams, C. K. I. (2006). “Gaussian Processes for Machine Learning.” MIT Press.
  • Frazier, P. I. (2018). “A Tutorial on Bayesian Optimization.” arXiv:1807.02811.