Многошаговый подход к минимизации риска на децентрализованных биржах
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} \]
На рис. 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)\):
- \(\kappa = (\kappa_0, \ldots, \kappa_n)\) — интensities приходов. В нашем случае \(\kappa = (0{,}25, 0{,}5, 0{,}5, 0{,}45, 0{,}45, 0{,}4, 0{,}3)\).
- \(p = (p_0, \ldots, p_n)\) — вероятность swap X→Y (вместо Y→X), зависит от пула: \(p = (0{,}45, 0{,}45, 0{,}4, 0{,}38, 0{,}36, 0{,}34, 0{,}3)\).
- \(\sigma = (\sigma_0, \ldots, \sigma_n)\) — стандартное отклонение log-объёма swap по пулам: \(\sigma = (1, 0{,}3, 0{,}5, 1, 1{,}25, 2, 4)\).
- \(T = 60\) — горизонт симуляции.
- \(B = 1000\) — число траекторий.
Пулы описываются классом 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 переменные.
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.
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} \]| \(\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 случайных стартов).
| Grid Search | KRR | SLSQP | QuantHub | |
|---|---|---|---|---|
| \(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 — среднее ± стандартное отклонение.
| QuantHub | Finatics | Elagnitram | |
|---|---|---|---|
| \(P[r_T > \xi]\) (%) | 81.15 ± 1.02 | 81.17 ± 1.01 | 81.5 ± 0.91 |
| \(\mathbb{E}[r_T]\) | 0.1686 ± 0.0114 | 0.1686 ± 0.0114 | 0.1691 ± 0.0105 |
| \(\mathrm{VaR}_\alpha\) | 0.021 ± 0.0025 | 0.0209 ± 0.0024 | 0.0197 ± 0.0029 |
| CVaR\(_\alpha\) | −0.0145 ± 0.0029 | −0.0145 ± 0.0029 | −0.0152 ± 0.0035 |
| Время (с) | 65.9 ± 18.7 | 1053.4 ± 23.4 | 155.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\), ограничения и времени.
| \(T\) | 40 | 50 | 60 | 70 | 80 |
|---|---|---|---|---|---|
| CVaR\(_\alpha\) ·10−1, QuantHub | −0.367 ± 0.038 | −0.266 ± 0.029 | −0.153 ± 0.022 | −0.019 ± 0.032 | 0.103 ± 0.043 |
| \(P[r_T>\xi]\) %, QuantHub | 63.18 ± 48.232 | 74.22 ± 43.742 | 80.7 ± 39.465 | 86.7 ± 33.957 | 90.1 ± 29.866 |
| time (s), QuantHub | 178 ± 56 | 208 ± 64 | 234 ± 86 | 247 ± 94 | 355 ± 120 |
| CVaR\(_\alpha\) ·10−1, Finatics | −0.367 ± 0.038 | −0.266 ± 0.029 | −0.153 ± 0.022 | −0.019 ± 0.031 | 0.103 ± 0.043 |
| time (s), Finatics | 2250 ± 341 | 4416 ± 683 | 4869 ± 1131 | 5149 ± 1513 | 5936 ± 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].
Литература
- [1] H. Adams, N. Zinsmeister, and D. Robinson. Uniswap v2 core, 2020.
- [2] H. Adams, N. Zinsmeister, M. Salem, R. Keefer, and D. Robinson. Uniswap v3 core. Tech. rep., Uniswap, 2021.
- [3] L. S. Alotaibi and S. S. Alshamrani. Smart contract: Security and privacy. Computer Systems Science & Engineering, 38(1), 2021.
- [4] S. Behnel et al. Cython: The best of both worlds. Computing in Science & Engineering, 13(2):31–39, 2010.
- [5] P. Büchel et al. Deep calibration of financial models. Review of Derivatives Research, 1–28, 2022.
- [6] Á. Cartea, F. Drissi, and M. Monga. Decentralised finance and automated market making: Predictable loss and optimal liquidity provision. arXiv:2309.08431, 2023.
- [7] Á. Cartea, F. Drissi, and M. Monga. Predictable losses of liquidity provision in constant function markets and concentrated liquidity markets. Applied Mathematical Finance, 30(2):69–93, 2023.
- [8] DefiLlama. https://defillama.com, 2023.
- [9] D. M. Di Nosse and F. Gatta. QuantHub Code Repository. https://github.com/DanieleMDiNosse/SIAM_code_challange, 2024.
- [10] elagnitram. elagnitram Code Repository. https://github.com/Jue-Edin/elagnitram, 2024.
- [11] T. N. Hai and L. N. Tuan. Finatics Code Repository. https://github.com/hitwooo/siag-fme24, 2024.
- [12] L. Heimbach, E. Schertenleib, and R. Wattenhofer. Risks and returns of uniswap v3 liquidity providers. AFT, 89–101, 2022.
- [13] P. Krokhmal, J. Palmquist, and S. Uryasev. Portfolio optimization with conditional value-at-risk objective and constraints. Journal of Risk, 4, 2003.
- [14] R. T. Rockafellar, S. Uryasev, et al. Optimization of conditional value-at-risk. Journal of risk, 2:21–42, 2000.
- [15] F. Schär. Decentralized finance: On blockchain-and smart contract-based financial markets. FRB of St. Louis Review, 2021.
- [16] V. Vovk. Kernel ridge regression. In Empirical Inference: Festschrift in Honor of Vladimir N. Vapnik, 105–116. Springer, 2013.
- [17] S. J. Wright. Numerical optimization. 2006.
Оригинал статьи: Di Nosse and Gatta, «A Multi-Step Approach for Minimizing Risk in Decentralized Exchanges», arXiv:2406.07200
3 В нашей постановке реализация вероятностного ограничения не создаёт концептуальных или алгоритмических трудностей.