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

Глава 213: Оптимизация гиперпараметров для торговых моделей

1. Введение

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

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

В этой главе рассматриваются основные алгоритмы HPO — перебор по сетке, случайный поиск, байесовская оптимизация, TPE (древовидные оценщики Парцена), Hyperband и BOHB — с особым акцентом на их применение в количественной торговле. Мы предоставляем полную реализацию на Rust с интеграцией данных биржи Bybit, демонстрируя настройку гиперпараметров торговой модели с защитой от переобучения.

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

2.1 Постановка задачи

Пусть $\lambda \in \Lambda$ обозначает конфигурацию гиперпараметров из пространства поиска $\Lambda$. Пусть $f(\lambda)$ — целевая функция, измеряющая производительность модели (например, коэффициент Шарпа на валидационном наборе). Цель HPO:

$$\lambda^* = \arg\max_{\lambda \in \Lambda} f(\lambda)$$

Поскольку $f$ обычно является функцией чёрного ящика без аналитического выражения и дорогой в вычислении, нам нужны эффективные стратегии поиска.

Перебор по сетке — простейший подход. Для каждого гиперпараметра определяется конечное множество значений-кандидатов. Алгоритм оценивает каждую точку декартова произведения этих множеств.

При $k$ гиперпараметрах с $n_1, n_2, \ldots, n_k$ значениями-кандидатами перебор по сетке оценивает $\prod_{i=1}^{k} n_i$ конфигураций. Это растет экспоненциально с числом гиперпараметров, что делает перебор непрактичным для высокоразмерных пространств. Однако он исчерпывающий в пределах своей сетки и легко параллелизуется.

Сложность: $O(\prod_{i=1}^{k} n_i)$ вычислений.

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

Для бюджета в $T$ испытаний случайный поиск выбирает $\lambda_1, \lambda_2, \ldots, \lambda_T \sim \text{Uniform}(\Lambda)$ и возвращает $\lambda^* = \arg\max_t f(\lambda_t)$.

Теоретическая гарантия: Если верхняя доля $\alpha$ пространства поиска дает хорошие результаты, то при $T = \lceil \log(1 - p) / \log(1 - \alpha) \rceil$ испытаниях случайный поиск находит конфигурацию в этой верхней доле с вероятностью не менее $p$. Для $\alpha = 5%$ и $p = 95%$ достаточно всего $T = 59$ испытаний.

2.4 Байесовская оптимизация

Байесовская оптимизация — это последовательный подход на основе моделей, который строит вероятностную суррогатную модель целевой функции и использует её для принятия решения о следующей точке оценки. Два ключевых компонента:

  1. Суррогатная модель: Вероятностная модель $\hat{f}(\lambda)$, аппроксимирующая $f(\lambda)$ и предоставляющая оценки неопределенности.
  2. Функция приобретения: Функция $\alpha(\lambda)$, использующая предсказания суррогата для баланса между исследованием (проба неопределенных регионов) и эксплуатацией (уточнение вблизи известных хороших конфигураций).

Суррогат на основе гауссовского процесса

Гауссовский процесс (GP) определяет распределение над функциями. По наблюдаемым данным $D = {(\lambda_i, y_i)}_{i=1}^{n}$ апостериорное распределение GP в новой точке $\lambda$:

$$\mu(\lambda) = k(\lambda, X) [K(X, X) + \sigma_n^2 I]^{-1} y$$

$$\sigma^2(\lambda) = k(\lambda, \lambda) - k(\lambda, X) [K(X, X) + \sigma_n^2 I]^{-1} k(X, \lambda)$$

где $k(\cdot, \cdot)$ — ядерная функция. Мы используем ядро радиальной базисной функции (RBF):

$$k(\lambda_i, \lambda_j) = \sigma_f^2 \exp\left(-\frac{|\lambda_i - \lambda_j|^2}{2 \ell^2}\right)$$

где $\ell$ — масштаб длины, а $\sigma_f^2$ — дисперсия сигнала.

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

Ожидаемое улучшение (EI): Измеряет ожидаемое улучшение над текущим лучшим значением $f^* = \max_i y_i$:

$$\text{EI}(\lambda) = \mathbb{E}[\max(0, f(\lambda) - f^)] = (\mu - f^)\Phi(Z) + \sigma \phi(Z)$$

где $Z = (\mu - f^*) / \sigma$, а $\Phi$, $\phi$ — функция распределения и плотность стандартного нормального распределения.

Верхняя граница доверия (UCB): Балансирует среднее и неопределенность с параметром $\kappa$:

$$\text{UCB}(\lambda) = \mu(\lambda) + \kappa \cdot \sigma(\lambda)$$

Большее $\kappa$ поощряет больше исследования. Типичный выбор — $\kappa = 2.0$.

Вероятность улучшения (PI): Вероятность того, что новая точка превысит текущее лучшее значение:

$$\text{PI}(\lambda) = \Phi\left(\frac{\mu(\lambda) - f^*}{\sigma(\lambda)}\right)$$

EI — наиболее часто используемая функция приобретения, поскольку она естественным образом балансирует исследование и эксплуатацию без необходимости настраиваемого параметра компромисса.

