Многошаговый подход к минимизации риска на децентрализованных биржах

6/10

Daniele Maria Di Nosse · Scuola Normale Superiore, Pisa

Federico Gatta · Scuola Normale Superiore, Pisa

12 июня 2024 · arXiv v2

Оригинал: Di Nosse, D. M. and Gatta, F. «A Multi-Step Approach for Minimizing Risk in Decentralized Exchanges: The SIAG/FME Code Quest 2023 Winning Strategy» — arxiv.org/abs/2406.07200 (PDF, 14 стр.).

Рис. 1–3 воспроизведены из оригинальной публикации.

Классификация arXiv: q-fin.PM

Ключевые слова: децентрализованные биржи · Conditional Value at Risk · Expected Shortfall · криптовалюты

Аннотация

Децентрализованные биржи (DEX) всё более доминируют в современных финансах. Чтобы изучить это явление с академической точки зрения, был объявлен SIAG/FME Code Quest 2023. Участникам предлагалось реализовать на Python базовые функции Automated Market Maker и стратегию предоставления ликвидности в AMM для минимизации Conditional Value at Risk — ключевой меры инвестиционного риска. Как победившая команда, мы описываем наш подход.

Поскольку зависимость итоговой доходности от начального распределения капитала сильно нелинейна, стандартные ad-hoc методы неприменимы. Классические методы минимизации требуют значительных вычислительных ресурсов из-за стоимости вычисления целевой функции. Поэтому мы предлагаем трёхшаговый подход. На первом шаге целевая функция аппроксимируется Kernel Ridge Regression (KRR). Затем минимизируется аппроксимирующая функция. На финальном шаге найденный минимум используется как стартовая точка для прямой оптимизации исходной целевой функции. Эта процедура снижает вычислительную сложность и повышает точность решения. Общая нагрузка дополнительно уменьшается за счёт алгоритмического приёма в симуляции доходностей и использования Cython.

1. Введение

Сегодня Decentralized Finance и крипторынки — одна из самых горячих тем в финансах. Ежедневно на DEX торгуются миллиарды долларов [8]. Стремительный рост связан с внутренними слабостями централизованных бирж (CEX), прежде всего с необходимостью доверять централизованной стороне [15], что не раз приводило к катастрофам — как в случае FTX. Чтобы обойтись без посредника, DEX используют smart contracts — неизменяемый набор инструкций, определяющих обращение криптоактивов на бирже и формирование цены [3]. Функционирование современных DEX задаётся Automated Market Makers (AMM).

AMM — алгоритмы, управляющие ликвидностью биржи и определяющие цену актива. Они работают через liquidity pools и правила ценообразования. В простейшем случае пул — «копилка» с двумя монетами. Основные участники — Liquidity Providers (LP) и Liquidity Takers (LT). LP добавляют обе монеты в пул; LT забирают ликвидность, обменивая монеты. Вклад LP подтверждается LP coins — долей пула. LT платят комиссию, которая распределяется между LP пропорционально LP coins и правилам протокола. Правила ценообразования — набор математических функций, регулирующих swap. Наиболее распространён Constant Product Market Maker (CPMM): цена монеты выбирается так, чтобы произведение резервов до и после обмена оставалось постоянным. Часто для одной пары токенов существует несколько независимых пулов — это порождает задачу оптимизации для LP, стремящихся максимизировать прибыль.

Из-за интереса к оптимальным инвестиционным стратегиям LP в нескольких пулах (см., например, [6]) SIAM Activity Group on Financial Mathematics and Engineering (SIAG/FME) посвятил Code Quest 2023 Programming Challenge реализации стратегии снижения Conditional Value at Risk на уровне \(\alpha\) (CVaR\(_\alpha\)) при фиксированной доверительной вероятности \(\alpha = 0{,}9\), сохраняя большую часть массы распределения доходности выше заданного порога. Участники управляют начальным (в момент \(t=0\)) распределением капитала по пулам. Это влияет на распределение доходности в фиксированный момент \(T\) и, соответственно, на CVaR инвестиции.

