← К списку статей
July 18, 2026
5 мин. чтения

Uniswap v3 для квантов: концентрированная ликвидность и математика тиков с нуля

Uniswap v3 для квантов: концентрированная ликвидность и математика тиков с нуля
#uniswap
#defi
#amm
#концентрированная ликвидность
#маркетмейкинг
#lvr
#квант
#ethereum

Позиция LP в Uniswap v3 — это замаскированный диапазонный ордер из книги лимитных заявок. Внесите ликвидность между двумя ценами — и вы обязались покупать актив по мере его падения через ваш диапазон и продавать по мере роста, ровно то, что делает сетка отложенных лимитных ордеров на CLOB. Но контракт не хранит ни цен, ни количеств, ни книги ордеров. Он хранит три числа: квадратный корень из цены в формате с фиксированной точкой Q64.96, целочисленный индекс тика и агрегированное значение ликвидности LL. Если вы хотите рассуждать о позиции v3 так же, как вы рассуждали бы о котировках в модели маркетмейкинга — инвентарь, цены исполнения, неблагоприятный отбор, — вам нужно уметь переводить между этими ончейн-примитивами и торговыми концепциями, которые они кодируют. Эта статья строит такой перевод с нуля, следуя вайтпейперу Uniswap v3 (Adams, Zinsmeister, Salem, Keefer, Robinson, 2021) и основным контрактам, и заканчивается там, где сейчас начинается любое серьезное обсуждение LP: loss-versus-rebalancing.

От x·y = k к виртуальным резервам

Uniswap v2 — это маркетмейкер с постоянным произведением: пул держит резервы xx токена0 и yy токена1 и на каждом свапе поддерживает

xy=kx \cdot y = k

Маржинальная цена токена0 в единицах токена1 равна P=y/xP = y/x, а ликвидность равномерно размазана по всей ценовой оси (0,)(0, \infty). Это крайне неэффективно по капиталу: пара стейблкоинов, торгующаяся между 0.999 и 1.001, держит более 99% своего капитала на ценах, которые никогда не напечатаются.

Ход v3 состоит в том, чтобы позволить каждому LP ограничить свой капитал диапазоном [pa,pb][p_a, p_b]. Внутри диапазона позиция должна вести себя ровно как пул v2 — та же бондинг-кривая, то же маржинальное ценообразование, — но используя только те резервы, которые нужны для покрытия этого диапазона. Вайтпейпер формализует это через виртуальные резервы: позиция ведет себя так, будто держит резервы в стиле v2 (xv,yv)(x_v, y_v), лежащие на кривой xvyv=L2x_v \cdot y_v = L^2, тогда как реальные резервы — это виртуальные минус то, что позиция держала бы на границах диапазона:

(x+Lpb)(y+Lpa)=L2\left(x + \frac{L}{\sqrt{p_b}}\right)\left(y + L\sqrt{p_a}\right) = L^2

Это уравнение 2.2 вайтпейпера, и это единственное самое важное уравнение в v3. Сдвинутая кривая касается осей: при P=pbP = p_b реальный резерв xx достигает нуля (позиция на 100% в токене1), а при P=paP = p_a реальный резерв yy достигает нуля (100% токена0). За пределами диапазона позиция становится инертной — фиксированный набор одного токена, не приносящий ничего.

Кривая постоянного произведения Uniswap v2 в сравнении со сдвинутой кривой v3, показывающая виртуальные и реальные резервы

Параметр LL, называемый ликвидностью, — это инвариант, заменяющий kk. Он определяется как L=kL = \sqrt{k}, и у него есть чистая интерпретация, которую вайтпейпер делает явной: ликвидность — это "виртуальные резервы на единицу квадратного корня из цены". При любой цене PP внутри диапазона виртуальные резервы равны

xv=LP,yv=LPx_v = \frac{L}{\sqrt{P}}, \qquad y_v = L\sqrt{P}

Почему переменная состояния — это √P

Ядро v3 не отслеживает цену. Оно отслеживает P\sqrt{P}, хранимую как sqrtPriceX96 — беззнаковое число с фиксированной точкой Q64.96:

sqrtPriceX96=P296\texttt{sqrtPriceX96} = \sqrt{P} \cdot 2^{96}

