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

Глава 219: DARTS для трейдинга — дифференцируемый поиск архитектуры для финансовых временных рядов

1. Введение

Дифференцируемый поиск архитектуры (Differentiable Architecture Search, DARTS) представляет собой смену парадигмы в проектировании нейронных архитектур. Вместо оценки тысяч дискретных архитектур с помощью обучения с подкреплением или эволюционных алгоритмов, DARTS ослабляет пространство поиска до непрерывного, что позволяет оптимизировать саму архитектуру на основе градиентов. В этой главе мы адаптируем DARTS специально для торговых временных рядов, где цель — автоматически обнаруживать оптимальные архитектуры нейронных сетей для таких задач, как прогнозирование цен, предсказание волатильности и определение рыночных режимов.

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

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

В этой главе мы разрабатываем полную реализацию DARTS на Rust, адаптированную для торговых приложений. Мы определяем пользовательское пространство операций, содержащее одномерные свёртки, расширенные свёртки, рекуррентные ячейки, слои внимания, фильтры скользящего среднего и пропускные соединения. Мы реализуем непрерывную релаксацию через взвешенные софтмаксом смеси, Gumbel-Softmax для дифференцируемого дискретного выбора и двухуровневую оптимизацию, чередующую обновления параметров архитектуры и весов сети. Наконец, мы интегрируем рыночные данные в реальном времени с биржи Bybit для демонстрации полного конвейера от получения данных через поиск архитектуры до оценки торговли.

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

2.1 Непрерывная релаксация пространства поиска

DARTS формулирует поиск архитектуры как задачу непрерывной оптимизации. Рассмотрим направленный ациклический граф (DAG), где каждое ребро $(i, j)$ представляет кандидатную операцию из набора $\mathcal{O} = {o_1, o_2, \ldots, o_K}$. В дискретном поиске каждое ребро выбирает ровно одну операцию. DARTS ослабляет это, вычисляя взвешенную смесь:

$$\bar{o}^{(i,j)}(x) = \sum_{k=1}^{K} \frac{\exp(\alpha_k^{(i,j)})}{\sum_{l=1}^{K} \exp(\alpha_l^{(i,j)})} \cdot o_k(x)$$

где $\alpha_k^{(i,j)}$ — непрерывные параметры архитектуры. Софтмакс обеспечивает, что веса формируют допустимое распределение вероятностей. По мере обучения эти веса концентрируются на наиболее эффективных операциях.

2.2 Двухуровневая оптимизация

DARTS формулирует поиск как двухуровневую оптимизацию:

$$\min_{\alpha} \quad \mathcal{L}{val}(w^(\alpha), \alpha)$$ $$\text{s.t.} \quad w^(\alpha) = \arg\min{w} \mathcal{L}_{train}(w, \alpha)$$

Внешняя цель минимизирует потери на валидации относительно параметров архитектуры $\alpha$, в то время как внутренняя цель обучает веса сети $w$ на обучающем наборе. На практике мы аппроксимируем $w^*(\alpha)$ одним шагом градиента:

$$w’ = w - \xi \nabla_w \mathcal{L}_{train}(w, \alpha)$$

Затем градиент архитектуры вычисляется через:

$$\nabla_\alpha \mathcal{L}_{val}(w’, \alpha)$$

Эта чередующаяся схема — один шаг по весам, один шаг по архитектуре — является приближением первого порядка DARTS. Приближение второго порядка учитывает, как изменения $\alpha$ влияют на оптимальные $w^*$, но версия первого порядка часто достаточна и вычислительно дешевле.

2.3 Gumbel-Softmax для дискретного выбора

Хотя непрерывная релаксация позволяет вести поиск на основе градиентов, для развёртывания нам в конечном счёте нужна дискретная архитектура. Приём Gumbel-Softmax обеспечивает дифференцируемое приближение к категориальной выборке:

$$y_k = \frac{\exp((\log \alpha_k + g_k) / \tau)}{\sum_{l=1}^{K} \exp((\log \alpha_l + g_l) / \tau)}$$

где $g_k \sim \text{Gumbel}(0,1)$ — независимые выборки шума Гумбеля, а $\tau > 0$ — параметр температуры. При $\tau \to 0$ распределение приближается к one-hot категориальному. Во время обучения мы отжигаем $\tau$ от высокого значения (например, 1.0) до малого (например, 0.1), постепенно заостряя архитектурные решения.

Шум Гумбеля выбирается как $g_k = -\log(-\log(u_k))$, где $u_k \sim \text{Uniform}(0,1)$.

2.4 Дискретизация архитектуры

После завершения фазы поиска мы дискретизируем архитектуру, выбирая операцию с наибольшим весом на каждом ребре:

$$o^{(i,j)} = o_{k^} \quad \text{где} \quad k^ = \arg\max_k \alpha_k^{(i,j)}$$

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