Минимизация CVaR как задача портфельной оптимизации хорошо известна в финансовой литературе; краеугольный камень — Rockafellar и Uryasev [14]. В рамках классической портфельной теории предполагается линейная зависимость доходности (или убытка) портфеля от весов компонент. В нашем контексте это предположение нарушается: связь сильно нелинейна, как показано в следующем разделе. Популярна также работа [13], где минимизация достигается максимизацией прибыли при ограничении на CVaR\(_\alpha\). Из-за сложной природы функции доходности в CPMM предпосылки подхода трудно проверить, и эмпирически стратегия не даёт результата. Альтернатива — рассматривать задачу как стандартную оптимизацию и применять классические численные методы. Наивные подходы дают приемлемую точность, но крайне дороги: вычисление отображения «начальное распределение капитала → CVaR\(_\alpha\)» очень затратно.

Чтобы смягчить эти проблемы, мы предлагаем трёхшаговую стратегию, снижающую вычислительную нагрузку и дающую точные решения. Сначала аппроксимируем целевую функцию CVaR\(_\alpha\) с помощью Kernel Ridge Regression (KRR). Затем минимизируем KRR-аппроксимацию; её минимум служит стартовой точкой для прямой минимизации целевой функции через Sequential Least Squares Programming (SLSQP).

Структура работы. Раздел 2 формализует задачу, описывая математику CPMM. Раздел 3 — обзор задания Challenge. Раздел 4 — детали нашего подхода. Раздел 5 — проверка предложения в рамках Challenge и смежных постановок. Раздел 6 — заключение.

2. Constant Product Market Maker

Цель раздела — дать интуицию работы CPMM и объяснить, почему традиционные подходы к минимизации CVaR здесь неприменимы. CPMM сохраняет постоянным произведение резервов монет в пуле. Пусть в пуле монеты X и Y с резервами \(R_X\) и \(R_Y\); после любого взаимодействия с пулом

\[ R_X R_Y = K \in \mathbb{R} \tag{1} \]
CPMM: начальное состояние, swap X→Y и mint
Рис. 1. Начальное состояние, swap токена X на Y и операция mint. Операция burn аналогична mint, но правило постоянного произведения смещается к осям, а не от них.

На рис. 1 — графическая иллюстрация правила постоянного произведения, swap X → Y и mint. Ниже — базовые операции AMM.

2.1. Swap

Swap — обмен LT токена X на Y или наоборот. Из (1), если LT обменивает \(x\) единиц X, количество Y равно

\[ R_X R_Y = \bigl(R_X + (1-\phi)x\bigr)\bigl(R_Y - y\bigr) \;\Longrightarrow\; y = x\,\frac{(1-\phi)R_Y}{R_X + (1-\phi)x} \tag{2} \]

где \(\phi\) — комиссия LT пулу. Комиссия не участвует в формировании цены, а полностью оседает в пуле и распределяется протоколом и LP. В отличие от рынков Uniswap [1, 2], в Challenge комиссия добавляется к резерву X и неявно вознаграждает LP — стоимость их доли пула растёт. После swap резервы обновляются:

\[ R_X \longrightarrow R_X + x \qquad\text{и}\qquad R_Y \longrightarrow R_Y - y \tag{3} \]

Если LT обменивает \(y\) единиц Y на \(x\) единиц X, аналогично:

\[ R_X R_Y = \bigl(R_X - x\bigr)\bigl(R_Y + (1-\phi)y\bigr) \;\Longrightarrow\; x = y\,\frac{(1-\phi)R_X}{R_Y + (1-\phi)y} \tag{4} \]

Резервы: \(R_X \longrightarrow R_X - x\), \(R_Y \longrightarrow R_Y + y\). Можно показать, что предельная (marginal) цена \(\lim_{y\to 0} y/x\) равна отношению резервов \(R_X/R_Y\).