где PPсырая цена: базовые единицы токена1 на базовую единицу токена0, с учетом десятичных знаков (об этом ниже). Причина использования квадратного корня — не экономия газа, а алгебра. Продифференцируйте тождества для виртуальных резервов, и вы получите два фундаментальных уравнения свапа, реализованных в библиотеке SqrtPriceMath:

Δy=LΔP,Δx=LΔ ⁣(1P)\Delta y = L \cdot \Delta\sqrt{P}, \qquad \Delta x = L \cdot \Delta\!\left(\frac{1}{\sqrt{P}}\right)

Обе дельты токенов линейны по квадратному корню из цены (или обратному ему), с LL в роли коэффициента пропорциональности. Поэтому свап внутри одного тика не требует ни обращения кривой, ни итераций Ньютона — только одно умножение, чтобы сдвинуть P\sqrt{P}, затем два умножения, чтобы вычислить суммы. Когда свап достаточно велик, чтобы толкнуть цену через инициализированный тик, пул пересекает его, добавляет или убирает чистую ликвидность, привязанную к нему (liquidityNet), и продолжает с новым агрегированным LL. Глобально пул — это кусочно-постоянно-произведенческий AMM: постоянное LL между инициализированными тиками, скачки на тиках.

Для маркетмейкера это правильная ментальная модель: профиль агрегированной ликвидности пула L(P)L(P) — это DEX-эквивалент глубины книги ордеров. Где глубина CLOB котируется в единицах на ценовой уровень, глубина AMM — это LL на тик, и перевод — это ровно тождество Δy=LΔP\Delta y = L\Delta\sqrt{P} выше.

Тики: логарифмически размеченная ценовая сетка

Диапазоны не могут начинаться и заканчиваться на произвольных ценах; они должны прилипать к тикам. Тик ii соответствует цене

p(i)=1.0001ip(i)=1.0001i/2p(i) = 1.0001^i \quad\Longrightarrow\quad \sqrt{p(i)} = 1.0001^{i/2}

так что каждый тик отстоит от соседей на один базисный пункт — не в абсолютном, а в относительном выражении. Эта логарифмическая разметка сделана намеренно: фиксированная аддитивная сетка была бы абсурдно грубой для токена, торгующегося по $0.0001, и абсурдно мелкой при $100{,}000, тогда как геометрическая сетка дает равномерное разрешение 1 б.п. на любом ценовом масштабе. Библиотека TickMath конвертирует в обе стороны — getSqrtRatioAtTick и getTickAtSqrtRatio — используя битовые операции над предвычисленными константами вместо вызова экспоненты. Индексы тиков ограничены значениями MIN_TICK = -887272 и MAX_TICK = 887272, что покрывает ценовой диапазон [2128,2128][2^{-128}, 2^{128}]: достаточно широкий для любой пары токенов, которая может существовать в арифметике uint256.

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

Уровень комиссии Шаг тика Мин. ширина диапазона Типичное применение
0.01% 1 ~1 б.п. стейбл/стейбл
0.05% 10 ~10 б.п. стейбл-пары, ETH/стейблы
0.30% 60 ~60 б.п. мейджоры
1.00% 200 ~2% экзотика / волатильные

Уровни 0.05%/0.30%/1% появились на запуске в мае 2021 года; уровень 0.01% был добавлен голосованием управления в ноябре 2021 года. Более грубый шаг на пулах с высокой комиссией удерживает число потенциально пересекаемых тиков и газовые затраты на свап в ограниченных рамках.

Одна ловушка десятичных знаков, на которую однажды попадается каждый: сырая ончейн-цена — это токен1 на токен0 в базовых единицах. В майннет-пуле USDC/WETH токен0 — это USDC (6 знаков), а токен1 — WETH (18 знаков), так что человеческая цена $3{,}000 за ETH соответствует сырой цене 1012/30003.333×10810^{12}/3000 \approx 3.333 \times 10^{8} WETH-wei на единицу USDC, которая живет на тике

i=log1.0001 ⁣(3.333×108)=196,256i = \left\lfloor \log_{1.0001}\!\left(3.333\times10^{8}\right) \right\rfloor = 196{,}256

с sqrtPriceX961.4465×1033\texttt{sqrtPriceX96} \approx 1.4465 \times 10^{33}. Если ваш дашборд мониторинга показывает тик около 196k для USDC/WETH, теперь вы знаете почему — и что человеческая цена равна (sqrtPriceX96/296)210dec0dec1\left(\texttt{sqrtPriceX96}/2^{96}\right)^2 \cdot 10^{\,\text{dec}_0 - \text{dec}_1} с обращением по необходимости.