3. DARTS для временных рядов

3.1 Пользовательское пространство операций

Стандартный DARTS для классификации изображений использует 2D-свёртки, пулинг и расширенные свёртки. Для торговых временных рядов мы проектируем предметно-ориентированное пространство операций:

ОперацияОписаниеВременная характеристика
Conv1D-31D-свёртка, размер ядра 3Локальные паттерны (2-3 бара)
Conv1D-51D-свёртка, размер ядра 5Краткосрочные паттерны (4-5 баров)
DilConv-3-2Расширенная свёртка, ядро 3, расширение 2Среднесрочные (5-6 баров эффективно)
DilConv-3-4Расширенная свёртка, ядро 3, расширение 4Более дальние (9-10 баров эффективно)
MovingAvg-5Скользящее среднее, окно 5Сглаживание тренда
MovingAvg-10Скользящее среднее, окно 10Более длительный тренд
RecurrentCellРекуррентная ячейка типа GRUПоследовательные зависимости
AttentionСамовнимание по последовательностиГлобальные зависимости
SkipТождественное соединениеОстаточный путь
ZeroНет соединенияОбрезка

3.2 Структура ячейки

Ячейка DARTS — это DAG с $N$ промежуточными узлами. Каждый узел $j$ получает входы от всех предыдущих узлов ${0, 1, \ldots, j-1}$ через смешанные операции. Ячейка имеет два входных узла (выходы двух предыдущих ячеек) и один выходной узел (конкатенация всех промежуточных узлов). Для временных рядов мы используем $N=4$ промежуточных узла, что даёт богатое пространство поиска, оставаясь при этом вычислимым.

Ячейка реплицируется $L$ раз в стеке, при этом каждая ячейка работает с выходом предыдущей. Для торговых приложений обычно достаточно от $L=4$ до $L=8$ ячеек.

3.3 Предобработка временных рядов

Финансовые временные ряды требуют тщательной предобработки перед подачей в DARTS. Мы вычисляем:

  • Логарифмические доходности: $r_t = \log(p_t / p_{t-1})$
  • Скользящая волатильность: $\sigma_t = \text{std}(r_{t-W+1:t})$
  • Нормализованный объём: $v_t / \text{MA}(v, W)$
  • Ценовой импульс: $(p_t - p_{t-k}) / p_{t-k}$ для различных горизонтов $k$

Все признаки стандартизируются с помощью скользящих z-оценок для поддержания стационарности и предотвращения заглядывания в будущее.

4. Торговые приложения

4.1 Прогнозирование направления цены

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

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

4.2 Прогнозирование волатильности

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

4.3 Адаптивная к режиму архитектура

Уникальное применение — периодический запуск DARTS на недавних данных для адаптации архитектуры к текущему рыночному режиму. На трендовых рынках поиск может отдавать предпочтение операциям, захватывающим импульс (более длинные свёртки, рекуррентные ячейки). На рынках возврата к среднему могут доминировать более короткие свёртки и механизмы внимания. Повторяя поиск архитектуры ежемесячно или ежеквартально, торговая система адаптирует свою структуру, а не только параметры, к изменяющимся рыночным условиям.

4.4 Перенос архитектуры между активами

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

5. Практические проблемы

5.1 Коллапс производительности

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

Стратегии смягчения:

  • Ранняя остановка поиска архитектуры: Мониторинг энтропии весов архитектуры. Если энтропия падает слишком быстро — остановить поиск до наступления коллапса.
  • Регуляризация операций: Добавление штрафа L2 на веса архитектуры безпараметрических операций (skip, zero, скользящее среднее) для предотвращения их доминирования.
  • Прогрессивное сжатие: Начать с большего набора операций и постепенно обрезать наиболее слабые, вместо принятия одного дискретного решения в конце.

5.2 Нестабильность поиска

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

Стратегии смягчения:

  • Ограничение весов архитектуры: Ограничение параметров архитектуры допустимым диапазоном.
  • Более низкая скорость обучения архитектуры: Использование скорости обучения для $\alpha$ в 5-10 раз меньше, чем для $w$.
  • Более длительный прогрев: Обучение весов несколько эпох перед началом обновлений архитектуры, чтобы операции имели разумные параметры перед сравнением.

5.3 Переобучение на валидационном наборе

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

Стратегии смягчения:

  • Скользящая валидация: Использование скользящего окна для валидационного набора, обновляя его по мере продвижения поиска.
  • Ансамбль архитектур: Запуск поиска несколько раз с различными случайными сидами и разделениями данных, затем использование наиболее частых архитектурных решений.
  • Вневыборочная оценка: После дискретизации архитектуры переобучить с нуля и оценить на отложенном тестовом наборе, который никогда не использовался при поиске.

5.4 Вычислительные затраты

