← Maqolalarga qaytish
July 18, 2026
5 daqiqa o'qish

Kvantchilar uchun Uniswap v3: Kontsentrlangan likvidlik va tick matematikasi asosdan

Kvantchilar uchun Uniswap v3: Kontsentrlangan likvidlik va tick matematikasi asosdan
#uniswap
#defi
#amm
#kontsentrlangan likvidlik
#market making
#lvr
#kvant
#ethereum

Uniswap v3 dagi LP pozitsiyasi — bu niqoblangan limit-order-book range order. Ikki narx orasiga likvidlik joylashtirasiz va shu bilan diapazon bo'ylab pastga tushayotganda aktivni sotib olishga, yuqoriga ko'tarilayotganda esa sotishga majbur bo'lasiz — bu xuddi CLOB'da turgan limit orderlar to'ri qiladigan ishning aynan o'zi. Lekin shartnoma narxlarni, miqdorlarni yoki order kitobini saqlamaydi. U uchta sonni saqlaydi: Q64.96 belgilangan nuqtali formatdagi kvadrat ildiz narx, butun son tick indeksi va yig'ma likvidlik qiymati LL. Agar v3 pozitsiyasi haqida xuddi market-making modelidagi kvotalar kabi — inventar, ijro narxlari, noqulay tanlov (adverse selection) — fikr yuritmoqchi bo'lsangiz, ana shu on-chain primitivlarni ular ifodalaydigan savdo tushunchalariga tarjima qila olishingiz kerak. Ushbu maqola Uniswap v3 whitepaper'iga (Adams, Zinsmeister, Salem, Keefer, Robinson, 2021) va asosiy shartnomalarga tayangan holda bu tarjimani asosdan quradi va hozirda har qanday jiddiy LP muhokamasi boshlanadigan joyda — loss-versus-rebalancing (rebalanslashga nisbatan yo'qotish) mavzusida yakunlanadi.

x·y = k dan virtual zaxiralarga

Uniswap v2 — bu doimiy ko'paytma market maker: pool token0'ning xx va token1'ning yy zaxiralarini ushlab turadi va har bir svopda

xy=kx \cdot y = k

shartini bajaradi. token0'ning token1 birliklaridagi marjinal narxi P=y/xP = y/x bo'lib, likvidlik butun (0,)(0, \infty) narx o'qi bo'ylab bir tekis taqsimlangan. Bu kapitalni foydalanish nuqtai nazaridan o'ta samarasiz: 0.999 va 1.001 orasida savdo qiladigan stablecoin jufti o'z kapitalining 99% dan ortig'ini hech qachon amalga oshmaydigan narxlarda ushlab turadi.

v3'ning yechimi — har bir LP'ga o'z kapitalini [pa,pb][p_a, p_b] diapazoni bilan cheklash imkonini berish. Diapazon ichida pozitsiya aynan v2 pooli kabi harakat qilishi kerak — bir xil bog'lanish egri chizig'i, bir xil marjinal narxlash — lekin faqat shu diapazonni qoplash uchun zarur bo'lgan zaxiralardan foydalangan holda. Whitepaper buni virtual zaxiralar yordamida rasmiylashtiradi: pozitsiya go'yo xvyv=L2x_v \cdot y_v = L^2 egri chizig'ida yotgan v2-uslubidagi (xv,yv)(x_v, y_v) zaxiralarini ushlab turgandek harakat qiladi, haqiqiy zaxiralar esa virtual zaxiralardan diapazon chegaralarida pozitsiya ushlab turadigan miqdorni ayirish natijasidir:

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

Bu whitepaper'ning 2.2-tenglamasi bo'lib, v3'dagi eng muhim yagona tenglamadir. Tarjima qilingan egri chiziq o'qlarga tegadi: P=pbP = p_b da haqiqiy xx zaxira nolga tushadi (pozitsiya 100% token1), P=paP = p_a da esa haqiqiy yy zaxira nolga tushadi (100% token0). Diapazondan tashqarida pozitsiya faolsizlashadi — bitta tokendan iborat qotgan miqdor, hech narsa ishlamaydi.