Количества токенов из (L, ценового диапазона): точные формулы

Основной результат этого раздела: дана позиция с ликвидностью LL на [pa,pb][p_a, p_b] и текущей ценой PP — что она держит? Интегрирование уравнений свапа по диапазону дает три случая:

Цена ниже диапазона (PpaP \le p_a) — позиция на 100% в токене0:

x=L(1pa1pb),y=0x = L\left(\frac{1}{\sqrt{p_a}} - \frac{1}{\sqrt{p_b}}\right), \qquad y = 0

Цена выше диапазона (PpbP \ge p_b) — позиция на 100% в токене1:

x=0,y=L(pbpa)x = 0, \qquad y = L\left(\sqrt{p_b} - \sqrt{p_a}\right)

Цена внутри диапазона (pa<P<pbp_a < P < p_b):

x=L(1P1pb),y=L(Ppa)x = L\left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{p_b}}\right), \qquad y = L\left(\sqrt{P} - \sqrt{p_a}\right)

Это ровно то, что вычисляют SqrtPriceMath.getAmount0Delta и getAmount1Delta (с направленным округлением — контракт всегда округляет против пользователя, деталь, которая важна, если вы воспроизводите это в бэктестере и удивляетесь расхождениям на уровне wei).

from math import sqrt

def position_amounts(L: float, pa: float, pb: float, P: float):
    """Token amounts held by a v3 position (float model; core uses Q96 ints)."""
    sa, sb, sp = sqrt(pa), sqrt(pb), sqrt(P)
    if P <= pa:
        return L * (1/sa - 1/sb), 0.0
    if P >= pb:
        return 0.0, L * (sb - sa)
    return L * (1/sp - 1/sb), L * (sp - sa)

Разобранный пример: ETH/USDC, диапазон [2500, 3500]

Предположим, ETH торгуется по P=3000P = 3000 USDC, и вы хотите внести 1 ETH в диапазон [2500,3500][2500, 3500]. Квадратные корни: 2500=50\sqrt{2500} = 50, 3000=54.7723\sqrt{3000} = 54.7723, 3500=59.1608\sqrt{3500} = 59.1608.

Плечо ETH фиксирует LL:

L=xPpbpbP=1×54.7723×59.160859.160854.7723=738.37L = \frac{x \cdot \sqrt{P}\,\sqrt{p_b}}{\sqrt{p_b} - \sqrt{P}} = \frac{1 \times 54.7723 \times 59.1608}{59.1608 - 54.7723} = 738.37

Плечо USDC тогда следует из:

y=L(Ppa)=738.37×(54.772350)=3,523.69 USDCy = L\left(\sqrt{P} - \sqrt{p_a}\right) = 738.37 \times (54.7723 - 50) = 3{,}523.69 \text{ USDC}

Итак, минтинг этой позиции требует 1 ETH + 3,523.69 USDC, общей стоимостью $6,523.69, и обратите внимание, что плечи не 50/50 — распределение зависит от того, где PP сидит внутри диапазона (асимметричный диапазон — это ровно способ выразить направленный взгляд или разместить чистый "диапазонный ордер" одним токеном).

Теперь проведем цену к границам:

  • При P=2500P = 2500 позиция полностью конвертировалась в ETH: x=738.37×(1/501/59.1608)=2.2867x = 738.37 \times (1/50 - 1/59.1608) = 2.2867 ETH стоимостью $5,716.68. Вы купили 1.2867 ETH по мере падения по средневзвешенной по ликвидности цене 3523.69 / 1.2867 \approx \2{,}739$.
  • При P=3500P = 3500 она полностью конвертировалась в USDC: y=738.37×(59.160850)=6,764.06y = 738.37 \times (59.1608 - 50) = 6{,}764.06 USDC. Вы продали свой ETH по мере роста в среднем по $3,240.

Вот прочтение диапазонного ордера, доведенное до конкретики: позиция и есть лестница бидов от 3000 вниз до 2500 и асков от 3000 вверх до 3500, с размером на тик, пропорциональным LL. И концентрация — это то, за что вам платят: полнодиапазонная позиция в стиле v2 с теми же $6,523.69 капитала имела бы Lv2=V/(2P)=59.55L_{v2} = V/(2\sqrt{P}) = 59.55 — концентрированная позиция котирует в 12.4× больше глубины на тик и (пока в диапазоне) зарабатывает комиссии по ставке в 12.4× выше на доллар капитала.