2.5 Древовидные оценщики Парцена (TPE)

TPE, предложенный Бергстрой и др. (2011), использует иной подход, чем байесовская оптимизация на основе GP. Вместо моделирования $p(y | \lambda)$, TPE моделирует:

$$p(\lambda | y) = \begin{cases} \ell(\lambda) & \text{если } y < y^* \ g(\lambda) & \text{если } y \geq y^* \end{cases}$$

где $y^*$ — квантильный порог (обычно верхние 15% наблюдений). Отношение $\ell(\lambda) / g(\lambda)$ пропорционально ожидаемому улучшению, поэтому TPE выбирает конфигурации, которые более вероятны при $\ell$ (“хорошее” распределение), чем при $g$ (“плохое” распределение).

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

2.6 Hyperband

Hyperband, предложенный Ли и др. (2018), — это подход на основе ранней остановки, формулирующий HPO как задачу распределения ресурсов. Основная идея — метод последовательного деления (Successive Halving, SHA):

  1. Начать с $n$ случайных конфигураций, каждой выделен малый бюджет $b$.
  2. Оценить все конфигурации с бюджетом $b$.
  3. Оставить верхнюю долю $1/\eta$ (обычно $\eta = 3$).
  4. Увеличить бюджет в $\eta$ раз и повторить.

Hyperband запускает SHA с различными начальными значениями $n$ и $b$ для баланса между большим количеством конфигураций с малыми бюджетами и меньшим количеством с большими бюджетами.

2.7 BOHB (байесовская оптимизация и Hyperband)

BOHB объединяет байесовскую оптимизацию с Hyperband. Вместо равномерной случайной выборки конфигураций, как в Hyperband, BOHB использует модель TPE для выборки перспективных конфигураций. Это сочетает эффективность выборки байесовской оптимизации с эффективностью ранней остановки Hyperband, делая его одним из наиболее эффективных универсальных алгоритмов HPO.

3. Пространства поиска

Правильное определение пространства поиска критически важно для эффективности HPO. Гиперпараметры бывают нескольких типов:

3.1 Непрерывные гиперпараметры

Принимают вещественные значения в диапазоне. Примеры: скорость обучения ($[10^{-5}, 10^{-1}]$, обычно на логарифмической шкале), коэффициент dropout ($[0.0, 0.5]$), вес L2-регуляризации ($[10^{-6}, 10^{-2}]$).

Логарифмически-равномерная выборка необходима для параметров, охватывающих несколько порядков величины.

3.2 Дискретные гиперпараметры

Целочисленные параметры: количество скрытых нейронов (${32, 64, 128, 256, 512}$), размер батча (${16, 32, 64, 128}$), окно ретроспективного анализа (${5, 10, 20, 50, 100}$ дней).

3.3 Категориальные гиперпараметры

Неупорядоченные варианты: функция активации (${\text{ReLU}, \text{GELU}, \text{Tanh}}$), тип оптимизатора (${\text{Adam}, \text{SGD}, \text{AdamW}}$), набор признаков (${\text{OHLCV}, \text{OHLCV+индикаторы}, \text{стакан}}$).

3.4 Условные гиперпараметры

Некоторые гиперпараметры имеют значение только при определенном значении другого. Например, импульс (momentum) актуален только для SGD, а количество голов внимания — только для архитектуры Transformer. Правильное кодирование этих условных зависимостей предотвращает трату вычислений на нерелевантные конфигурации.

4. Специфика HPO для торговли

4.1 Скользящая валидация как целевая функция

В торговле стандартная k-fold кросс-валидация нарушает временной порядок и вызывает утечку данных. Вместо этого используется скользящая (walk-forward) валидация, соблюдающая структуру временных рядов:

  1. Обучение на $[t_0, t_1)$, валидация на $[t_1, t_2)$.
  2. Обучение на $[t_0, t_2)$, валидация на $[t_2, t_3)$.
  3. Продолжение скольжения вперед.

Целевая функция HPO — средняя производительность по всем окнам прямой валидации. Это дает более реалистичную оценку вневыборочной производительности, чем одно разбиение.

4.2 Предотвращение переобучения на бэктесте

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

  • Ограничение числа испытаний: Используйте эффективные методы (байесовская оптимизация, Hyperband) для нахождения хороших конфигураций за меньшее число оценок.
  • Множественные временные периоды: Валидируйте лучшую конфигурацию на полностью отложенном периоде, не использовавшемся при HPO.
  • Регуляризация пространства поиска: Ограничьте пространство разумными диапазонами на основе доменных знаний.
  • Дефляция коэффициента Шарпа: Применяйте формулу дефляции Бейли-Лопеса де Прадо для учета множественного тестирования.
  • Комбинаторная очищенная кросс-валидация: Используйте CPCV для более робастных вневыборочных оценок.

4.3 Многоцелевая оптимизация

Торговые цели по своей природе многомерны. Стратегия с коэффициентом Шарпа 2.0, но максимальной просадкой 40% может быть менее желательной, чем стратегия с Шарпом 1.5 и просадкой 15%. Многоцелевая HPO ищет Парето-фронт недоминируемых конфигураций.