2.2. Mint и burn

С точки зрения Challenge важнее поведение LP. Они могут добавить ликвидность (mint) или вывести токены (burn). При mint LP вносит \(x\) единиц X и \(y\) единиц Y так, чтобы не изменить marginal price:

\[ \frac{R_X + x}{R_Y + y} = \frac{R_X}{R_Y} \;\Longrightarrow\; \frac{x}{R_X} = \frac{y}{R_Y} \tag{6} \]

За ликвидность LP получает \(l\) LP coins:

\[ l = L\,\frac{x}{R_X} = L\,\frac{y}{R_Y} \tag{7} \]

где \(L\) — outstanding amount LP coins. При burn LP возвращает \(l\) LP coins и получает:

\[ x = R_X\,\frac{l}{L} \qquad\text{и}\qquad y = R_Y\,\frac{l}{L} \tag{8} \]

Реалистично предположить, что LP владеет только \(x\) единицами X. Перед mint он обменивает часть \((1-\psi)x\) на \(y\) единиц Y, \(\psi \in (0,1)\). Подставляя \((1-\psi)x\) в (2) и затем \(y\) в (6), получаем квадратное уравнение по \(\psi\); положительный корень задаёт объём обмена:

\[ \psi = 1 + \frac{1}{2}\left(1 - \sqrt{1 + \frac{4(1-\phi)x\,R_X}{(2-\phi)R_X^2}}\right) \tag{9} \]

По окончании инвестиционного периода LP сжигает токены и обменивает Y в наиболее выгодном пуле.

3. Задача Code Quest

Работаем с несколькими пулами. При \(n\) пулах \(R_X = (R_X^1, \ldots, R_X^n)\) — вектор резервов X; аналогично \(R_Y\), \(L\), \(l\). Отсюда видна сильная нелинейная зависимость доходности от начального распределения капитала: при условии, что после mint LP происходят только swap, веса портфеля \(\theta\) нелинейно влияют на состояние рынка до сделок (\(l, R_X, R_Y, L\)), что определяет состояние после сделок и конвертацию \(l \to x, y\), а также цену обратного обмена Y → X.

3.1. Формализация задачи минимизации

Задача Challenge — минимизировать CVaR\(_\alpha\) инвестиции при \(\alpha = 0{,}9\). Начальный капитал LP — \(x_0\) в монете X. LP распределяет долю капитала по \(n\) пулам. Веса портфеля лежат в допустимом множестве

\[ \mathcal{S} := \left\{\theta = (\theta_1, \ldots, \theta_n) \in [0,1]^n \;\middle|\; \sum_{j=1}^n \theta_j = 1\right\}, \qquad n = 6. \]

Выбор \(\theta\) влияет на число сгенерированных LP coins, вектор состояния пулов и итоговую (log) доходность \(r_T = r_T(\theta)\). Наиболее распространённая мера риска — Value at Risk (VaR), квантиль распределения убытков:

\[ \mathrm{VaR}_\alpha(r_T) = -\inf\{z \in \mathbb{R} \mid P(r_T \le z) \ge 1-\alpha\} \tag{10} \]

Внимание смещается к CVaR — среднему убытку за \(\alpha\)-квантилем:

\[ \mathrm{CVaR}_\alpha(r_T) = \frac{1}{1-\alpha}\int_\alpha^1 \mathrm{VaR}_s(r_T)\,ds \approx \mathbb{E}[-r_T \mid -r_T \ge \mathrm{VaR}_\alpha] \tag{11} \]

Чтобы подчеркнуть зависимость от \(\theta\), пишем CVaR\(_\alpha(\theta)\) вместо CVaR\(_\alpha(r_T)\). Нужно найти

\[ \hat\theta \in \arg\min_{\theta \in \mathcal{S}} \mathrm{CVaR}_\alpha(\theta) \tag{12} \]

при вероятностном ограничении