Учет комиссий: feeGrowthGlobal и feeGrowthInside

Комиссии v3 не капитализируются в позицию (намеренный разрыв с v2, где комиссии реинвестировались в k\sqrt{k}). Они накапливаются рядом, по каждому токену, и этот учет — маленький шедевр бухгалтерии за O(1)O(1), который стоит понять, потому что каждый пайплайн LP-аналитики переизобретает его.

Пул поддерживает два глобальных аккумулятора, feeGrowthGlobal0X128 и feeGrowthGlobal1X128: кумулятивные комиссии на единицу ликвидности с момента создания пула, в формате с фиксированной точкой Q128.128. На каждом свапе сумма комиссии (взятая из входного токена) делится на текущую в-диапазоне LL и добавляется к аккумулятору. Это механизм, лежащий за кардинальным правилом экономики v3: комиссии начисляются только той ликвидности, которая находится в диапазоне в момент свапа. Позиции вне диапазона — не просто инертный инвентарь: они зарабатывают ровно ноль, пока неактивны.

Чтобы приписать нужную часть глобального роста конечному диапазону, каждый инициализированный тик ii хранит feeGrowthOutside0/1X128 — рост комиссий, произошедший по другую сторону тика относительно текущей цены (значение переворачивает интерпретацию каждый раз, когда тик пересекается, что и делает схему O(1)O(1)). Тогда для позиции на [i,iu][i_\ell, i_u] с текущим тиком ici_c:

