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

Глава 237: Иерархический VAE для трейдинга

1. Введение — Многомасштабные латентные представления для финансовых рынков

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

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

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

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

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

Иерархическая генеративная модель

Стандартный VAE определяет одноуровневую генеративную модель:

p(x) = integral p(x|z) p(z) dz

Иерархический VAE с L уровнями определяет цепочку латентных переменных z_1, z_2, …, z_L, где z_L — верхний уровень (наиболее абстрактный), а z_1 — нижний уровень (наиболее детальный):

p(x, z_1, ..., z_L) = p(z_L) * prod_{l=1}^{L-1} p(z_l | z_{l+1}) * p(x | z_1)

Генеративный процесс идёт сверху вниз:

  1. Сэмплирование латентной переменной верхнего уровня: z_L ~ p(z_L) = N(0, I)
  2. Для каждого последующего уровня: z_l ~ p(z_l | z_{l+1}) = N(mu_l(z_{l+1}), sigma_l(z_{l+1}))
  3. Генерация наблюдения: x ~ p(x | z_1)

Каждое условное распределение p(z_l | z_{l+1}) параметризуется нейронной сетью, которая отображает родительскую латентную переменную в среднее и дисперсию дочернего распределения. Это создаёт каскад, в котором абстрактная информация перетекает с верхнего уровня на самый тонкий.

Иерархическая ELBO

Нижняя граница свидетельства для иерархической модели декомпозируется как:

ELBO = E_q[log p(x|z_1)] - KL(q(z_L|x) || p(z_L)) - sum_{l=1}^{L-1} E_q[KL(q(z_l|z_{l+1},x) || p(z_l|z_{l+1}))]

Это включает:

  • Терм реконструкции: Насколько хорошо латентная переменная нижнего уровня z_1 восстанавливает вход
  • KL верхнего уровня: Регуляризует апостериорное распределение верхнего уровня к стандартному нормальному приору
  • Условные KL термы: На каждом промежуточном уровне регуляризуют апостериорное распределение кодировщика к условному приору генеративной модели

Условные KL термы — ключевое нововведение. На каждом уровне l кодировщик q(z_l | z_{l+1}, x) имеет доступ как к родительской латентной переменной, так и к исходным данным, тогда как приор p(z_l | z_{l+1}) имеет доступ только к родительской переменной. KL дивергенция между ними измеряет, сколько дополнительной информации из x кодировщик использует на уровне l — это именно та информация, которую уровень l кодирует о данных сверх того, что уже зафиксировано более высокими уровнями.

Сеть вывода (снизу вверх + сверху вниз)

Кодировщик в иерархическом VAE использует двунаправленную архитектуру:

Проход снизу вверх: Детерминистическая сеть обрабатывает вход x для получения признаков на каждом уровне:

h_l = f_l(h_{l-1}), h_0 = x

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

q(z_l | z_{l+1}, x) = N(mu_q(h_l, z_{l+1}), sigma_q(h_l, z_{l+1}))

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

Связь с Ladder VAE

Ladder VAE (Sonderby и др., 2016) представил практический подход к обучению иерархических VAE, комбинируя вычисления снизу вверх и сверху вниз через слияние, взвешенное по точности:

mu_q = (mu_bu * sigma_td^2 + mu_td * sigma_bu^2) / (sigma_bu^2 + sigma_td^2)
sigma_q^2 = (sigma_bu^2 * sigma_td^2) / (sigma_bu^2 + sigma_td^2)

где mu_bu, sigma_bu приходят из прохода снизу вверх, а mu_td, sigma_td — из приора сверху вниз. Это слияние оптимально при гауссовских предположениях и предотвращает хорошо известную проблему «коллапса апостериорного распределения», при которой более высокие уровни игнорируются в процессе обучения.

Отжиг KL для иерархического обучения

Обучение иерархических VAE известно своей сложностью из-за коллапса апостериорного распределения — тенденции модели игнорировать более высокие латентные уровни и кодировать всё в z_1. Две стратегии решают эту проблему:

Отжиг разогрева: Постепенное увеличение веса KL термов от 0 до 1 в ходе обучения:

L = E_q[log p(x|z_1)] - beta(t) * sum_l KL_l