\[ P[r_T > \xi] > q \tag{13} \]

с \(\xi = 0{,}05\) и \(q = 0{,}8\). Это задача минимизации с линейными и нелинейными ограничениями равенства и неравенства. Эмпирически нелинейное вероятностное ограничение (13) автоматически выполняется при аппроксимации argmin для CVaR\(_\alpha\); по соображениям времени и сложности мы проверяем его только при оценке результатов, а не в ходе вычислений3.

3.2. Вычисление CVaR — процесс симуляции

Вычисление CVaR неизвестного распределения — трудная задача. В конкурсе CVaR\(_\alpha(\theta)\) аппроксимируется заменой математического ожидания в (11) выборочным средним по 1000 траекторий, генерируемых движком организаторов. Симуляция основана на допущениях: в пулах возможны только swap; направление (X→Y или Y→X) выбирается случайно без зависимости от состояния пула; число приходов — пуассоновское; объёмы swap — log-normal.

Далее, если не указано иное, работаем с векторами размерности \(n+1\): нулевая компонента — общее событие по всем пулам; компонента \(j \ge 1\) — \(j\)-й пул. Входной параметр — кортеж \((\kappa, p, \sigma, T, B)\):

Пулы описываются классом pools с атрибутами Rx, Ry и модулями swap_x_to_y, swap_y_to_x. Псевдокод симуляции — алгоритм 1.

Алгоритм 1. Симуляционная процедура организаторов Challenge
Вход: self, κ, p, σ, T, B.
Выход: pools, Rx_t, Ry_t, v_t, event_type_t, event_direction_t.
1: Инициализировать выходные списки.
2: for k ← 1 to B do
3:     K ← Σ_j κ_j; N ~ Poisson(KT).
4:     curr_pools ← self.
5:     event_type, event_direction ← нулевые векторы длины N.
6:     Rx, Ry, v ← нулевые матрицы N×n.
7:     for m ← 1 to N do
8:         j_m ~ Categorical(κ_0/K, …, κ_n/K).
9:         d_m ~ Bernoulli(p_{j_m}).
10:        if d_m = 0 then μ ← 0; else μ ← log(Rx/Ry).
11:        if j_m = 0 then vol_j ~ LogN(μ_j, σ_j) ∀j;
            else vol_{j_m} ~ LogN(μ_{j_m}, σ_{j_m}), остальные 0.
12:        if d_m = 0 then swap X→Y; else swap Y→X.
13:    end for
14:    Добавить признаки траектории в выходные списки.
15: end for

На каждой траектории число событий — Poisson с параметром \(T\sum_j \kappa_j\). Для \(m\)-го события тип \(j_m\) (0 — swap во всех пулах, \(1 \le j_m \le n\) — конкретный пул) выбирается по нормированным \(\kappa_j\); направление \(d_m \sim \mathrm{Bernoulli}(p_{j_m})\). Drift log-объёма:

\[ d_m = 0 \Longrightarrow \mu = 0; \qquad d_m = 1 \Longrightarrow \mu = \log\frac{R_X}{R_Y} \tag{14} \]

Объём — \(n\)-мерный вектор (формула (15) в оригинале). Затем выполняется swap. Выходы модуля simulate делятся на зависящие от начального состояния (pools, Rx_t, Ry_t, v_t) и независимые (event_type_t, event_direction_t). При минимизации CVaR симуляцию нужно вызывать многократно с разными начальными состояниями — мы генерируем независимый выход один раз и переиспользуем его, подставляя state-dependent переменные.

Пример симулированной траектории
Рис. 2. Пример симулированной траектории при параметрах Challenge. Слева — резервы X (\(R_X\)); в центре — резервы Y (\(R_Y\)); справа — marginal price.

4. Наш подход

В контексте конкурса минимизация CVaR\(_\alpha\) осложняется нелинейной зависимостью от входа и высокой стоимостью оценки из-за симуляции. Мы проектируем трёхшаговый подход: сначала KRR-аппроксимация целевой функции, затем её минимизация, наконец прямая оптимизация CVaR\(_\alpha\) с найденной стартовой точкой.