Uniswap v2 doimiy ko'paytma egri chizig'i va virtual hamda haqiqiy zaxiralarni ko'rsatuvchi v3 tarjima qilingan egri chiziq

Likvidlik deb ataluvchi LL parametri — bu kk o'rnini bosuvchi invariant. U L=kL = \sqrt{k} sifatida aniqlanadi va whitepaper aniq ifodalagan sof talqinga ega: likvidlik — bu "kvadrat ildiz narxning birligiga to'g'ri keladigan virtual zaxiralar". Diapazon ichidagi istalgan PP narxda virtual zaxiralar quyidagicha bo'ladi:

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

Nega holat o'zgaruvchisi √P

v3 yadrosi narxni kuzatmaydi. U P\sqrt{P} ni sqrtPriceX96 sifatida, ishorasiz Q64.96 belgilangan nuqtali son ko'rinishida saqlaydi:

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

bu yerda PPxom narx: token0'ning bazaviy birligiga to'g'ri keluvchi token1'ning bazaviy birliklari, o'nlik kasrlar hisobga olingan holda (bu haqda pastroqda batafsilroq). Kvadrat ildizdan foydalanish sababi gaz tejash uchun emas, bu — algebra. Virtual zaxira identiklariklarini differensiallasangiz, SqrtPriceMath kutubxonasida amalga oshirilgan ikkita fundamental svop tenglamasini olasiz:

Δ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)

Ikkala token delta ham kvadrat ildiz narxga (yoki uning teskarisiga) nisbatan chiziqli bo'lib, LL proporsionallik konstantasi vazifasini bajaradi. Shuning uchun bitta tick ichidagi svopga egri chiziqni teskari aylantirish, Nyuton iteratsiyasi kerak emas — P\sqrt{P} ni siljitish uchun bitta ko'paytirish, so'ng miqdorlarni hisoblash uchun ikkita ko'paytirish kifoya. Svop narxni initsializatsiya qilingan tick orqali o'tkazish uchun yetarlicha katta bo'lsa, pool undan o'tadi, u yerda ko'rsatilgan sof likvidlikni qo'shadi yoki olib tashlaydi (liquidityNet) va yangi yig'ma LL bilan davom etadi. Global miqyosda pool — bu bo'lakli-doimiy-ko'paytma AMM: initsializatsiya qilingan ticklar orasida LL doimiy, ticklarda esa sakraydi.

Market maker uchun bu to'g'ri mental model: poolning yig'ma L(P)L(P) profili DEX'dagi order-book chuqurligining ekvivalentidir. CLOB chuqurligi har bir narx darajasidagi birliklarda ifodalansa, AMM chuqurligi — bu har bir tick uchun LL, va o'tkazish aynan yuqoridagi Δy=LΔP\Delta y = L\Delta\sqrt{P} identikligi orqali amalga oshadi.

Ticklar: logaritmik oraliqli narx to'ri

Diapazonlar ixtiyoriy narxlarda boshlanib tugay olmaydi; ular ticklarga moslashishi kerak. ii tick quyidagi narxga to'g'ri keladi:

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

shunday qilib har bir tick o'z qo'shnisidan bir bazis punktga uzoqlashadi — bu mutlaq emas, balki nisbiy ma'noda. Bu logaritmik oraliq ataylab qilingan: qat'iy additiv to'r $0.0001 da savdo qiluvchi token uchun o'ta yirik va $100{,}000 da o'ta mayda bo'lar edi, geometrik to'r esa har qanday narx miqyosida bir xilda 1 bazis punkt aniqlikni beradi. TickMath kutubxonasi ikkala yo'nalishda ham konvertatsiya qiladi — getSqrtRatioAtTick va getTickAtSqrtRatio — bu jarayonda eksponensial funksiyani chaqirish o'rniga oldindan hisoblangan konstantalar ustida bit darajasidagi amallardan foydalaniladi. Tick indekslari MIN_TICK = -887272 va MAX_TICK = 887272 bilan chegaralangan bo'lib, bu [2128,2128][2^{-128}, 2^{128}] narx diapazonini qoplaydi: uint256 arifmetikasida mavjud bo'la oladigan istalgan token jufti uchun yetarlicha keng.