Распространенный подход — определение скаляризованной целевой функции:

$$f(\lambda) = w_1 \cdot \text{Sharpe}(\lambda) - w_2 \cdot \text{MaxDrawdown}(\lambda) + w_3 \cdot \text{ProfitFactor}(\lambda)$$

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

5. Ранняя остановка и эффективное распределение ресурсов

5.1 Метод последовательного деления (Successive Halving)

Successive Halving — основа эффективного HPO. Алгоритм работает следующим образом:

Вход: n конфигураций, максимальный бюджет R, коэффициент деления eta
s_max = floor(log_eta(n))
Для каждого раунда i = 0, 1, ..., s_max:
n_i = floor(n / eta^i) # количество выживших конфигураций
r_i = R * eta^(i - s_max) # бюджет на конфигурацию
Оценить все n_i конфигурации с бюджетом r_i
Оставить верхнюю долю 1/eta
Вернуть лучшую конфигурацию

В контексте торговли “бюджет” может быть числом эпох обучения, длиной периода бэктеста или количеством фолдов walk-forward валидации.

5.2 Скобки Hyperband

Hyperband хеджирует неопределенность в соотношении бюджет-производительность, запуская несколько скобок SHA:

  • Скобка $s = s_{\max}$: Много конфигураций, каждая с минимальным начальным бюджетом.
  • Скобка $s = 0$: Мало конфигураций, каждая с полным бюджетом с самого начала.

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

6. Описание реализации (Rust)

Наша реализация на Rust предоставляет полный фреймворк HPO в rust/src/lib.rs:

Определение пространства гиперпараметров: Структура SearchSpace содержит коллекцию записей HyperparameterDef, каждая из которых задает имя, тип (непрерывный, дискретный или категориальный) и допустимый диапазон. Непрерывные параметры поддерживают логарифмическую шкалу.

Перебор по сетке: Генерирует полное декартово произведение дискретизированных значений параметров и оценивает каждое.

Случайный поиск: Выбирает конфигурации равномерно из пространства поиска. Непрерывные параметры — равномерно (или лог-равномерно); дискретные — равномерно из множества; категориальные — с равной вероятностью.

Байесовская оптимизация: Поддерживает суррогат GP с ядром RBF. После начального набора случайных оценок (обычно 5-10) подгоняет GP к наблюдаемым данным и максимизирует функцию Expected Improvement для выбора следующей конфигурации.

Successive Halving / Hyperband: Реализует схему распределения ресурсов с ранней остановкой.

История испытаний: Все оценённые конфигурации и их оценки хранятся в структуре TrialHistory.

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

Реализация включает клиент API Bybit для получения исторических данных OHLCV (Open, High, Low, Close, Volume) для любой торговой пары. Структура BybitClient предоставляет:

  • fetch_klines(symbol, interval, limit): Получает данные свечей из API Bybit v5.
  • Автоматический разбор JSON-ответа в типизированные структуры Candle.
  • Поддержка множества таймфреймов (1m, 5m, 15m, 1h, 4h, 1d).

Данные поступают в целевую функцию walk-forward валидации. Для каждой конфигурации гиперпараметров система:

  1. Разбивает исторические свечи на фолды walk-forward.
  2. Вычисляет признаки (доходности, скользящие средние, волатильность) для каждого фолда.
  3. Симулирует простую стратегию импульса/возврата к среднему, параметризованную гиперпараметрами.
  4. Вычисляет коэффициент Шарпа и максимальную просадку на валидационной части.
  5. Возвращает скаляризованную многоцелевую оценку.

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

  1. Перебор по сетке прост, но масштабируется экспоненциально. Используйте его только для малоразмерных пространств (2-3 гиперпараметра) или как финальное уточнение вблизи известной хорошей области.

  2. Случайный поиск удивительно эффективен. Для большинства задач случайный поиск с 50-100 испытаниями превосходит перебор по сетке с тем же бюджетом.

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

  4. Hyperband и BOHB предлагают лучшее из обоих миров. Ранняя остановка быстро устраняет плохие конфигурации, а байесовская выборка фокусируется на перспективных областях.

  5. Walk-forward валидация обязательна в торговле. Стандартная кросс-валидация вызывает временную утечку данных.

  6. Защищайтесь от мета-переобучения. Чем больше конфигураций вы пробуете, тем выше вероятность найти случайно хорошую. Всегда валидируйте на действительно отложенном периоде.

  7. Многоцелевая HPO отражает реальные торговые требования. Оптимизация только коэффициента Шарпа игнорирует риск просадки и другие практически важные характеристики.

  8. Тщательно определяйте пространство поиска. Используйте логарифмическую шкалу для параметров, охватывающих порядки величины, и ограничивайте диапазоны на основе доменных знаний.

  9. Начинайте просто, затем масштабируйте. Начните со случайного поиска для понимания ландшафта, затем примените байесовскую оптимизацию или BOHB для уточнения.

  10. Rust обеспечивает производительность, необходимую для масштабного HPO. Комбинация низкоуровневого контроля, абстракций с нулевой стоимостью и безопасности памяти делает Rust отличным выбором для реализации циклов HPO.