4.1. Kernel Ridge Regression

Kernel Ridge Regression [16] — линейная регрессия с обработкой входов через ядро \(K\). По датасету \(\{(\theta^{(i)}, \mathrm{CVaR}_\alpha^{(i)})\}_{i=1}^N\) аппроксимирующая функция:

\[ f(\theta; \alpha) = \sum_{i=1}^N \alpha_i K(\theta, \theta^{(i)}), \qquad K(\theta, \theta^{(i)}) = -\sum_{j=1}^n \frac{(\theta_j - \theta_j^{(i)})^2}{\theta_j + \theta_j^{(i)}} \tag{16} \]

(аддитивное \(\chi^2\)-ядро). Потери — MSE с L2-регуляризацией коэффициентов; есть замкнутая формула подгонки. Используется sklearn.kernel_ridge.KernelRidge.

Графическая схема трёхшагового подхода
Рис. 3. Графическая схема подхода к Challenge. Сэмплирование случайных чисел — единственная часть на Python; ядро выполняется в Cython для ускорения.

4.2. Sequential Least Square Programming

SLSQP [17] — распространённый метод нелинейной оптимизации с равенственными и неравенственными ограничениями и неконvexными целевыми функциями. На шаге \(k\) задача аппроксимируется квадратичным программированием:

\[ \min_d \;\; \frac{1}{2}\Bigl[\mathrm{CVaR}_\alpha(\theta^{(k)}) + \nabla\mathrm{CVaR}_\alpha(\theta^{(k)})^T d + d^T \nabla^2_{\theta\theta} L(\theta^{(k)}, \lambda^{(k)}, \sigma^{(k)})\, d\Bigr] \tag{17} \]

с лагранжианом

\[ L(\theta, \lambda, \sigma) = \mathrm{CVaR}_\alpha(\theta) - \lambda^T \theta - \sigma\bigl(1 - \mathbf{1}^T \theta\bigr) \tag{18} \]

и ограничениями

\[ \theta^{(k)} + I_n d \ge 0, \qquad 1 - \mathbf{1}^T \theta^{(k)} - \mathbf{1}^T d = 0 \tag{19} \]

4.3. Трёхшаговая минимизация CVaR

Стратегия суммирована на рис. 3. Прямая оптимизация (11) слишком дорога: каждая итерация требует полной симуляции. Решение — многошаговая минимизация: сначала обучить дешёвую аппроксимацию \(f(\theta)\), минимизировать её, затем уточнить SLSQP на исходной CVaR\(_\alpha(\theta)\).

Обычно для аппроксимации используют нейросеть [5], но генерация обучающего датасета может быть столь же дорогой, как прямая оптимизация. Мы применяем линейные модели (KRR): при правильной спецификации достаточно небольшого датасета. Критичен размер \(N\): мы использовали \(N = 10\) — при \(R^2 \approx 0{,}995\). Датасет \(\{(\theta^{(i)}, \mathrm{CVaR}_\alpha^{(i)})\}\) строится случайной выборкой \(\theta^{(i)}\); коэффициенты \(\hat\gamma\) находятся минимизацией MSE (20). Создание датасета легко параллелизуется.

\[ \hat\gamma = \arg\min_\gamma \sum_{i=1}^N \bigl(f(\theta^{(i)}; \gamma) - \mathrm{CVaR}_\alpha^{(i)}\bigr)^2 \tag{20} \]

На втором шаге KRR минимизируется SLSQP из равновесного портфеля:

\[ \hat\theta_{\mathrm{app}} = \arg\min_{\theta \in \mathcal{S}} f(\theta; \hat\gamma) \tag{21} \]