Har bir tick ishlatib bo'lmaydi. Har bir komissiya darajasi tick oralig'ini belgilaydi, va pozitsiyalar faqat unga bo'linadigan ticklardan foydalanishi mumkin:

Komissiya darajasi Tick oralig'i Min diapazon kengligi Odatiy foydalanish
0.01% 1 ~1 bp stable/stable
0.05% 10 ~10 bp stable juftliklar, ETH/stablecoinlar
0.30% 60 ~60 bp asosiy juftliklar
1.00% 200 ~2% ekzotik / volatil

0.05%/0.30%/1% darajalari 2021-yil may oyida ishga tushirish paytida chiqarilgan; 0.01% darajasi 2021-yil noyabr oyida boshqaruv ovoz berishi orqali qo'shilgan. Yuqori komissiyali poollarda oraliq kattaroq bo'lishi potentsial kesib o'tiladigan ticklar sonini va svop gaz xarajatlarini chegaralangan holda ushlab turadi.

Har kim bir marta duch keladigan o'nlik kasr tuzog'i: on-chain'dagi xom narx — bu token1'ning token0'ga nisbatan bazaviy birliklardagi narxi. Mainnet'dagi USDC/WETH poolida token0 — USDC (6 o'nlik kasr), token1 esa WETH (18 o'nlik kasr), shuning uchun ETH uchun $3{,}000 lik inson narxi 1012/30003.333×10810^{12}/3000 \approx 3.333 \times 10^{8} USDC-birligi uchun WETH-wei ko'rinishidagi xom narxga to'g'ri keladi, bu esa quyidagi tickda yashaydi:

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} bilan. Agar monitoring dashboardingiz USDC/WETH uchun 196k atrofidagi tickni ko'rsatsa, endi buning sababini bilasiz — va inson narxi (sqrtPriceX96/296)210dec0dec1\left(\texttt{sqrtPriceX96}/2^{96}\right)^2 \cdot 10^{\,\text{dec}_0 - \text{dec}_1} ekanini, kerak bo'lganda teskari aylantirilishini ham bilasiz.

(L, narx diapazoni)dan token miqdorlari: aniq formulalar

Ushbu bo'limning asosiy natijasi: [pa,pb][p_a, p_b] da LL likvidlikka ega pozitsiya va joriy PP narx berilgan bo'lsa, u nimalarni ushlab turadi? Svop tenglamalarini diapazon bo'ylab integrallash uchta holatni beradi:

Narx diapazondan past (PpaP \le p_a) — pozitsiya 100% token0:

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

Narx diapazondan yuqori (PpbP \ge p_b) — pozitsiya 100% token1:

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

Narx diapazon ichida (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)

Bular aynan SqrtPriceMath.getAmount0Delta va getAmount1Delta hisoblaydigan qiymatlar (yo'naltirilgan yaxlitlash bilan — shartnoma har doim foydalanuvchiga qarshi yaxlitlaydi, bu tafsilot buni backtester'da takrorlasangiz va wei darajasidagi nomuvofiqliklar haqida o'ylab qolsangiz muhim bo'ladi).

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)

Sonli misol: ETH/USDC, diapazon [2500, 3500]

Faraz qilaylik, ETH P=3000P = 3000 USDC narxda savdo qiladi va siz [2500,3500][2500, 3500] diapazoniga 1 ETH joylashtirmoqchisiz. Kvadrat ildizlar: 2500=50\sqrt{2500} = 50, 3000=54.7723\sqrt{3000} = 54.7723, 3500=59.1608\sqrt{3500} = 59.1608.