где beta(t) линейно увеличивается от 0 до 1 в течение первой части обучения.

Свободные биты по уровням: Выделение каждому латентному измерению минимального количества натов перед наложением штрафа KL:

KL_l_effective = max(KL_l, lambda)

Это гарантирует, что каждый уровень кодирует не менее lambda натов информации, предотвращая коллапс.

3. Многомасштабная финансовая интерпретация

Назначение уровней в финансовых данных

Трёхуровневый HVAE для финансовых временных рядов естественно соответствует:

УровеньВременной масштабЧто фиксируетФинансовая интерпретация
z_3 (верхний)Недели–МесяцыМакрорежим, направление трендаБычий/медвежий режим, цикл волатильности
z_2 (средний)ДниДневные паттерны, моментумРотация секторов, скорость возврата к среднему
z_1 (нижний)Внутри дняМикроструктура, шумДинамика спреда, тиковые паттерны

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

Почему иерархия важна для трейдинга

Генерация сценариев с контролем масштаба: Зафиксируйте z_3 на «кризисном режиме» и сэмплируйте z_2 и z_1 для генерации разнообразных кризисных сценариев, разделяющих одни и те же макрохарактеристики, но различающихся в дневных и внутридневных деталях. Это гораздо полезнее для стресс-тестирования, чем генерация плоским VAE.

Многомасштабная декомпозиция риска: Вклад KL на каждом уровне количественно определяет, сколько риска исходит от каждого временного масштаба. Торговая стратегия, чувствительная к возмущениям z_3, зависит от режима; чувствительная к возмущениям z_1 — подвержена микроструктурному риску.

Иерархическое обнаружение аномалий: Наблюдение, аномальное на верхнем уровне (необычный макрорежим), требует иного обращения, чем аномальное только на нижнем уровне (необычный тиковый паттерн в нормальном режиме).

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

Многомасштабная генерация сценариев

Основное применение — генерация синтетических рыночных данных с независимым контролем на каждом масштабе:

  1. Режимно-согласованные стресс-тесты: Зафиксируйте латентную переменную верхнего уровня для кодирования определённого режима (выученного из исторических кризисных периодов), затем генерируйте тысячи сценариев, сэмплируя нижние уровни. Каждый сценарий согласован на макроуровне, но разнообразен на дневном/внутридневном уровне.

  2. Аугментация внутридневных паттернов: Зафиксируйте верхний и средний уровни для представления определённого типа дня, затем сэмплируйте нижний уровень для генерации разнообразных внутридневных траекторий. Это расширяет ограниченные внутридневные датасеты для обучения алгоритмов исполнения.

  3. Прогрессивная детализация: Сгенерируйте грубый сценарий на верхнем уровне, изучите его, затем прогрессивно добавляйте детали, сэмплируя нижние уровни. Это обеспечивает интерактивное исследование сценариев.

Иерархическая оценка портфельного риска

Декомпозиция портфельного риска по латентным уровням:

  • Чувствительность к z_3: Насколько меняется стоимость портфеля при смещении латентной переменной верхнего уровня? Это измеряет режимный риск — риск фундаментального изменения рыночной среды.
  • Чувствительность к z_2: Измеряет подверженность изменениям дневных паттернов — разворотам тренда, сменам моментума.
  • Чувствительность к z_1: Измеряет подверженность микроструктурному риску — проскальзыванию исполнения, внутридневным скачкам волатильности.

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

Многомасштабное прогнозирование

Использование иерархической структуры для прогнозирования на нескольких горизонтах одновременно:

  • Латентная переменная верхнего уровня: прогноз вероятности режима на следующий месяц
  • Латентная переменная среднего уровня: прогноз распределения доходности на следующую неделю
  • Латентная переменная нижнего уровня: прогноз паттерна внутридневной волатильности на завтра

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

5. HVAE против плоского VAE — Преимущество многомасштабности

Разделение информации

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

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

Количественные улучшения