Из-за низкой стоимости KRR этот шаг занимает доли секунды. Минимальный CVaR\(_\alpha\) в обучающей выборке — \(-0{,}46\%\), а \(\mathrm{CVaR}_\alpha(\hat\theta_{\mathrm{app}}) = -0{,}37\%\) — KRR обобщает, а не копирует данные.

На третьем шаге \(\hat\theta_{\mathrm{app}}\) — стартовая точка прямой минимизации CVaR\(_\alpha(\theta)\) через SLSQP.

4.4. Cython

Cython [4] компилирует Python-код в нативные C-расширения, сочетая гибкость Python с эффективностью C за счёт статической типизации. Процедура компиляции — алгоритм 2.

Алгоритм 2. Компиляция Python-кода с Cython
1: Создать файл .pyx.
2: Записать Python-код в .pyx.
3: Добавить статические типы для каждой переменной.
4: Скомпилировать: python setup.py build_ext --inplace
5: Импортировать скомпилированное расширение в Python-скрипт.

Cython ускоряет исполнение, но в Challenge по-разному обрабатывает генерацию случайных чисел numpy vs Python, что могло бы сместить оценку относительно других команд. Мы генерируем все случайные числа до вызова Cython (массивы event_type_t, event_direction_t из разд. 3.2) и загружаем их при компиляции — это сокращает время почти на 20%.

5. Экспериментальные результаты

Сравниваем предложение команды QuantHub с конкурентами: сначала в среде Challenge, затем при варьировании параметров симуляции.

5.1. Результаты Challenge

Используем рыночные параметры и random seed организаторов и те же метрики. Сравниваем с Finatics [11], Elagnitram [10] (единственные публичные репозитории) и Blanco (финалист, поделившийся отчётом; точного кода нет). Подходы конкурентов — приложение A. Параметры:

\[ \kappa = (0{,}25, 0{,}5, 0{,}5, 0{,}45, 0{,}45, 0{,}4, 0{,}3),\quad p = (0{,}45, 0{,}45, 0{,}4, 0{,}38, 0{,}36, 0{,}34, 0{,}3), \] \[ \sigma = (1, 0{,}3, 0{,}5, 1, 1{,}25, 2, 4),\quad \text{random seed} = 4294967143 \tag{22} \]
Таблица 1. Итоги Challenge: оптимальное \(\hat\theta\), ограничение \(P[r_T > \xi]\) и CVaR\(_\alpha\).
\(\hat\theta\)\(P[r_T > \xi]\)CVaR\(_\alpha\)
Blanco[0.1308, 0.2480, 0.2209, 0.1438, 0.2394, 0.0173]0.847−0.376%
Finatics[0.1597, 0.3029, 0.1901, 0.1168, 0.2304, 0.0000]0.847−0.364%
Elagnitram[0.1749, 0.1643, 0.1498, 0.1822, 0.2272, 0.1016]0.840−0.460%
QuantHub[0.1285, 0.2956, 0.1897, 0.1568, 0.2294, 0.0000]0.846−0.3627%

QuantHub и Finatics минимизируют долю капитала в последнем (шестом) пуле — на порядки меньше остальных. Это согласуется с Cartea et al. [7]: предсказуемые убытки LP в CPMM пропорциональны волатильности цены; у шестого пула наибольшая \(\sigma\). При переносе \(\sigma\) пятого пула на 4 (как у шестого) оптимальный вес пятого пула падает ~35%; QuantHub находит \(\hat\theta = [0.124, 0.441, 0.216, 0.148, 0.0, \ldots]\).

Ablation study (табл. 2): сравниваем полный QuantHub с отдельными шагами KRR и SLSQP (старт — равные веса) и randomized Grid Search (10 000 случайных стартов).