ETH tomoni LL ni belgilaydi:

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 tomoni esa shundan kelib chiqadi:

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}

Demak, bu pozitsiyani mint qilish 1 ETH + 3,523.69 USDC talab qiladi, umumiy qiymati $6,523.69, va e'tibor bering — tomonlar 50/50 emas — bo'linish PP diapazon ichida qayerda joylashganiga bog'liq (assimetrik diapazon aynan yo'nalishli qarashni ifodalash yoki bitta token bilan sof "range order" joylashtirish usulidir).

Endi narxni chegaralar bo'ylab yuring:

  • P=2500P = 2500 da pozitsiya to'liq ETH'ga aylangan: x=738.37×(1/501/59.1608)=2.2867x = 738.37 \times (1/50 - 1/59.1608) = 2.2867 ETH, qiymati $5,716.68. Siz pastga tushish davomida 1.2867 ETH ni likvidlik bo'yicha o'rtacha $2{,}739 narxda sotib oldingiz (3523.69 / 1.2867 \approx \2{,}739$).
  • P=3500P = 3500 da u to'liq USDC'ga aylangan: y=738.37×(59.160850)=6,764.06y = 738.37 \times (59.1608 - 50) = 6{,}764.06 USDC. Siz ETH'ingizni yuqoriga ko'tarilish davomida o'rtacha $3,240 narxda sotdingiz.

Bu — range order talqinining aniq ko'rinishi: pozitsiya aslida 3000 dan 2500 gacha bo'lgan bid'lar zinapoyasi va 3000 dan 3500 gacha bo'lgan ask'lar zinapoyasi bo'lib, har bir tick uchun hajm LL ga proporsional. Va konsentratsiya — bu siz uchun to'lanadigan narsa: xuddi shu $6,523.69 kapital bilan to'liq diapazonli v2-uslubidagi pozitsiya Lv2=V/(2P)=59.55L_{v2} = V/(2\sqrt{P}) = 59.55 bo'lar edi — kontsentrlangan pozitsiya har bir tick uchun 12.4× ko'proq chuqurlikni kvotalaydi va (diapazon ichida bo'lgan paytda) har bir dollar kapitalga nisbatan 12.4× tezroq komissiya oladi.

Komissiya hisobi: feeGrowthGlobal va feeGrowthInside

v3 komissiyalari pozitsiyaga qo'shilib ketmaydi (bu v2'dan ataylab chetlanish bo'lib, u yerda komissiyalar k\sqrt{k} ga qayta investitsiya qilinar edi). Ular har bir token bo'yicha alohida to'planadi, va bu hisob-kitob har bir LP analitika quvuri qayta amalga oshiradigan, tushunishga arzigulik O(1) buxgalteriya san'atining kichik durdonasidir.

Pool ikkita global akkumulyator saqlaydi: feeGrowthGlobal0X128 va feeGrowthGlobal1X128 — pool tashkil topgandan beri likvidlik birligiga to'g'ri keluvchi kumulyativ komissiyalar, Q128.128 belgilangan nuqtali formatda. Har bir svopda komissiya miqdori (kirish tokenidan olinadi) joriy diapazon ichidagi LL ga bo'linadi va akkumulyatorga qo'shiladi. Bu v3 iqtisodiyotining kardinal qoidasi ortidagi mexanizm: komissiyalar faqat svop paytida diapazon ichida bo'lgan likvidlikka to'planadi. Diapazondan tashqaridagi pozitsiyalar shunchaki faolsiz inventar emas — ular faolsiz vaqtida aniq nol daromad oladi.

Global o'sishning to'g'ri qismini chekli diapazonga bog'lash uchun har bir initsializatsiya qilingan ii tick feeGrowthOutside0/1X128 ni saqlaydi — bu joriy narxga nisbatan tickning boshqa tomonida yuz bergan komissiya o'sishi (tick kesib o'tilganda uning talqini har safar teskariga aylanadi, aynan shu narsa sxemani O(1) qiladi). So'ng [i,iu][i_\ell, i_u] diapazonidagi pozitsiya uchun joriy ici_c tickda:

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)