В экспериментах с финансовыми данными иерархические VAE обычно обеспечивают:

  1. Лучшее правдоподобие: Улучшение ELBO на 5-15% по сравнению с плоскими VAE с той же общей латентной размерностью, поскольку иерархический приор более гибок.

  2. Более реалистичная многомасштабная статистика: Сгенерированные данные лучше соответствуют реальным на нескольких временных масштабах одновременно — дневные автокорреляции, недельные паттерны моментума и месячная режимная статистика — всё улучшается.

  3. Более чёткие сгенерированные образцы: Нижний уровень фиксирует тонкие детали, которые плоские VAE сглаживают, создавая сгенерированные доходности с более реалистичным эксцессом и внутридневными паттернами.

  4. Разделённые представления: Обход латентных переменных на разных уровнях производит масштабно-адекватные изменения — перемещение вдоль z_3 меняет режим, сохраняя внутридневные паттерны.

Стоимость иерархии

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

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

Наша реализация на Rust предоставляет полную трёхуровневую систему HVAE:

Основные компоненты

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

LevelPrior на каждом уровне параметризует условный приор сверху вниз p(z_l | z_{l+1}). Верхний уровень использует стандартный нормальный приор. Приор каждого последующего уровня обусловлен латентным сэмплом с уровня выше.

LevelPosterior на каждом уровне комбинирует признаки снизу вверх с контекстом сверху вниз для получения приближённого апостериорного распределения q(z_l | z_{l+1}, x). Именно здесь происходит слияние, взвешенное по точности.

HierarchicalDecoder принимает латентную переменную нижнего уровня z_1 и восстанавливает вход. Он зеркально отражает архитектуру кодировщика с прогрессивным масштабированием.

Стратегия обучения

Наша реализация использует отжиг разогрева KL для предотвращения коллапса апостериорного распределения:

  1. В первые 30% обучения вес KL beta линейно увеличивается от 0.0 до 1.0
  2. Свободные биты по уровням (lambda = 0.1 натов) гарантируют, что все уровни остаются активными
  3. Скорость обучения снижена для параметров верхнего уровня для предотвращения их доминирования на ранних этапах

Детектирование режимов и многомасштабные признаки

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

  • Окно нормализованных доходностей как входные признаки
  • Скользящая статистика на нескольких временных масштабах для обнаружения режимов
  • Автоматическое назначение меток режимов для оценки

Метрики качества

Мы оцениваем иерархический VAE по:

  • KL по уровням: Проверяет, что каждый уровень активен (кодирует информацию)
  • Многомасштабное совпадение распределений: Расстояние Вассерштейна на разных уровнях агрегации
  • Статистика сгенерированных образцов: Среднее, дисперсия и эксцесс в сравнении с реальными данными по режимам

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

Наша реализация получает реальные рыночные данные из API Bybit, в частности данные свечей BTCUSDT:

  1. Конечная точка API: Мы используем https://api.bybit.com/v5/market/kline для получения исторических данных OHLCV.

  2. Построение многомасштабных признаков: Необработанные цены конвертируются в логарифмические доходности. Эти доходности подаются на вход HVAE, где иерархическая структура автоматически учится декомпозировать их на многомасштабные компоненты.

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

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

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

  1. Иерархические VAE организуют латентное пространство в несколько уровней, каждый из которых фиксирует свой масштаб вариации — от макрорежимов наверху до деталей микроструктуры внизу.

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

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

  4. Многомасштабная генерация сценариев позволяет фиксировать латентные переменные верхнего уровня (режим) при сэмплировании нижних уровней, создавая режимно-согласованные, но разнообразные сценарии для стресс-тестирования и оценки рисков.

  5. Коллапс апостериорного распределения — основная проблема обучения иерархических VAE. Отжиг разогрева KL и свободные биты по уровням — необходимые техники для поддержания активности всех уровней в процессе обучения.

  6. Подход Ladder VAE использует слияние информации снизу вверх и сверху вниз, взвешенное по точности, предоставляя принципиальный и эффективный способ обучения глубоких иерархических моделей.

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

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

Литература

  1. Ladder Variational Autoencoders — Sonderby и др. (2016). URL: https://arxiv.org/abs/1602.02282
  2. NVAE: A Deep Hierarchical Variational Autoencoder — Vahdat & Koltun (2020). URL: https://arxiv.org/abs/2007.03898
  3. Variational Lossy Autoencoder — Chen и др. (2016). URL: https://arxiv.org/abs/1611.02731
  4. Importance Weighted Autoencoders — Burda и др. (2015). URL: https://arxiv.org/abs/1509.00519