Глава 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$ обычно является функцией чёрного ящика без аналитического выражения и дорогой в вычислении, нам нужны эффективные стратегии поиска.
2.2 Перебор по сетке (Grid Search)
Перебор по сетке — простейший подход. Для каждого гиперпараметра определяется конечное множество значений-кандидатов. Алгоритм оценивает каждую точку декартова произведения этих множеств.
При $k$ гиперпараметрах с $n_1, n_2, \ldots, n_k$ значениями-кандидатами перебор по сетке оценивает $\prod_{i=1}^{k} n_i$ конфигураций. Это растет экспоненциально с числом гиперпараметров, что делает перебор непрактичным для высокоразмерных пространств. Однако он исчерпывающий в пределах своей сетки и легко параллелизуется.
Сложность: $O(\prod_{i=1}^{k} n_i)$ вычислений.
2.3 Случайный поиск (Random Search)
Случайный поиск выбирает конфигурации равномерно случайным образом из пространства поиска. Бергстра и Бенжио (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 Байесовская оптимизация
Байесовская оптимизация — это последовательный подход на основе моделей, который строит вероятностную суррогатную модель целевой функции и использует её для принятия решения о следующей точке оценки. Два ключевых компонента:
- Суррогатная модель: Вероятностная модель $\hat{f}(\lambda)$, аппроксимирующая $f(\lambda)$ и предоставляющая оценки неопределенности.
- Функция приобретения: Функция $\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):
- Начать с $n$ случайных конфигураций, каждой выделен малый бюджет $b$.
- Оценить все конфигурации с бюджетом $b$.
- Оставить верхнюю долю $1/\eta$ (обычно $\eta = 3$).
- Увеличить бюджет в $\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) валидация, соблюдающая структуру временных рядов:
- Обучение на $[t_0, t_1)$, валидация на $[t_1, t_2)$.
- Обучение на $[t_0, t_2)$, валидация на $[t_2, t_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, коэффициент деления etas_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 валидации. Для каждой конфигурации гиперпараметров система:
- Разбивает исторические свечи на фолды walk-forward.
- Вычисляет признаки (доходности, скользящие средние, волатильность) для каждого фолда.
- Симулирует простую стратегию импульса/возврата к среднему, параметризованную гиперпараметрами.
- Вычисляет коэффициент Шарпа и максимальную просадку на валидационной части.
- Возвращает скаляризованную многоцелевую оценку.
8. Ключевые выводы
-
Перебор по сетке прост, но масштабируется экспоненциально. Используйте его только для малоразмерных пространств (2-3 гиперпараметра) или как финальное уточнение вблизи известной хорошей области.
-
Случайный поиск удивительно эффективен. Для большинства задач случайный поиск с 50-100 испытаниями превосходит перебор по сетке с тем же бюджетом.
-
Байесовская оптимизация — золотой стандарт для дорогих целевых функций. Когда каждая оценка (бэктест) занимает минуты или часы, накладные расходы на подгонку суррогата GP пренебрежимо малы.
-
Hyperband и BOHB предлагают лучшее из обоих миров. Ранняя остановка быстро устраняет плохие конфигурации, а байесовская выборка фокусируется на перспективных областях.
-
Walk-forward валидация обязательна в торговле. Стандартная кросс-валидация вызывает временную утечку данных.
-
Защищайтесь от мета-переобучения. Чем больше конфигураций вы пробуете, тем выше вероятность найти случайно хорошую. Всегда валидируйте на действительно отложенном периоде.
-
Многоцелевая HPO отражает реальные торговые требования. Оптимизация только коэффициента Шарпа игнорирует риск просадки и другие практически важные характеристики.
-
Тщательно определяйте пространство поиска. Используйте логарифмическую шкалу для параметров, охватывающих порядки величины, и ограничивайте диапазоны на основе доменных знаний.
-
Начинайте просто, затем масштабируйте. Начните со случайного поиска для понимания ландшафта, затем примените байесовскую оптимизацию или BOHB для уточнения.
-
Rust обеспечивает производительность, необходимую для масштабного HPO. Комбинация низкоуровневого контроля, абстракций с нулевой стоимостью и безопасности памяти делает Rust отличным выбором для реализации циклов HPO.