Har bir pozitsiya feeGrowthInsideLast degan snapshotni saqlaydi, va yig'ilmagan komissiyalar shunchaki:

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

pozitsiyaga har safar tegilganda dangasa tarzda yangilanadi. Ikkita amaliy natija bor. Birinchidan, feeGrowthInside deltalari pozitsiyaning komissiya daromadini o'lchashning yagona halol usuli — pool darajasidagi hajmni namuna olish va TVL'dagi ulushingiz bo'yicha proratsiya qilish narx diapazon chegaralaringiz atrofida sarson bo'lgan har safar noto'g'ri natija beradi. Ikkinchidan, komissiyalar qayta investitsiya qilinmasdan tokensOwed sifatida yotgani sababli, real LP daromadlari v2'da bo'lmagan naqd pul sirg'alishi (cash-drag) shartiga ega; avto-qo'shish (auto-compounding) xazinalari aynan shu narsani arbitraj qilish uchun mavjud (o'z komissiyalarini ayirgan holda).

feeGrowthGlobal, diapazon chegara ticklaridagi feeGrowthOutside va feeGrowthInside ayirmasi diagrammasi

To'lov: sizga (balki) to'lanadigan qisqa straddle

Diapazon ichida pozitsiya qiymati narxning funksiyasi sifatida:

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 ga nisbatan botiq (konkav) — 2LP2L\sqrt{P} hadi butun voqeaning mag'zi. Diapazondan tashqarida u chiziqli bo'lib qoladi: pastda qiyalik x(pa)x(p_a) (siz qat'iy ETH miqdoriga "long" holatidasiz), yuqorida qiyalik 0 (siz USDC'da "flat" holatidasiz). Bizning sonli misolimizni diapazon bo'ylab yurgizib, uni oddiy tokenlarni ushlab turish (HODL) bilan solishtiring:

PP (USDC/ETH) LP qiymati HODL qiymati Farq
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 ikkala yo'nalishda ham HODL'dan orqada qoladi va faqat mint qilingan narxda unga tenglashadi. Chegaralangan yuqori daromad, kuchaytirilgan pastga qatnashish, strike nuqtasida maksimal nisbiy qiymat... bu — qisqa straddlening to'lovi (aniqrog'i, chiziqli quyruqlar HODL benchmarkiga qarshi hisoblanganidan so'ng, [pa,pb][p_a, p_b] bo'ylab strike qilingan opsionlar to'plamidagi qisqa pozitsiya). Komissiya oqimi — bu premiya. Diapazonni toraytirish — bu torroq strike'larni tanlash: diapazon ichida vaqt birligiga ko'proq premiya, narx harakatlanganda esa tezroq va chuqurroq farqlanish. Har bir v3 LP'si, xohlasa-xohlamasa, qisqa-volatillik treyderidir — bu Avellaneda–Stoikov order-book market makerlar uchun rasmiylashtirgan inventar-xavf almashuvining on-chain hamkasbi bo'lib, diapazon kengligi kvotalangan spred rolini o'ynaydi.

Narx diapazoni bo'ylab LP pozitsiya qiymatining HODL bilan solishtirilishi, botiq qisqa-straddle-ga o'xshash to'lovni ko'rsatadi

Bu jadvaldagi farqning an'anaviy nomi — impermanent (vaqtinchalik) yo'qotish, lekin IL-versus-HODL nuqsonli benchmark: u likvidlik provayderi sifatida ko'targan yo'qotishni baribir ko'tarishingiz kerak bo'lgan bozor xavfi bilan aralashtirib yuboradi. Keskinroq dekompozitsiya Milionis, Moallemi, Roughgarden va Zhang (2022) tomonidan taklif qilingan, "Automated Market Making and Loss-Versus-Rebalancing" (arXiv:2208.06046). LP'ni HODL emas, balki har bir lahzada pool bilan bir xil token miqdorlarini ushlab turadigan, lekin arbitrajchilarga qarshi emas, balki ishqalanishsiz tashqi bozor narxida savdo qiladigan rebalanslash portfeliga nisbatan taqqoslang. Farq — bu LVR ("lever"): LP P&L'ning sof noqulay tanlov (adverse selection) qismi, bo'lib, u har bir narx harakatidan keyin AMM'ning eskirgan kvotalarini "teradigan" arbitrajchilarga to'lanadi. σ\sigma volatillikka ega geometrik Braun harakati ostida LVR quyidagi lahzali tezlikda to'planadi:

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

— mualliflar aytganidek, "AMM'lar uchun Black–Scholes formulasi", bu yerda x(P)|x'(P)| — joriy narxdagi poolning marjinal chuqurligi. To'liq diapazonli doimiy-ko'paytma pool uchun bu mashhur σ28\frac{\sigma^2}{8} ga — vaqt birligiga to'g'ri keluvchi pool qiymatining ulushiga — qisqaradi: kunlik 5% volatillikda taxminan pool qiymatining 3.1 bazis punkti har kuni arbitrajchilarga oqib ketadi, komissiyalar bo'lsa ham, bo'lmasa ham. Kontsentratsiya x(P)|x'(P)| ni ko'paytiradi — yuqoridagi 12.4× chuqurlik misolimiz diapazon ichida bo'lgan paytda ham taxminan 12.4× LVR mashinasidir. Komissiyalar pozitsiyaning +EV bo'lishi uchun ushbu sirg'alishdan tezroq o'sishi kerak, va LVR ("IL" dan farqli o'laroq) himoyalanishi mumkin bo'lgan, bashorat qilinadigan joriy xarajat bo'lib, aynan shu narsa uni to'g'ri hisob birligiga aylantiradi. To'liq daromadlilik hisob-kitobi — komissiya APR'i LVR'ga qarshi, real volatillikka qarshi, LP qachon delta-hedjlangan qisqa opsionlardan ustun keladi — impermanent loss va LVR chuqur tahlilining mavzusi bo'lib, tez orada chiqadi, hedjlash mexanikasi esa v3 LP strategiyalari va hedjlashda alohida ko'rib chiqiladi.

