Глава 233: Динамическая факторная модель RVRAE
1. Введение
Рекуррентный вариационный рекуррентный автоэнкодер (RVRAE) представляет собой значительный прогресс в динамическом факторном моделировании финансовых рынков. Традиционные факторные модели предполагают, что как факторные нагрузки, так и сами факторы статичны во времени, или в лучшем случае изменяются в соответствии с заранее заданными окнами. Это предположение нарушается на реальных финансовых рынках, где режимы меняются, корреляции эволюционируют, а фундаментальные драйверы доходности активов по своей природе нестационарны.
RVRAE сочетает генеративную мощь вариационных автоэнкодеров (VAE) с возможностями последовательной обработки рекуррентных нейронных сетей (RNN). В результате получается модель, которая обучает временные латентные факторы непосредственно из многомерных финансовых временных рядов, фиксируя то, как скрытая структура рынка эволюционирует во времени. В отличие от статического PCA или стандартных подходов VAE, которые обрабатывают каждое наблюдение независимо, RVRAE учитывает временной порядок данных и моделирует динамику латентных факторов как стохастический процесс.
Ключевая идея заключается в том, что финансовые рынки управляются небольшим числом латентных факторов (таких как аппетит к риску, условия ликвидности, секторальные ротации), чьё влияние на отдельные активы изменяется во времени. RVRAE одновременно обучает как факторы, так и их временные нагрузки, создавая траекторию латентных состояний z_t, представляющую эволюционирующую структуру рынка. Это делает его особенно подходящим для динамического построения портфелей, обнаружения режимов и временного разложения рисков.
В этой главе мы разрабатываем математические основы RVRAE, сравниваем его со статическими факторными подходами, подробно исследуем его архитектуру и реализуем полную систему на Rust с интеграцией рыночных данных Bybit.
2. Математические основы
2.1 Последовательный вариационный вывод
RVRAE строится на фреймворке вариационной рекуррентной нейронной сети (VRNN). Дана последовательность наблюдений x = (x_1, x_2, …, x_T), мы стремимся обучить генеративную модель с латентными переменными z = (z_1, z_2, …, z_T). Совместное распределение факторизуется как:
p(x_1:T, z_1:T) = prod_{t=1}^{T} p(x_t | z_{<=t}, x_{<t}) * p(z_t | x_{<t}, z_{<t})Априорное распределение z_t зависит от всех предыдущих наблюдений и латентных состояний через скрытое состояние h_t, поддерживаемое рекуррентной сетью:
p(z_t | x_{<t}, z_{<t}) = N(mu_prior_t, sigma_prior_t)где mu_prior_t и sigma_prior_t вычисляются из h_{t-1}, скрытого состояния RNN, которое суммирует историю.
2.2 Рекуррентный энкодер
Энкодер (сеть вывода) производит приближённое апостериорное распределение:
q(z_t | x_{<=t}, z_{<t}) = N(mu_enc_t, sigma_enc_t)Энкодер принимает на вход текущее наблюдение x_t, конкатенированное со скрытым состоянием RNN h_{t-1}:
h_enc_t = GRU_enc(x_t, h_{t-1})mu_enc_t = W_mu * h_enc_t + b_mulog_sigma_enc_t = W_sigma * h_enc_t + b_sigmaЭто критически важно: апостериорное распределение в момент t зависит не только от x_t, но и от всей истории через h_{t-1}. Это позволяет модели использовать временной контекст при выводе текущего латентного состояния.
2.3 Трюк репараметризации
На каждом временном шаге мы делаем выборку с использованием трюка репараметризации:
z_t = mu_enc_t + sigma_enc_t * epsilon_t, где epsilon_t ~ N(0, I)Это позволяет обратному распространению проходить через операцию сэмплирования. Полученный z_t затем подаётся как в декодер, так и в обновление состояния RNN.
2.4 Рекуррентный декодер
Декодер реконструирует x_t из z_t и скрытого состояния:
h_dec_t = GRU_dec(z_t, h_{t-1})x_hat_t = W_dec * h_dec_t + b_dec2.5 Последовательный ELBO с KL-отжигом
Целевая функция обучения — последовательная нижняя оценка свидетельства (ELBO):
L = sum_{t=1}^{T} [ E_q[log p(x_t | z_t, h_{t-1})] - beta_t * KL(q(z_t | x_{<=t}, z_{<t}) || p(z_t | x_{<t}, z_{<t})) ]KL-дивергенция между двумя гауссианами имеет замкнутую форму:
KL(q || p) = 0.5 * sum_j [ log(sigma_p_j / sigma_q_j) + (sigma_q_j^2 + (mu_q_j - mu_p_j)^2) / sigma_p_j^2 - 1 ]Коэффициент beta_t реализует KL-отжиг — технику, при которой мы постепенно увеличиваем вес KL-члена во время обучения. Это предотвращает распространённый режим отказа — коллапс апостериорного распределения, при котором модель учится игнорировать латентные переменные. Типичное расписание:
beta_t = min(1.0, epoch / annealing_epochs)Начиная с beta близкого к нулю, позволяет модели сначала обучить полезные представления в z, а затем постепенно применяет вариационное ограничение.
3. Динамические vs статические факторы
3.1 Ограничения статических факторных моделей
Традиционные факторные модели, такие как PCA или стандартный факторный анализ, предполагают:
x_t = Lambda * f_t + epsilon_tгде Lambda (матрица нагрузок) постоянна во времени. Даже если f_t варьируется, связь между факторами и наблюдаемыми переменными остаётся фиксированной. Это предположение нарушается когда:
- Рыночные режимы меняются (например, среда risk-on vs risk-off)
- Корреляции эволюционируют (например, скачки корреляций в кризисные периоды)
- Возникают новые рыночные структуры (например, созревание рынка криптовалют)
- Секторальные ротации изменяют, какие активы движутся совместно
PCA на скользящем окне частично решает эту проблему, но вводит чувствительность к длине окна и не может моделировать плавные переходы.
3.2 Временные факторные нагрузки
RVRAE неявно обучает временные факторные нагрузки через взаимодействие между z_t и скрытым состоянием декодера. Реконструкция в момент t зависит от:
x_hat_t = f(z_t, h_{t-1})Поскольку h_{t-1} несёт информацию обо всей истории, эффективное отображение из z_t в x_hat_t изменяется во времени. Это означает, что «нагрузка» каждого актива на каждый фактор сама является динамической величиной, адаптирующейся к текущему состоянию рынка.
3.3 Режимно-адаптивные факторы
Латентная траектория z_1, z_2, …, z_T естественным образом фиксирует смены режимов. Когда рынок претерпевает структурный сдвиг, латентные факторы перемещаются в другую область латентного пространства. Это можно обнаружить, отслеживая:
- Скорость факторов: ||z_t - z_{t-1}|| указывает, насколько быстро меняется структура рынка
- Ускорение факторов: изменения скорости сигнализируют о переходах режимов
- Кластеризация факторов: периоды, когда z_t группируется в определённых регионах, указывают на стабильные режимы
3.4 Улавливание нестационарности
Рекуррентная структура RVRAE по своей природе подходит для нестационарных данных. Скрытое состояние h_t действует как достаточная статистика для истории, позволяя модели адаптировать своё поведение на основе наблюдений. Это контрастирует со статическими моделями, которые должны переоцениваться на новых окнах и не могут плавно отслеживать постепенные изменения.
4. Торговые применения
4.1 Динамическое разложение факторов риска
RVRAE позволяет разлагать риск портфеля на временные факторные вклады. В каждый момент t латентное z_t представляет текущие факторные экспозиции. Анализируя связь доходности портфеля с изменениями z_t, трейдеры могут понять:
- Какие латентные факторы в настоящее время определяют P&L портфеля
- Как факторные экспозиции сместились за последние периоды
- Становится ли портфель более или менее концентрированным в определённых факторных ставках
Это более информативно, чем статическое разложение рисков, поскольку отражает текущую структуру рынка, а не среднее за некоторое историческое окно.
4.2 Построение портфеля с временными факторами
Динамические факторы обеспечивают действительно адаптивное построение портфелей. Процесс работает следующим образом:
- Обучить RVRAE на недавних данных доходности нескольких активов
- Извлечь траекторию латентных факторов z_1:T
- Оценить временную ковариацию факторов по недавним значениям z_t
- Отобразить ковариацию факторов обратно в ковариацию активов через декодер
- Оптимизировать веса портфеля с использованием временной ковариации
Этот подход естественно адаптируется к изменяющимся корреляционным структурам без необходимости явного обнаружения режимов или переключения моделей.
4.3 Отслеживание рыночного режима через латентную динамику
Латентное пространство обученного RVRAE обеспечивает низкоразмерное представление состояния рынка. Отслеживание режима включает:
- Онлайн-вывод: по мере поступления новых данных запускаем энкодер вперёд для получения z_t
- Маркировка режимов: кластеризация исторических траекторий z_t по режимам
- Обнаружение переходов: мониторинг расстояния от текущего z_t до центроидов режимов
- Предсказательные сигналы: использование динамики z_t (скорость, направление) как альфа-сигналов
Преимущество перед явными моделями режимов (такими как скрытые марковские модели) состоит в том, что RVRAE обучает структуру режимов непосредственно из данных без необходимости предопределять количество режимов или структуру переходов.
4.4 Факторный моментум и возврат к среднему
Временная структура z_t позволяет реализовать стратегии тайминга на уровне факторов:
- Факторный моментум: когда z_t показывает устойчивое направленное движение, увеличивать позиции в активах с положительной нагрузкой на этот фактор
- Факторный возврат к среднему: когда z_t значительно отклоняется от исторического среднего, ожидать возврата и позиционироваться соответственно
- Тайминг волатильности факторов: когда ||z_t - z_{t-1}|| повышен, сокращать общую экспозицию
5. Архитектура RVRAE
5.1 Общая структура
Архитектура RVRAE состоит из трёх взаимосвязанных компонентов:
Вход x_t ──> [GRU Энкодер] ──> (mu_t, sigma_t) | | v v [Скрытое состояние h_t] [Репараметризация] ──> z_t | | v v [GRU Декодер] <──────────┘ | v x_hat_t (реконструкция)5.2 Детали ячейки GRU
Мы используем управляемые рекуррентные блоки (GRU) как для энкодера, так и для декодера. Уравнения обновления GRU:
r_t = sigmoid(W_r * [h_{t-1}, x_t]) (вентиль сброса)u_t = sigmoid(W_u * [h_{t-1}, x_t]) (вентиль обновления)h_tilde = tanh(W_h * [r_t * h_{t-1}, x_t]) (кандидат)h_t = (1 - u_t) * h_{t-1} + u_t * h_tilde (новое состояние)GRU предпочтительнее LSTM здесь из-за более простой параметризации (меньше параметров для обучения), что полезно при обычно ограниченных финансовых обучающих данных.
5.3 Временная KL-дивергенция
Член KL на каждом временном шаге измеряет, насколько апостериорное распределение энкодера отклоняется от априорного. В RVRAE априорное распределение не является фиксированным N(0, I), а само обусловлено историей:
p(z_t | h_{t-1}) = N(mu_prior(h_{t-1}), sigma_prior(h_{t-1}))Это временное априорное распределение позволяет модели обучать гладкую латентную динамику. KL между апостериорным и обученным априорным распределением фиксирует, насколько «неожиданным» является текущее наблюдение относительно ожиданий модели на основе истории.
5.4 Процедура обучения
- Прямой проход: обработка последовательности через GRU энкодера, сэмплирование z_t на каждом шаге, реконструкция через GRU декодера
- Вычисление функции потерь: суммирование ошибки реконструкции (MSE) и KL-дивергенции по временным шагам с применением beta-отжига
- Обратное распространение через время: градиенты проходят как через латентное сэмплирование, так и через рекуррентные связи
- Ограничение градиентов: существенно для стабильного обучения рекуррентных моделей на финансовых данных
6. Пошаговый обзор реализации
Реализация на Rust предоставляет полную систему RVRAE со следующими компонентами:
6.1 Ячейка GRU
Структура GRUCell реализует управляемый рекуррентный блок с вентилем сброса, вентилем обновления и вычислением кандидата. Веса инициализируются с помощью инициализации Ксавье для стабильного обучения.
6.2 Рекуррентный энкодер
RecurrentEncoder обрабатывает входные последовательности через GRU и выводит вектора среднего и логарифма дисперсии для каждого временного шага для приближённого апостериорного распределения.
6.3 Рекуррентный декодер
RecurrentDecoder принимает выбранные латентные вектора z_t и производит реконструированные наблюдения, также используя GRU для поддержания временной когерентности.
6.4 Модель RVRAE
Структура верхнего уровня RVRAE координирует энкодер, декодер и сеть априорного распределения. Она реализует:
forward(): полный прямой проход с сэмплированиемcompute_loss(): последовательный ELBO с KL-отжигомextract_factors(): производит латентную траекторию z_1:T для анализаtrain(): цикл обучения с настраиваемыми эпохами и скоростью обучения
6.5 Анализ факторов
Структура FactorDynamics предоставляет инструменты для анализа извлечённых факторов:
- Вычисление автокорреляции для каждого фактора
- Обнаружение смены режимов на основе скорости факторов
- Анализ корреляции факторов во времени
Полная реализация находится в rust/src/lib.rs, а полный торговый рабочий процесс — в rust/examples/trading_example.rs.
7. Интеграция данных Bybit
Реализация получает реальные рыночные данные из публичного API Bybit:
GET https://api.bybit.com/v5/market/kline?category=linear&symbol=BTCUSDT&interval=60&limit=200Конвейер данных:
- Получение данных OHLCV kline для нескольких символов (BTCUSDT, ETHUSDT)
- Вычисление логарифмических доходностей из цен закрытия
- Нормализация доходностей к нулевому среднему и единичной дисперсии
- Форматирование как матрица многомерного временного ряда
- Подача в RVRAE для обучения и извлечения факторов
Данные по нескольким активам выравниваются по временным меткам и объединяются в единую матрицу наблюдений, где каждая строка — временной шаг, а каждый столбец — доходность актива.
8. Ключевые выводы
-
RVRAE улавливает временную структуру рынка: В отличие от статических факторных моделей, RVRAE обучает эволюцию латентных факторов во времени, создавая траекторию z_1:T, представляющую изменяющееся состояние рынка.
-
Архитектура последовательного VAE учитывает временной порядок: Рекуррентные энкодер и декодер поддерживают скрытые состояния, несущие исторический контекст, позволяя модели использовать временные паттерны в динамике факторов.
-
KL-отжиг критически важен для финансовых данных: Финансовые временные ряды зашумлены и высокоразмерны относительно количества обучающих образцов. KL-отжиг предотвращает коллапс апостериорного распределения и обеспечивает, что латентное пространство фиксирует значимую структуру.
-
Динамические факторы обеспечивают адаптивные торговые стратегии: Временное факторное разложение поддерживает режимно-осведомлённое построение портфелей, динамическое управление рисками и стратегии тайминга факторов, которые статические модели не могут обеспечить.
-
Скорость факторов сигнализирует о смене режимов: Мониторинг скорости изменения латентных факторов обеспечивает систему раннего предупреждения о переходах рыночных режимов.
-
Реализация на Rust обеспечивает производственную производительность: Архитектура на основе GRU, реализованная на Rust, обеспечивает вычислительную эффективность, необходимую для извлечения факторов и ребалансировки портфеля в реальном времени.
-
Интеграция с Bybit позволяет анализировать факторы криптовалют: Волатильный, круглосуточный крипторынок является идеальным полигоном для динамических факторных моделей.
-
Временное априорное распределение — ключевой элемент: Использование обученного, зависящего от истории априорного распределения вместо фиксированного N(0,I) позволяет RVRAE моделировать гладкую динамику факторов и различать ожидаемые и неожиданные движения рынка.