fbelow(i)={fo(i)icifgfo(i)ic<ifabove(iu)={fo(iu)ic<iufgfo(iu)iciuf_{\text{below}}(i_\ell) = \begin{cases} f_o(i_\ell) & i_c \ge i_\ell \\ f_g - f_o(i_\ell) & i_c < i_\ell \end{cases} \qquad f_{\text{above}}(i_u) = \begin{cases} f_o(i_u) & i_c < i_u \\ f_g - f_o(i_u) & i_c \ge i_u \end{cases} finside=fgfbelow(i)fabove(iu)f_{\text{inside}} = f_g - f_{\text{below}}(i_\ell) - f_{\text{above}}(i_u)

Каждая позиция хранит снимок feeGrowthInsideLast, и несобранные комиссии — это просто

fees owed=Lfinsidenowfinsidelast2128\text{fees owed} = L \cdot \frac{f_{\text{inside}}^{\text{now}} - f_{\text{inside}}^{\text{last}}}{2^{128}}

обновляемые лениво всякий раз, когда позицию трогают. Два практических следствия. Первое: дельты feeGrowthInsideединственный честный способ измерить комиссионный доход позиции — семплирование объема на уровне пула и пропорциональное деление по вашей доле TVL дает неверный результат всякий раз, когда цена бродит вокруг границ вашего диапазона. Второе: поскольку комиссии сидят как tokensOwed, а не капитализируются, реализованная доходность LP имеет член денежного простоя, которого не было у v2; хранилища с автокапитализацией существуют именно для того, чтобы арбитражить это (минус их собственная комиссия).

Диаграмма feeGrowthGlobal, feeGrowthOutside на граничных тиках диапазона и вычитания feeGrowthInside

Выплата: короткий стрэддл, за удержание которого вам платят (может быть)

Внутри диапазона стоимость позиции как функция цены равна

V(P)=x(P)P+y(P)=L(2PpaPpb)V(P) = x(P) \cdot P + y(P) = L\left(2\sqrt{P} - \sqrt{p_a} - \frac{P}{\sqrt{p_b}}\right)

Вогнута по PP — член 2LP2L\sqrt{P} и есть вся суть. За пределами диапазона она становится линейной: наклон x(pa)x(p_a) снизу (вы в лонге по фиксированному набору ETH), наклон 0 сверху (вы во флэте в USDC). Прогоним наш разобранный пример по диапазону и сравним с простым удержанием внесенных токенов:

PP (USDC/ETH) Стоимость LP Стоимость HODL Расхождение
2500 5,716.68 6,023.69 −307.02
2750 6,200.4 6,273.69 −73.3
3000 6,523.69 6,523.69 0
3250 6,706.3 6,773.69 −67.4
3500 6,764.06 7,023.69 −259.63

LP отстает от HODL в обоих направлениях и совпадает с ним только по цене минтинга. Ограниченный апсайд, усиленное участие в даунсайде, максимальная относительная стоимость на страйке... это выплата короткого стрэддла (точнее, когда линейные хвосты вычитаются из бенчмарка HODL, короткая позиция в наборе опционов со страйками, разложенными по [pa,pb][p_a, p_b]). Поток комиссий — это премия. Концентрация диапазона — это выбор более узких страйков: больше премии на единицу времени, пока в диапазоне, более быстрое и глубокое расхождение при движении цены. Каждый LP в v3 — трейдер с короткой волатильностью, хотел он этого или нет — ончейн-собрат компромисса инвентарного риска, который Avellaneda–Stoikov формализует для маркетмейкеров книги ордеров, где ширина диапазона играет роль котируемого спреда.

Стоимость позиции LP в сравнении с HODL по всему ценовому диапазону, показывающая вогнутую выплату в стиле короткого стрэддла

Традиционное название разрыва в этой таблице — непостоянная (дивергентная) потеря, но IL-против-HODL — ущербный бенчмарк: он смешивает потерю, которую вы понесли как поставщик ликвидности, с рыночным риском, который вы несли бы в любом случае. Более резкое разложение приходит от Milionis, Moallemi, Roughgarden и Zhang (2022), "Automated Market Making and Loss-Versus-Rebalancing" (arXiv:2208.06046). Оценивайте LP не против HODL, а против ребалансирующего портфеля, который держит в каждый момент те же количества токенов, что и пул, но торгует по бесфрикционной внешней рыночной цене, а не против арбитражеров. Разница — это LVR ("левер"): компонент P&L LP, который является чистым неблагоприятным отбором, выплачиваемым арбитражерам, снимающим устаревшие котировки AMM после каждого движения цены. При геометрически-броуновской цене с волатильностью σ\sigma LVR накапливается с мгновенной скоростью

(σ,P)=σ2P22x(P)\ell(\sigma, P) = \frac{\sigma^2 P^2}{2}\,|x'(P)|

— "формула Блэка–Шоулза для AMM", как выражаются авторы, где x(P)|x'(P)| — маржинальная глубина пула при текущей цене. Для полнодиапазонного пула с постоянным произведением это сворачивается в знаменитые σ28\frac{\sigma^2}{8} от стоимости пула на единицу времени: при 5% дневной волатильности примерно 3.1 б.п. пула утекает арбитражерам каждый день, есть комиссии или нет. Концентрация умножает x(P)|x'(P)| — наш пример с 12.4× глубины выше — это также ~12.4×-машина LVR, пока в диапазоне. Комиссии должны обгонять эту утечку, чтобы позиция была +EV, и LVR (в отличие от "IL") — хеджируемая, предсказуемая текущая издержка, что и делает его правильной единицей учета. Полное исчисление прибыльности — комиссионный APR против LVR против реализованной волатильности, когда LP-провайдинг обыгрывает дельта-хеджированные короткие опционы, — это тема предстоящего глубокого разбора непостоянной потери и LVR, а механика хеджирования получает отдельный разбор в стратегиях LP для v3 и хеджировании.

Еще одна издержка живет уровнем ниже: поскольку котировки AMM обновляются только когда кто-то торгует, каждая позиция LP также подвержена мемпул-играм, разыгрываемым вокруг этих сделок — сэндвич-атакам против свапперов, которые платят ваши комиссии, и арбитражным бандлам, реализующим ваш LVR блок за блоком. Эта экосистема разобрана в статье про MEV и сэндвич-атаки.

Чтение состояния пула ончейн

Все вышеизложенное наблюдаемо из трех дешевых вызовов к контракту пула.

slot0() упаковывает горячее состояние в один слот хранилища: sqrtPriceX96, текущий tick, индексы наблюдений оракула и флаги протокольной комиссии/блокировки. liquidity() возвращает текущее в-диапазоне агрегированное LL — заметьте, это не TVL; это параметр глубины, активный на текущем тике, и он скачкообразно меняется, когда цена пересекает инициализированный тик. ticks(int24) возвращает состояние на тик: liquidityGross (полное LL, ссылающееся на тик), liquidityNet (знаковое LL, добавляемое при пересечении слева направо) и аккумуляторы feeGrowthOutside. Итерирование liquidityNet по инициализированным тикам (tickBitmap говорит вам, какие из них существуют, без сканирования всех 1.7 миллиона) реконструирует полный профиль глубины L(i)L(i) — ваш снимок книги ордеров.

from web3 import Web3

w3 = Web3(Web3.HTTPProvider(RPC_URL))
pool = w3.eth.contract(address=POOL, abi=POOL_ABI)  # USDC/WETH 0.05%

sqrt_price_x96, tick, *_ = pool.functions.slot0().call()
L = pool.functions.liquidity().call()

raw_price = (sqrt_price_x96 / 2**96) ** 2          # token1/token0, base units
eth_usdc  = 1 / (raw_price * 10**(18 - 6))          # human USDC per ETH
depth_1tick = L * (1.0001**0.5 - 1) * (sqrt_price_x96 / 2**96)

Сами позиции живут в двух местах. Основной пул ключует их по (owner, tickLower, tickUpper) — один агрегированный слот на тройку владелец-диапазон. Ритейл и большинство фондов вместо этого минтят через периферийный NonfungiblePositionManager (майннет: 0xC36442b4a4522E871399CD717aBDD847Ab11FE88), который оборачивает каждую позицию в ERC-721 NFT и предоставляет positions(tokenId), возвращающий полный кортеж: токены, уровень комиссии, диапазон, LL, feeGrowthInsideLast и tokensOwed. Для мониторинга портфеля этот один вызов плюс текущий feeGrowthInside пула (пересчитанный из ticks(), как в предыдущем разделе) дают вам оценку по рынку и накопленные комиссии, не трогая индексер — хотя для чего-либо исторического вам понадобится повтор событий свапа или сабграф, потому что рост комиссий зависит от пути, а сеть хранит только текущие аккумуляторы.

Две операционные детали, которые стоит усвоить перед развертыванием капитала. Первое: шаг тика квантует ваше пространство стратегий: на уровне 0.05% вы можете размещать диапазоны шириной 10 б.п. и запускать нечто близкое к настоящему лимитному ордеру (заминтить чуть выше/ниже спота, собрать комиссию, сжечь после пересечения — вайтпейпер явно формулирует этот сценарий "диапазонного ордера"), тогда как на уровне 1% ваш минимальный диапазон ~2% шириной, и аналогия с LOB становится грубой. Второе: диапазонный ордер — это лимитный ордер без приоритета отмены: если цена пересекает ваш диапазон и возвращается, вы прогоняете инвентарь туда-обратно и отдаете эдж (сохраняя комиссии). Пассивные диапазоны — это котировки, которые вы не можете снять, что ровно и есть причина, почему вопрос частоты ребалансировки и линза LVR для ответа на него так важны.

К чему это вас приводит

Стек v3, сжатый: цены — это тики на геометрической сетке 1.0001; глубина — это LL, конвертируемое в количества токенов не более чем через разности квадратных корней; комиссии — это аккумулятор на единицу LL, который вы дифференцируете по границам вашего диапазона; а получающаяся позиция — это диапазонный ордер с короткой волатильностью, текущая издержка которого имеет имя, формулу и arXiv-номер. С примитивами на руках интересные вопросы становятся количественными: насколько широко, как часто ребалансировать и клирят ли комиссии LVR для данного пула и режима — что ровно туда, куда эта серия идет дальше.

Ссылки

  • Adams, H., Zinsmeister, N., Salem, M., Keefer, R., Robinson, D. (2021). Uniswap v3 Core (whitepaper).
  • Uniswap v3 core libraries: TickMath.sol, SqrtPriceMath.sol, Position.sol, Tick.sol.
  • Milionis, J., Moallemi, C., Roughgarden, T., Zhang, A. L. (2022). Automated Market Making and Loss-Versus-Rebalancing. arXiv:2208.06046.
Дисклеймер: Информация в этой статье предоставлена исключительно в образовательных и ознакомительных целях и не является финансовым, инвестиционным или торговым советом. Торговля криптовалютами сопряжена с высоким риском убытков.

Авторы

Eugen Soloviov
Eugen Soloviov

Инженер торговых систем

Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.

Newsletter

Будьте в курсе событий

Подпишитесь на нашу рассылку, чтобы получать эксклюзивную аналитику по AI-трейдингу и обновления платформы.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.