Yana bir xarajat bir qatlam pastroqda yashaydi: AMM kvotalari faqat kimdir savdo qilganda yangilangani sababli, har bir LP pozitsiyasi ushbu savdolar atrofida mempool'da o'ynaladigan o'yinlarga ham duchor bo'ladi — sizning komissiyalaringizni to'laydigan svopchilarga qarshi sendvich hujumlari, va LVR'ingizni blok-bo'ylab amalga oshiradigan arbitraj bog'lamlari. Ushbu ekotizim MEV va sendvich-hujum maqolasida xaritalangan.

On-chain'da pool holatini o'qish

Yuqoridagi hamma narsa pool shartnomasiga qilingan uchta arzon chaqiruvdan kuzatilishi mumkin.

slot0() issiq holatni bitta xotira slotiga joylaydi: sqrtPriceX96, joriy tick, oracle kuzatuv indekslari va protokol-komissiya/qulf bayroqlari. liquidity() joriy diapazon ichidagi yig'ma LL ni qaytaradi — e'tibor bering, bu TVL emas; bu joriy tickda faol bo'lgan chuqurlik parametri va narx initsializatsiya qilingan tick orqali o'tganda uzluksiz sakraydi. ticks(int24) har bir tick uchun holatni qaytaradi: liquidityGross (tickka ishora qiluvchi jami LL), liquidityNet (chapdan o'ngga o'tishda qo'shiladigan ishorali LL), va feeGrowthOutside akkumulyatorlari. liquidityNetni initsializatsiya qilingan ticklar bo'ylab iteratsiya qilish (tickBitmap sizga 1.7 million tickning barchasini skanerlamasdan qaysilari mavjudligini aytadi) to'liq L(i)L(i) chuqurlik profilini — sizning order kitobi snapshotingizni — qayta tiklaydi.

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)