Таблица 2. Ablation: Grid Search, KRR, SLSQP и полный QuantHub.
Grid SearchKRRSLSQPQuantHub
\(P[r_T > \xi]\)84.50%84.20%84.50%84.60%
\(\mathbb{E}[r_T]\)16.0985%16.1744%16.1306%16.1250%
\(\mathrm{VaR}_\alpha\)3.1832%3.2228%3.2196%3.2237%
CVaR\(_\alpha\)−0.3693%−0.3731%−0.3632%−0.3627%
\(\hat\theta\)[0.11057, 0.34389, …][0.14408, 0.29763, …][0.12360, 0.29529, …][0.12848, 0.29556, …]

Оптимальные \(\hat\theta\) близки; полная процедура QuantHub немного лучше по CVaR. KRR один даёт CVaR на 2,7% хуже — шаг SLSQP критичен для точности.

5.2. Эксперименты по стабильности

100 различных random seed. Elagnitram иногда не сходится. Табл. 3 — среднее ± стандартное отклонение.

Таблица 3. QuantHub vs Finatics vs Elagnitram (100 seed).
QuantHubFinaticsElagnitram
\(P[r_T > \xi]\) (%)81.15 ± 1.0281.17 ± 1.0181.5 ± 0.91
\(\mathbb{E}[r_T]\)0.1686 ± 0.01140.1686 ± 0.01140.1691 ± 0.0105
\(\mathrm{VaR}_\alpha\)0.021 ± 0.00250.0209 ± 0.00240.0197 ± 0.0029
CVaR\(_\alpha\)−0.0145 ± 0.0029−0.0145 ± 0.0029−0.0152 ± 0.0035
Время (с)65.9 ± 18.71053.4 ± 23.4155.1 ± 62.7

QuantHub и Finatics по точности почти равны; QuantHub более чем в 15 раз быстрее. Elagnitram немного быстрее QuantHub, но CVaR хуже в среднем на 4,5%+; Elagnitram лучше по средней доходности, но хуже по целевым риск-метрикам.

5.3. Обобщаемость

Меняем горизонт \(T \in \{40, 50, 60, 70, 80\}\) и уровень \(\alpha \in \{0.85, 0.875, 0.9, 0.925, 0.95\}\) (10 экспериментов × 50 seed). Табл. 4 — среднее ± σ для CVaR\(_\alpha\), ограничения и времени.

Таблица 4. Сравнение при варьировании \(T\) и \(\alpha\) (50 seed на эксперимент).
\(T\)4050607080
CVaR\(_\alpha\) ·10−1, QuantHub−0.367 ± 0.038−0.266 ± 0.029−0.153 ± 0.022−0.019 ± 0.0320.103 ± 0.043
\(P[r_T>\xi]\) %, QuantHub63.18 ± 48.23274.22 ± 43.74280.7 ± 39.46586.7 ± 33.95790.1 ± 29.866
time (s), QuantHub178 ± 56208 ± 64234 ± 86247 ± 94355 ± 120
CVaR\(_\alpha\) ·10−1, Finatics−0.367 ± 0.038−0.266 ± 0.029−0.153 ± 0.022−0.019 ± 0.0310.103 ± 0.043
time (s), Finatics2250 ± 3414416 ± 6834869 ± 11315149 ± 15135936 ± 1674

При росте \(T\) оптимальный CVaR почти линейно растёт — положительный дрейф wealth LP от комиссий LT. Время растёт с числом событий; у QuantHub и Elagnitram резкий скачок при переходе \(T\): 70 → 80. По \(\alpha\) CVaR QuantHub и Finatics близки; QuantHub существенно быстрее.

6. Заключение

Работа описывает наш подход к SIAG/FME Code Quest 2023: статическая инвестиционная стратегия минимизации CVaR при предоставлении ликвидности в нескольких пулах DEX. Участникам дан симуляционный движок прихода ордеров; начальное распределение капитала меняет распределение итоговых доходностей и CVaR. Наш подход: (1) KRR-аппроксимация целевой функции; (2) минимизация KRR для стартовой точки; (3) уточнение SLSQP. Ablation study и сравнение с Grid Search подтверждают качество найденной точки. Экспериментально QuantHub достигает лучшего или сопоставимого CVaR при низком времени вычислений; робастность проверена варьированием параметров конкурса.