Хотя DARTS значительно дешевле NAS на основе RL (часы вместо дней), вычисление смешанных операций всё же затратно, поскольку все операции выполняются параллельно во время поиска. Для $K$ операций на ребро и $E$ рёбер каждый прямой проход вычисляет $K \times E$ выходов операций.

Стратегии смягчения:

  • Частичные канальные соединения: Направлять только часть каналов через каждую операцию.
  • Прогрессивный поиск: Начать с меньшей ячейки и расширять её во время поиска.
  • Прокси-задачи: Поиск на упрощённой версии задачи (меньше признаков, более короткие последовательности) и перенос архитектуры.

6. Пошаговое руководство по реализации

Наша реализация на Rust организована в следующие компоненты:

6.1 Модуль операций

Каждая операция реализует общий трейт, определяющий прямой проход на тензоре временного ряда. Операции включают:

  • Conv1D: Стандартная 1D-свёртка с настраиваемым размером ядра и паддингом. Захватывает локальные временные паттерны.
  • DilatedConv1D: Расширенная свёртка, расширяющая рецептивное поле без увеличения параметров. Необходима для захвата многомасштабных временных зависимостей.
  • MovingAverage: Безпараметрическая операция сглаживания. Действует как фильтр низких частот на временном ряде.
  • SkipConnection: Тождественное отображение, обеспечивающее остаточное обучение.
  • ZeroOp: Выводит нули, эффективно обрезая ребро.

6.2 Ячейка DARTS

Ячейка хранит параметры архитектуры $\alpha$ для каждой комбинации (пара узлов, операция). При прямом проходе вычисляется взвешенная софтмаксом смесь всех операций на каждом ребре, затем входы в каждый промежуточный узел агрегируются суммированием. Выход — конкатенация (или среднее) выходов всех промежуточных узлов.

6.3 Цикл поиска

Поиск чередует:

  1. Шаг по весам: Прямой проход на обучающем батче, вычисление потерь, обратное распространение для обновления весов операций $w$.
  2. Шаг по архитектуре: Прямой проход на валидационном батче, вычисление потерь, обратное распространение для обновления параметров архитектуры $\alpha$.

Оба шага используют отдельные оптимизаторы (SGD для весов, Adam для параметров архитектуры). После завершения поиска архитектура дискретизируется.

6.4 Реализация Gumbel-Softmax

Функция Gumbel-Softmax генерирует шум Гумбеля, добавляет его к лог-весам архитектуры, делит на температуру и применяет софтмакс. Мы отжигаем температуру линейно от 1.0 до 0.1 в ходе поиска.

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

Мы получаем данные OHLCV (Open, High, Low, Close, Volume) с публичного REST API Bybit:

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

Ответ предоставляет данные свечей, которые мы парсим в матрицу признаков. Мы вычисляем:

  1. Логарифмические доходности по ценам закрытия
  2. Диапазон High-Low как прокси волатильности
  3. Коэффициенты объёма
  4. Множественные признаки импульса

Данные разделяются на обучающий/валидационный/тестовый наборы хронологически (60%/20%/20%) для предотвращения заглядывания в будущее. Валидационный набор используется для обновлений параметров архитектуры, обучающий — для обновлений весов, а тестовый — только для финальной оценки.

Примечания по интеграции

  • Публичные рыночные данные Bybit API не требуют аутентификации
  • Лимиты запросов для данных свечей щедрые (10 запросов/секунду)
  • Мы получаем 1000 часовых свечей, что составляет примерно 42 дня данных
  • Для продакшн-использования исторические данные должны накапливаться за месяцы

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

  1. DARTS обеспечивает автоматическое обнаружение архитектуры для трейдинга. Вместо ручного выбора между LSTM, CNN и трансформерами, DARTS ищет по комбинаторному пространству операций и находит гибридные архитектуры, определяемые данными.

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

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

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

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

  6. Gumbel-Softmax соединяет непрерывный поиск и дискретное развёртывание. Отжиг температуры постепенно заостряет мягкие решения до жёстких архитектурных выборов, обеспечивая плавный переход от поиска к развёртыванию.

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

  8. Rust обеспечивает производительность, необходимую для практического NAS. Поиск архитектуры включает массивный параллелизм по операциям. Абстракции без накладных расходов и безопасность памяти Rust делают его хорошо подходящим для реализации вычислительно интенсивных внутренних циклов DARTS.

  9. Вневыборочная валидация обязательна. Обнаруженная архитектура должна быть переобучена с нуля и оценена на отложенных данных, чтобы подтвердить, что поиск не переобучился на валидационном наборе.

  10. Трансферное обучение усиливает ценность DARTS. Архитектура, обнаруженная на одном активе, может быть дообучена на многих активах, амортизируя затраты на поиск и обеспечивая лучшие модели для инструментов с ограниченными данными.