Pozitsiyalarning o'zi ikkita joyda yashaydi. Asosiy pool ularni (owner, tickLower, tickUpper) bo'yicha kalitlaydi — har bir egasi-diapazon uchligiga bitta yig'ma slot. Retail va ko'pchilik fondlar esa buning o'rniga periferiyadagi NonfungiblePositionManager (mainnet: 0xC36442b4a4522E871399CD717aBDD847Ab11FE88) orqali mint qiladi, u har bir pozitsiyani ERC-721 NFT'ga o'raydi va positions(tokenId) orqali to'liq to'plamni qaytaradi: tokenlar, komissiya darajasi, diapazon, LL, feeGrowthInsideLast va tokensOwed. Portfel monitoringi uchun ushbu bitta chaqiruv, pool'ning joriy feeGrowthInsidesi bilan birga (oldingi bo'limdagidek ticks() dan qayta hisoblangan), indekserga tegmasdan bozor bo'yicha baholash va to'plangan komissiyalarni beradi — lekin tarixiy narsa uchun sizga svop-hodisa replay'i yoki subgraph kerak bo'ladi, chunki komissiya o'sishi yo'lga bog'liq (path-dependent) va zanjir faqat joriy akkumulyatorlarni saqlaydi.

Kapital joylashtirishdan oldin ichga singdirishga arzigulik ikkita amaliy tafsilot. Birinchidan, tick oralig'i strategiya makonini kvantlaydi: 0.05% darajasida 10-bp-kenglikdagi diapazonlarni joylashtirib, haqiqiy limit orderga yaqin biror narsani ishga tushirishingiz mumkin (spot narxdan biroz yuqorida/pastda mint qiling, komissiyani yig'ing, kesib o'tilgandan keyin burn qiling — whitepaper aynan shu "range order" foydalanish holatini ochiq tarzda ifodalaydi), 1% darajasida esa sizning minimal diapazoningiz ~2% kenglikda bo'ladi va LOB o'xshashligi qo'polroq bo'lib qoladi. Ikkinchidan, range order — bu bekor qilish ustuvorligiga ega bo'lmagan limit order: agar narx diapazoningizdan o'tib, qaytib kelsa, siz inventarni aylantirasiz va (komissiyalarni saqlab qolgan holda) foydani qaytarib berasiz. Passiv diapazonlar — bu siz tortib ololmaydigan kvotalar — aynan shuning uchun rebalanslash chastotasi masalasi va unga javob berish uchun LVR linzasi shunchalik muhim.

Bu sizni qayerda qoldiradi

v3 stekini siqib chiqarsak: narxlar — 1.0001-geometrik to'rdagi ticklar; chuqurlik — bu LL, kvadrat ildizlar farqidan boshqa hech narsa orqali token miqdorlariga o'girilishi mumkin; komissiyalar — sizning diapazon chegaralaringiz bo'ylab ayirib olinadigan har-LL akkumulyatori; va natijadagi pozitsiya — nomi, formulasi va arXiv raqami bor joriy xarajatga ega qisqa-volatillik range order'idir. Primitivlar qo'lda bo'lgach, qiziq savollar miqdoriy tus oladi: qanchalik keng, qanchalik tez-tez rebalanslash kerak, va berilgan pool va rejim uchun komissiyalar LVR'ni qoplaydimi — bu esa aynan ushbu seriyaning keyingi qismi qayerga borishidir.

Manbalar

  • Adams, H., Zinsmeister, N., Salem, M., Keefer, R., Robinson, D. (2021). Uniswap v3 Core (whitepaper).
  • Uniswap v3 asosiy kutubxonalari: 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.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.