Ограничение — упрощённый движок Challenge: нет учёта арбитража, события не зависят от состояния пулов. Интересно перенести подход на рынки Uniswap и улучшить движок статистическими или generative моделями. Дальнейшее развитие — Concentrated Liquidity Uniswap v3 [2] и полная постановка с Impermanent Loss [12].

Благодарности. Комитету Quest за возможность; Gianluca Palmari за ценные советы; профессорам Fabrizio Lillo и Piero Mazzarisi за помощь.

Приложение A — Подходы конкурентов

A.1. Blanco

Псевдокод — алгоритм 3; generate_market симулирует траектории. На каждой итерации — 1000 путей \(r_T^{(j)}\), обновление аппроксимации градиентным спуском.

Алгоритм 3. Алгоритм Blanco
Данные: N_pools, N_batch, R_X, R_Y, α, γ, q, ζ, κ, σ, θ, ω, β, N_iter, N_GD.
1: w_1 ← w
2: for i ← 1 to N_iter do
3:     (x̃, ỹ, R_X, R_Y, φ) ← generate_market(w_i)
4:     for j ← 1 to N_GD do
5:         x̄_burn, ȳ_burn ← burn при весах θ̃_j ⊙ θ_{i-1}
6:         x̄_swap ← обмен ȳ по формуле CPMM
7:         r̄ ← log(x̄_burn + x̄_swap) − log(x_0)
8:         ℓ ← ω_1 ℓ_1 + ω_2 ℓ_2 + ω_3 ℓ_3 + ω_4 ℓ_4
9:         θ̃_{j+1} ← θ̃_j − β ∇_{θ̃_j} ℓ
10:    end for
11:    w_{i+1} ← θ̃_{N_GD+1}
12: end for
13: return w_{N_iter+1}

Суммарный loss \(\ell(\theta, r) = \omega_1 \ell_1 + \omega_2 \ell_2 + \omega_3 \ell_3 + \omega_4 \ell_4\), где \(\ell_1\) — sigmoid-штраф за нарушение вероятностного ограничения, \(\ell_2\) — ReLU на отрицательных весах, \(\ell_3\) — штраф за \(\sum \theta_i \ne 1\), \(\ell_4\) — CVaR\(_\alpha\). Стартовые веса — по рентабельности стратегии «весь капитал в одном пуле», равномерно между тремя лучшими пулами.

A.2. Finatics

Stochastic Gradient Descent с проекцией на \(\mathcal{S}\) (алгоритм 4). Вероятностное ограничение не принуждают активно — оно не нарушается, как и у нас.

Алгоритм 4. Алгоритм Finatics
Требуется: N_iter.
1: Случайно инициализировать θ^(1) ∈ K
2: for n = 1, …, N_iter do
3:     Симулировать 1000 доходностей при θ_n; вычислить CVaR
4:     g_n ← ∇_θ CVaR(θ_n)
5:     θ_{n+1} ← proj_S(θ_n − η g_n)
6: end for
7: return θ с минимальным CVaR, удовлетворяющий ограничению

A.3. Elagnitram

Gradient Descent; из-за \(\sum_i \theta_i = 1\) оптимизируют пять из шести весов. Большое внимание ограничению \(P[r_T > \xi] > q\): константы \(\delta_1 < \delta_2\), \((1-q)\)-квантиль \(\psi\) доходностей — три режима (нарушено / выполнено / «погранично») с разными направлениями обновления. Используют аппроксимированную динамику пулов для ускорения; на каждом шаге проверяют положительность весов и сумму 1. Подробности — [10].

Литература

Оригинал статьи: Di Nosse and Gatta, «A Multi-Step Approach for Minimizing Risk in Decentralized Exchanges», arXiv:2406.07200

3 В нашей постановке реализация вероятностного ограничения не создаёт концептуальных или алгоритмических трудностей.