Глава 239: Генерация портфелей с помощью VAE
Введение
Конструирование портфелей — одна из центральных задач количественных финансов. Традиционные подходы, такие как оптимизация по среднему-дисперсии (Markowitz, 1952), опираются на точечные оценки ожидаемых доходностей и ковариаций, которые известны своей нестабильностью и чувствительностью к ошибкам оценки. Вариационные автокодировщики (VAE) предлагают принципиально иной подход: вместо оптимизации одного портфеля мы обучаем всё распределение жизнеспособных портфелей и генерируем новые аллокации, семплируя из структурированного латентного пространства.
VAE учится сжимать многомерные векторы весов портфеля в низкомерное латентное представление, одновременно обучаясь реконструировать реалистичные портфели из этого сжатого пространства. Ключевая идея заключается в том, что латентное пространство захватывает существенную структуру правильно сформированных портфелей — паттерны диверсификации, секторные экспозиции, характеристики риска — в компактном, непрерывном представлении. Семплируя из этого латентного пространства, мы можем генерировать неограниченное количество синтетических портфелей, которые разделяют статистические свойства обучающей выборки, но являются по-настоящему новыми.
В этой главе представлена полная система генерации портфелей на основе VAE. Мы рассмотрим математические основы VAE, их применение к векторам весов портфеля и рабочую реализацию на Rust, подключённую к криптовалютной бирже Bybit для генерации портфелей в реальном времени.
Ключевые концепции
Вариационные автокодировщики
Вариационный автокодировщик состоит из двух нейронных сетей: кодировщика $q_\phi(\mathbf{z}|\mathbf{x})$, отображающего входные данные в распределение в латентном пространстве, и декодировщика $p_\theta(\mathbf{x}|\mathbf{z})$, отображающего латентные векторы обратно в пространство данных.
Для входного вектора весов портфеля $\mathbf{x} \in \mathbb{R}^n$ (где $n$ — количество активов) кодировщик производит параметры гауссовского распределения в латентном пространстве:
$$\boldsymbol{\mu} = f_\mu(\mathbf{x}; \phi), \quad \log \boldsymbol{\sigma}^2 = f_\sigma(\mathbf{x}; \phi)$$
Латентный вектор семплируется с помощью трюка репараметризации:
$$\mathbf{z} = \boldsymbol{\mu} + \boldsymbol{\sigma} \odot \boldsymbol{\epsilon}, \quad \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})$$
Декодировщик затем реконструирует веса портфеля:
$$\hat{\mathbf{x}} = g(\mathbf{z}; \theta)$$
Целевая функция обучения (ELBO)
VAE обучается путём максимизации нижней границы обоснованности (ELBO):
$$\mathcal{L}(\theta, \phi; \mathbf{x}) = \mathbb{E}{q\phi(\mathbf{z}|\mathbf{x})}[\log p_\theta(\mathbf{x}|\mathbf{z})] - D_{KL}(q_\phi(\mathbf{z}|\mathbf{x}) | p(\mathbf{z}))$$
Первый член — это ошибка реконструкции, побуждающая декодировщик точно воспроизводить входные портфели. Второй член — KL-дивергенция между приближённым апостериорным и априорным распределением $p(\mathbf{z}) = \mathcal{N}(\mathbf{0}, \mathbf{I})$, которая регуляризирует латентное пространство, делая его гладким и непрерывным.
Для весов портфеля с ограничением суммы в единицу ошибка реконструкции обычно представляет собой среднеквадратичную ошибку:
$$\mathcal{L}_{\text{recon}} = |\mathbf{x} - \hat{\mathbf{x}}|^2$$
KL-дивергенция для гауссовских распределений имеет аналитическое решение:
$$D_{KL} = -\frac{1}{2} \sum_{j=1}^{d} \left(1 + \log \sigma_j^2 - \mu_j^2 - \sigma_j^2\right)$$
где $d$ — размерность латентного пространства.
Ограничения портфеля
Сгенерированные портфели должны удовлетворять нескольким ограничениям для практического использования:
- Бюджетное ограничение: Веса должны суммироваться в единицу: $\sum_{i=1}^{n} w_i = 1$
- Ограничение только длинных позиций (опционально): Все веса неотрицательны: $w_i \geq 0$
- Лимиты позиций: Ни одна позиция не превышает максимум: $w_i \leq w_{\max}$
- Минимальная аллокация: Только значимые позиции: $w_i \geq w_{\min}$ или $w_i = 0$
Эти ограничения применяются через шаг постобработки к выходу декодировщика. Наиболее распространённый подход — нормализация через softmax:
$$w_i = \frac{e^{\hat{x}i}}{\sum{j=1}^{n} e^{\hat{x}_j}}$$
Это обеспечивает неотрицательные веса, суммирующиеся в единицу. Лимиты позиций могут быть применены через обрезку и перенормализацию.
Свойства латентного пространства
Хорошо обученный VAE создаёт латентное пространство с полезными геометрическими свойствами:
- Гладкость: Близкие точки в латентном пространстве соответствуют похожим портфелям. Движение вдоль направления в латентном пространстве производит непрерывное преобразование характеристик портфеля.
- Интерполяция: Линейная интерполяция между двумя латентными векторами создаёт плавный переход между соответствующими портфелями, позволяя смешивание портфелей.
- Распутывание: Различные латентные измерения могут захватывать различные характеристики портфеля (уровень риска, секторная экспозиция, концентрация), позволяя целевое манипулирование.
- Покрытие: Семплирование из априорного распределения $\mathcal{N}(\mathbf{0}, \mathbf{I})$ генерирует разнообразные, реалистичные портфели, охватывающие пространство жизнеспособных аллокаций.
Стратегии генерации портфелей
Безусловная генерация
Простейший подход семплирует латентные векторы из априорного распределения и декодирует их:
$$\mathbf{z} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}), \quad \hat{\mathbf{w}} = \text{softmax}(g(\mathbf{z}; \theta))$$
Это генерирует портфели из обученного распределения без какого-либо конкретного нацеливания. Полезно для исследования полного пространства жизнеспособных аллокаций и для моделирования Монте-Карло исходов портфеля.
Условная генерация
Условный VAE (CVAE) обуславливает генерацию желаемыми свойствами, такими как целевой уровень риска, секторная экспозиция или ожидаемая доходность:
$$q_\phi(\mathbf{z}|\mathbf{x}, \mathbf{c}), \quad p_\theta(\mathbf{x}|\mathbf{z}, \mathbf{c})$$
где $\mathbf{c}$ — вектор условий. Например, $\mathbf{c}$ может кодировать целевую волатильность 15% и максимальную аллокацию в технологии 30%. CVAE учится генерировать портфели, удовлетворяющие этим условиям, сохраняя при этом разнообразие и реалистичность безусловной генерации.
Оптимизация в латентном пространстве
Вместо случайного семплирования мы можем оптимизировать в латентном пространстве для поиска портфелей с определёнными свойствами:
$$\mathbf{z}^* = \arg\max_{\mathbf{z}} ; \text{Sharpe}(\text{decode}(\mathbf{z})) \quad \text{s.t.} \quad |\mathbf{z}| \leq r$$
Ограничение $|\mathbf{z}| \leq r$ удерживает поиск в области латентных векторов высокой плотности, гарантируя, что оптимизированные портфели остаются реалистичными. Этот подход сочетает генеративную мощь VAE с традиционными целями оптимизации портфеля.
Интерполяция портфелей
Для двух референсных портфелей $\mathbf{w}_A$ и $\mathbf{w}_B$ мы можем сгенерировать континуум смешанных портфелей:
$$\mathbf{z}_\alpha = (1 - \alpha) \cdot \text{encode}(\mathbf{w}_A) + \alpha \cdot \text{encode}(\mathbf{w}_B), \quad \alpha \in [0, 1]$$
$$\mathbf{w}\alpha = \text{decode}(\mathbf{z}\alpha)$$
В отличие от простого усреднения весов, эта интерполяция в латентном пространстве уважает обученную структуру жизнеспособных портфелей, создавая промежуточные аллокации, которые более реалистичны и лучше диверсифицированы.
Подходы машинного обучения
Архитектура VAE для портфелей
Кодировщик и декодировщик обычно представляют собой неглубокие полносвязные сети:
Кодировщик: $$\mathbf{h}_1 = \text{ReLU}(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)$$ $$\mathbf{h}_2 = \text{ReLU}(\mathbf{W}_2 \mathbf{h}1 + \mathbf{b}2)$$ $$\boldsymbol{\mu} = \mathbf{W}\mu \mathbf{h}2 + \mathbf{b}\mu$$ $$\log \boldsymbol{\sigma}^2 = \mathbf{W}\sigma \mathbf{h}2 + \mathbf{b}\sigma$$
Декодировщик: $$\mathbf{h}_3 = \text{ReLU}(\mathbf{W}_3 \mathbf{z} + \mathbf{b}_3)$$ $$\mathbf{h}_4 = \text{ReLU}(\mathbf{W}_4 \mathbf{h}_3 + \mathbf{b}_4)$$ $$\hat{\mathbf{x}} = \mathbf{W}_5 \mathbf{h}_4 + \mathbf{b}_5$$
Для вселенной из $n$ активов с латентной размерностью $d$ типичные размеры слоёв:
- Вход: $n$ (количество активов)
- Скрытые слои: $64 \to 32$
- Латентная размерность: $d = 8$ до $16$
- Выход: $n$ (с последующим softmax для нормализации весов)
Дизайн функции потерь
Общая функция потерь балансирует реконструкцию и регуляризацию:
$$\mathcal{L}{\text{total}} = \mathcal{L}{\text{recon}} + \beta \cdot D_{KL}$$
Гиперпараметр $\beta$ контролирует компромисс:
- $\beta < 1$: Акцент на точности реконструкции, производя портфели ближе к обучающей выборке, но с менее гладким латентным пространством.
- $\beta = 1$: Стандартная целевая функция VAE (ELBO).
- $\beta > 1$: Акцент на регулярности латентного пространства ($\beta$-VAE), создавая более гладкие интерполяции, но потенциально жертвуя точностью реконструкции.
Для генерации портфелей $\beta \in [0.1, 0.5]$ часто работает хорошо, так как точная реконструкция весов важнее гладкости латентного пространства.
Генерация обучающих данных
Обучающие портфели могут быть сгенерированы из нескольких источников:
-
Случайное семплирование Дирихле: $\mathbf{w} \sim \text{Dir}(\boldsymbol{\alpha})$ генерирует случайные длинные портфели. Параметр концентрации $\boldsymbol{\alpha}$ контролирует разнообразие: малое $\alpha$ создаёт концентрированные портфели; большое $\alpha$ — равномерные аллокации.
-
Исторически оптимизированные портфели: Запуск оптимизации по среднему-дисперсии с различными настройками параметров (целевые доходности, уровни неприятия риска, наборы ограничений) на скользящих окнах для генерации разнообразной обучающей выборки оптимизированных портфелей.
-
Портфели паритета риска: Генерация портфелей, где каждый актив вносит равный вклад в общий риск, используя различные методы оценки ковариации и периоды наблюдения.
-
Бутстреппированные портфели: Пересемплирование исторических доходностей и оптимизация для создания портфелей, устойчивых к неопределённости оценки.
Конструирование признаков
Признаки доходности активов
Входные признаки для обуславливания VAE включают:
- Скользящие доходности: Средние доходности за 5, 20, 60 торговых дней
- Скользящая волатильность: Стандартное отклонение доходностей за соответствующие окна
- Структура корреляций: Попарные корреляции между активами, возможно сжатые через PCA
- Оценки моментума: Скорректированный на риск моментум (доходность, делённая на волатильность) для трендовых сигналов
Признаки риска
- Волатильность портфеля: $\sigma_p = \sqrt{\mathbf{w}^T \Sigma \mathbf{w}}$
- Максимальная просадка: Худшее падение от пика до дна за период наблюдения
- Value at Risk (VaR): Уровень потерь, который не превышается с заданной вероятностью
- Conditional VaR (CVaR): Ожидаемые потери при условии, что потери превышают VaR
Признаки рыночного режима
- Уровень VIX или индекс волатильности крипто: Общий показатель страха на рынке
- Индикатор тренда: Находится ли широкий рынок в восходящем или нисходящем тренде
- Дисперсия: Поперечное стандартное отклонение доходностей активов (высокая дисперсия благоприятствует выбору акций)
Приложения
Диверсификация портфеля
Портфели, сгенерированные VAE, предоставляют естественный источник диверсифицированных аллокаций. Семплируя множество портфелей и выбирая те, что обладают лучшими характеристиками доходности и риска, инвесторы могут обнаружить аллокации, которые могут не возникнуть при традиционной оптимизации. Способность VAE захватывать сложные зависимости между весами активов гарантирует, что сгенерированные портфели учитывают корреляционную структуру базовых активов.
Стресс-тестирование
Систематически исследуя латентное пространство, риск-менеджеры могут генерировать портфели, охватывающие полный диапазон возможных аллокаций, и оценивать их поведение при стрессовых сценариях. Это более тщательно, чем тестирование одного оптимизированного портфеля, поскольку показывает, как различные стратегии аллокации работают в экстремальных условиях.
Робастная оптимизация
Вместо оптимизации одного набора весов мы можем сгенерировать множество портфелей из VAE, оценить каждый при множестве сценариев доходности и выбрать аллокацию, которая лучше всего работает в худшем случае. Этот подход max-min создаёт портфели, устойчивые к ошибкам оценки и модельной неопределённости.
Обнаружение альфы
Латентное пространство может выявить структуру в пространстве портфелей, которая не очевидна при рассмотрении отдельных активов. Кластеры в латентном пространстве соответствуют различным стилям портфелей, а границы между кластерами могут представлять новые стратегии аллокации, сочетающие различные инвестиционные подходы.
Реализация на Rust
Наша реализация на Rust предоставляет полный набор инструментов для генерации портфелей с помощью VAE со следующими компонентами:
PortfolioVAE
Структура PortfolioVAE реализует полносвязный VAE с настраиваемыми архитектурами кодировщика и декодировщика. Она поддерживает обучение через стохастический градиентный спуск с целевой функцией ELBO, генерацию портфелей путём семплирования из латентного пространства, и кодирование/декодирование существующих портфелей. Выходной слой softmax гарантирует, что сгенерированные веса являются валидными распределениями вероятностей.
PortfolioGenerator
Структура PortfolioGenerator оборачивает VAE и предоставляет высокоуровневые методы генерации портфелей: безусловное семплирование, интерполяцию между референсными портфелями и оптимизацию в латентном пространстве для целевых метрик. Она также обрабатывает применение ограничений портфеля (лимиты позиций, пороги минимальной аллокации).
PortfolioEvaluator
Структура PortfolioEvaluator вычисляет стандартные метрики портфеля: годовую доходность, волатильность, коэффициент Шарпа, коэффициент Сортино, максимальную просадку и коэффициент диверсификации. Эти метрики используются как для оценки сгенерированных портфелей, так и для целей оптимизации в латентном пространстве.
DirichletSampler
DirichletSampler генерирует случайные обучающие портфели с использованием распределения Дирихле. Он поддерживает настраиваемые параметры концентрации и возможность генерации портфелей с определёнными характеристиками (концентрированные, сбалансированные, с секторным наклоном) для аугментации обучающих данных.
BybitClient
Структура BybitClient предоставляет асинхронный HTTP-доступ к Bybit V5 API. Она получает данные свечей (kline) из эндпоинта /v5/market/kline для вычисления доходностей и ковариаций активов. Клиент поддерживает одновременную работу с несколькими торговыми парами, обеспечивая конструирование портфеля по всей вселенной криптовалют.
Интеграция с Bybit API
Реализация подключается к REST API Bybit V5 для получения рыночных данных в реальном времени для конструирования портфелей:
- Эндпоинт свечей (
/v5/market/kline): Предоставляет данные OHLCV свечей с настраиваемыми интервалами для каждого актива в портфельной вселенной. Используется для вычисления рядов доходностей, ковариационных матриц и метрик риска. - Множественные символы: Клиент получает данные по всем символам в портфельной вселенной (например, BTCUSDT, ETHUSDT, SOLUSDT, ADAUSDT) и выравнивает временные метки для построения чистой матрицы доходностей.
Bybit API хорошо подходит для генерации портфелей, поскольку предоставляет:
- Согласованные исторические данные по множеству торговых пар
- Точные интервалы для внутридневной ребалансировки портфеля
- Данные в реальном времени для систем генерации портфелей в продакшене
Ссылки
- Kingma, D. P., & Welling, M. (2014). Auto-encoding variational Bayes. Proceedings of the International Conference on Learning Representations (ICLR).
- Higgins, I., et al. (2017). beta-VAE: Learning basic visual concepts with a constrained variational framework. ICLR.
- Markowitz, H. (1952). Portfolio selection. The Journal of Finance, 7(1), 77-91.
- Sohn, K., Lee, H., & Yan, X. (2015). Learning structured output representation using deep conditional generative models. Advances in Neural Information Processing Systems (NeurIPS).
- Rezende, D. J., Mohamed, S., & Wierstra, D. (2014). Stochastic backpropagation and approximate inference in deep generative models. Proceedings of the 31st International Conference on Machine Learning (ICML).
- Cong, L. W., Tang, K., Wang, J., & Zhang, Y. (2022). Deep sequence modeling: Development and applications in asset pricing. The Journal of Financial Data Science, 3(1), 28-42.