Квант мамандарына арналған Uniswap v3: шоғырланған ликвидтілік және тик математикасы негізден бастап
Uniswap v3-тегі LP позициясы — бүркеніп тұрған лимиттік-ордер кітабындағы диапазондық ордер. Екі баға арасына ликвидтілік салсаңыз, сіз активті диапазоныңыз бойымен төмен қарай сатып алуға және жоғары қарай сатуға міндеттенген болып шығасыз — дәл осыны CLOB-та тұрған лимиттік ордерлер торы жасайды. Бірақ келісімшарт бағаларды, көлемдерді немесе ордер кітабын сақтамайды. Ол үш санды сақтайды: Q64.96 бекітілген нүктелі форматтағы бағаның квадрат түбірін, тіктің бүтін сан индексін және жиынтық ликвидтілік мәні -ды. Егер v3 позициясы туралы маркет-мейкинг моделінде баға белгілеу туралы ойлайтындай — инвентарь, орындалу бағалары, кері таңдау (adverse selection) тұрғысынан ойлануды қаласаңыз, осы ончейн примитивтерін олар кодтайтын сауда ұғымдарына аудара білуіңіз керек. Бұл мақала осы аударманы Uniswap v3 whitepaper-ін (Adams, Zinsmeister, Salem, Keefer, Robinson, 2021) және негізгі келісімшарттарды негізге ала отырып, негізден бастап құрастырады және қазіргі кезде әрбір байсалды LP талқылауы басталатын жерде — loss-versus-rebalancing тақырыбында аяқталады.
x·y = k-дан виртуалды резервтерге дейін
Uniswap v2 — тұрақты көбейтінді маркет-мейкер: пул token0-тің резервтерін және token1-дің резервтерін ұстайды және әрбір свопта мынаны қамтамасыз етеді:
token0-тің token1 бірліктеріндегі маргиналды бағасы құрайды, ал ликвидтілік бүкіл баға осі бойынша біркелкі таралған. Бұл капиталды пайдалану тұрғысынан аса тиімсіз: 0.999 мен 1.001 арасында сауда жасайтын тұрақты монеталар жұбы капиталының 99%-дан астамын ешқашан көрінбейтін бағаларда ұстайды.
v3-тің қадамы — әрбір LP-ге өз капиталын диапазонымен шектеуге мүмкіндік беру. Диапазон ішінде позиция дәл v2 пулы сияқты әрекет етуі керек — сол байланыстырушы қисық (bonding curve), сол маргиналды баға белгілеу — бірақ тек сол диапазонды қамту үшін қажетті резервтерді пайдалана отырып. Whitepaper мұны виртуалды резервтер арқылы формализациялайды: позиция қисығында жатқан v2-стильді резервтерді ұстап тұрғандай әрекет етеді, ал нақты резервтер — виртуалды резервтерден диапазон шекараларында позиция ұстайтын мөлшерді алып тастағанға тең:
Бұл — whitepaper-дің 2.2-теңдеуі, әрі v3-тегі ең маңызды жалғыз теңдеу. Аударылған қисық осьтерге тиеді: кезінде нақты резерві нөлге тең болады (позиция 100% token1), ал кезінде нақты резерві нөлге тең болады (100% token0). Диапазоннан тыс позиция белсенді емес күйге өтеді — ештеңе таппай тұрған бір токеннің тұрақты қоржыны.

параметрі, ликвидтілік деп аталады, -ды алмастыратын инвариант. Ол ретінде анықталады, әрі whitepaper айқын түсіндіретін таза интерпретациясы бар: ликвидтілік — «бағаның квадрат түбірінің бірлігіне келетін виртуалды резервтер». Диапазон ішіндегі кез келген бағасында виртуалды резервтер мынаған тең:
Неге күй айнымалысы √P болып табылады
v3 ядросы бағаны бақыламайды. Ол sqrtPriceX96 ретінде сақталатын -ды бақылайды — таңбасыз Q64.96 бекітілген нүктелі сан:
мұндағы — шикі баға: token0-тің негізгі бірлігіне келетін token1-дің негізгі бірліктері, ондық бөлшектерді қоса алғанда (бұл туралы төменде толығырақ). Квадрат түбірді таңдаудың себебі газды үнемдеу емес, алгебра. Виртуалды резервтер тепе-теңдіктерін дифференциалдасаңыз, SqrtPriceMath кітапханасында іске асырылған екі негізгі своп теңдеуін аласыз:
Екі токен дельтасы да бағаның квадрат түбіріне (немесе оның кері мәніне) қатысты сызықты, ал — пропорционалдық константасы ретінде әрекет етеді. Сондықтан бір тик шеңберіндегі свопқа қисықты инверттеу де, Ньютон итерациясы да қажет емес — -ды жылжыту үшін бір көбейту, содан кейін көлемдерді есептеу үшін екі көбейту жеткілікті. Своп бағаны инициализацияланған тик арқылы өткізетіндей үлкен болса, пул оны кесіп өтеді, сол жерде көрсетілген таза ликвидтілікті (liquidityNet) қосады немесе алып тастайды, содан кейін жаңа жиынтық -мен жалғасады. Жалпы алғанда, пул — бөлікті-тұрақты-көбейтінді AMM: инициализацияланған тиктер арасында тұрақты, тиктерде секіріс болады.
Маркет-мейкер үшін бұл дұрыс ойлау моделі: пулдың жиынтық профилі — ордер кітабының тереңдігінің DEX баламасы. CLOB тереңдігі баға деңгейіне келетін бірліктермен көрсетілсе, AMM тереңдігі тикке келетін -мен көрсетіледі — ал ауысу дәл жоғарыдағы тепе-теңдігі арқылы жүреді.
Тиктер: логарифмдік аралықты баға торы
Диапазондар кез келген бағадан басталып, аяқтала алмайды; олар тиктерге жабысуы керек. тигі мына бағаға сәйкес келеді:
сондықтан әрбір тик көршілерінен бір базистік пункт қашықтықта — абсолютті емес, салыстырмалы мағынада. Бұл логарифмдік аралық қасақана жасалған: тіркелген аддитивті тор $0.0001-де сауда жасайтын токен үшін өте ірі, ал $100{,}000-де өте ұсақ болар еді, ал геометриялық тор кез келген баға масштабында біркелкі 1 б.п. дәлдігін береді. TickMath кітапханасы getSqrtRatioAtTick пен getTickAtSqrtRatio арқылы екі бағытта да түрлендіреді — экспоненциалды функцияны шақырудың орнына алдын ала есептелген константалар бойынша биттермен ойнау (bit-twiddling) арқылы. Тик индекстері MIN_TICK = -887272 мен MAX_TICK = 887272 арасында шектелген, бұл баға диапазонын қамтиды: 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 жылдың қарашасында басқару дауысымен қосылды. Жоғары комиссиялы пулдардағы ірілеу аралық кесіп өтуге болатын тиктер санын шектеп, своп газ шығынын шектеулі етеді.
Барлығын бір рет міндетті түрде тұзаққа түсіретін ондық бөлшек тұзағы: ончейндегі шикі баға — token0-тің негізгі бірліктеріндегі token1. Mainnet-тегі USDC/WETH пулында token0 — USDC (6 ондық таңба), ал token1 — WETH (18 ондық таңба), сондықтан ETH-тің адами бағасы $3{,}000 болса, ол USDC-бірлігіне келетін WETH-wei шикі бағасына сәйкес келеді, бұл мына тикте орналасады:
мәнімен. Егер мониторинг тақтаңызда USDC/WETH үшін 196k шамасындағы тик көрсетілсе, енді неге екенін білесіз — және адами баға қажетінше инверттелген екенін білесіз.
(L, баға диапазоны) бойынша токен көлемдері: нақты формулалар
Осы бөлімнің негізгі нәтижесі: диапазонында ликвидтілігі бар позиция бар делік, ағымдағы баға болса, ол нені ұстайды? Своп теңдеулерін диапазон бойынша интегралдасақ, үш жағдай шығады:
Баға диапазоннан төмен () — позиция 100% token0:
Баға диапазоннан жоғары () — позиция 100% token1:
Баға диапазон ішінде ():
Бұл дәл 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 USDC бағасымен сауда жасайды делік, ал сіз диапазонына 1 ETH салғыңыз келеді. Квадрат түбірлер: , , .
ETH бөлігі -ды бекітеді:
Одан кейін USDC бөлігі шығады:
Демек, бұл позицияны минттеу үшін 1 ETH + 3,523.69 USDC қажет, жалпы құны $6,523.69, әрі бөліктердің 50/50 емес екеніне назар аударыңыз — бөліну диапазон ішінде қай жерде тұрғанына байланысты (асимметриялық диапазон дәл бағыттық көзқарасты білдірудің немесе бір токенмен таза «диапазондық ордер» орналастырудың тәсілі).
Енді бағаны шекараларға қарай жылжытайық:
- кезінде позиция толығымен ETH-ке айналды: ETH, құны $5,716.68. Сіз төмен қарай жылжу кезінде 1.2867 ETH-ті ликвидтілікпен өлшенген орташа 3523.69 / 1.2867 \approx \2{,}739$ бағасымен сатып алдыңыз.
- кезінде ол толығымен USDC-ге айналды: USDC. Сіз ETH-ті жоғары қарай жылжу кезінде орташа $3,240 бағасымен саттыңыз.
Бұл — диапазондық-ордер оқылымының нақты көрінісі: позиция шын мәнінде — 3000-нан 2500-ге дейінгі бид-тер тізбегі мен 3000-нан 3500-ге дейінгі аск-тар тізбегі, әрбір тиктегі көлемі -ге пропорционал. Ал шоғырландыру — сізге төленетін нәрсе: сол $6,523.69 капиталмен толық диапазонды v2-стиль позициясында болар еді — шоғырланған позиция тикке 12.4 есе көп тереңдік ұсынады және (диапазон ішінде болғанда) капитал долларына шаққанда 12.4 есе жоғары ставкамен комиссия табады.
Комиссия есебі: feeGrowthGlobal және feeGrowthInside
v3 комиссиялары позицияға қосылмайды (v2-ден қасақана бас тарту, онда комиссиялар -ға қайта инвестицияланатын). Олар әрбір токен үшін бөлек жиналады, ал есеп жүргізу тәсілі — әрбір LP аналитика құбыры қайта іске асыратын O(1) есеп жүргізудің шағын шедеврі.
Пул екі глобалды аккумулятор ұстайды, feeGrowthGlobal0X128 мен feeGrowthGlobal1X128: пул пайда болғаннан бергі ликвидтілік бірлігіне келетін жинақталған комиссиялар, Q128.128 бекітілген нүктелі форматта. Әрбір свопта комиссия сомасы (кіріс токенінен алынған) ағымдағы диапазон ішіндегі -ға бөлінеді және аккумуляторға қосылады. Бұл — v3 экономикасының негізгі ережесінің механизмі: комиссиялар свап кезінде тек диапазон ішінде тұрған ликвидтілікке ғана жиналады. Диапазоннан тыс позициялар тек белсенді емес инвентарь ғана емес — олар белсенді емес кезде дәл нөл табады.
Глобалды өсімнің дұрыс бөлігін шектеулі диапазонға меншіктеу үшін әрбір инициализацияланған тигі feeGrowthOutside0/1X128-ды сақтайды — бұл ағымдағы бағаға қатысты тиктің қарсы жағында пайда болған комиссия өсімі (тик кесіп өтілген сайын мәннің интерпретациясы өзгереді, дәл осы схеманы O(1) етеді). Содан кейін диапазонындағы, ағымдағы тигі болатын позиция үшін:
Әрбір позиция feeGrowthInsideLast снапшотын сақтайды, ал жиналмаған комиссиялар жай ғана:
позицияға әрбір қатынас жасалғанда жалқау түрде жаңартылады. Екі практикалық салдары бар. Біріншіден, feeGrowthInside дельталары — позицияның комиссия табысын өлшеудің жалғыз адал тәсілі — пул деңгейіндегі көлемді сынама алып, TVL-дегі үлесіңізге пропорционалдау бағаның диапазон шекараларының айналасында жүрген сайын қате нәтиже береді. Екіншіден, комиссиялар қайта инвестицияланбай tokensOwed ретінде тұратындықтан, LP-нің іс жүзінде алатын табысында v2-де болмаған қолма-қол ақша тежеуі (cash-drag) бар мерзімі пайда болады; автоматты-қайта-инвестициялайтын сейфтер дәл осыны арбитраждау үшін бар (өз комиссиясын шегергенде).

Төлем: сізге ұстап тұру үшін ақы төленетін (мүмкін) қысқа стрэддл
Диапазон ішінде позиция құны бағаның функциясы ретінде мынадай:
бойынша ойыс (concave) — мүшесі бәрін түсіндіреді. Диапазоннан тыс ол сызықты болады: диапазоннан төмен көлбеу (сіз тіркелген ETH қоржынымен ұзын позициядасыз), диапазоннан жоғары көлбеу 0 (сіз USDC-те тегіссіз). Есептелген мысалымызды диапазон бойынша жүргізіп, жай ғана салынған токендерді ұстап тұрумен салыстырайық:
| (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 бенчмаркіне қарсы таза есептелгеннен кейін, бойынша орналасқан опциондар жолағында қысқа позиция). Комиссия ағыны — сыйақы. Диапазонды тарылту — тар страйктерді таңдау дегенді білдіреді: диапазон ішінде уақыт бірлігіне көбірек сыйақы, баға жылжыған кезде тезірек әрі тереңірек алшақтық. Әрбір v3 LP-і, өзі қаласа да, қаламаса да, қысқа-волатильділік трейдері — бұл Avellaneda–Stoikov ордер кітабындағы маркет-мейкерлер үшін формализациялайтын инвентарь тәуекелі мен табыс арасындағы тепе-теңдіктің ончейн сыңары, мұнда диапазон ені баға белгіленген спрэдтің рөлін атқарады.

Осы кестедегі алшақтықтың дәстүрлі атауы — тұрақсыз (алшақтық) шығын, бірақ IL-versus-HODL олқылығы бар бенчмарк: ол ликвидтілік провайдері ретінде тартқан шығынды кез келген жағдайда өзіңіз көтеретін нарықтық тәуекелмен шатастырады. Дәлірек декомпозиция Milionis, Moallemi, Roughgarden және Zhang (2022) авторларының "Automated Market Making and Loss-Versus-Rebalancing" (arXiv:2208.06046) жұмысынан келеді. LP-ді HODL-ге емес, ал әрбір сәтте пулмен бірдей токен көлемін ұстайтын, бірақ арбитражерлерге қарсы емес, ал фрикцияссыз сыртқы нарық бағасымен сауда жасайтын қайта теңгерілетін портфельге қарсы бенчмарктеу керек. Айырмашылық — LVR («левер»): LP P&L-дың таза кері таңдаудан тұратын бөлігі, әрбір баға қозғалысынан кейін AMM-нің ескірген баға ұсыныстарын аулап алатын арбитражерлерге төленеді. волатильдігі бар геометриялық-Броундық баға астында LVR лезде мына ставкамен жиналады:
— авторлар айтқандай, «AMM-дерге арналған Блэк-Шоулз формуласы», мұндағы — ағымдағы бағадағы пулдың маргиналды тереңдігі. Толық диапазонды тұрақты-көбейтінді пул үшін бұл әйгілі уақыт бірлігіне келетін пул құнының -іне дейін қысқарады: күнделікті 5% волатильдікте пулдың шамамен 3.1 б.п.-і арбитражерлерге әрбір күн сайын жоғалады, комиссия бар-жоғына қарамастан. Шоғырландыру -ды көбейтеді — жоғарыдағы 12.4 есе тереңдік мысалымыз сонымен қатар шамамен 12.4 есе LVR машинасы да. Позицияның +EV болуы үшін комиссиялар осы ағып кетуден асып түсуі керек, ал LVR («IL»-ден айырмашылығы) хеджіленетін, болжамды ағымдағы шығын, дәл осы оны есеп бірлігі ретінде дұрыс етеді. Толық табыстылық есептемесі — комиссия APR-і LVR-ге қарсы нақты волатильдікке қарсы, LP-лаудың хеджіленген қысқа опциондардан қашан асып түсетіні — тұрақсыз шығын мен LVR-ге терең үңілу мақаласының тақырыбы, ал хеджілеу механикасы v3 LP стратегиялары мен хеджілеу мақаласында жеке қаралады.
Тағы бір шығын бір деңгей төменде жатыр: AMM баға ұсыныстары тек біреу сауда жасаған кезде ғана жаңарғандықтан, әрбір LP позициясы сол саудалар айналасында ойналатын мемпул ойындарына да ұшырайды — комиссияңызды төлейтін трейдерлерге қарсы сэндвич шабуылдары және LVR-іңізді блок сайын іске асыратын арбитраж бумалары. Бұл экосистема MEV мен сэндвич-шабуыл туралы мақалада сипатталған.
Ончейн пул күйін оқу
Жоғарыда айтылғандардың бәрі пул келісімшартына қарсы жасалатын үш арзан шақыру арқылы бақыланады.
slot0() ыстық күйді бір сақтау слотына жинайды: sqrtPriceX96, ағымдағы tick, оракул бақылау индекстері және протокол-комиссия/құлыптау жалаушалары. liquidity() ағымдағы диапазон ішіндегі жиынтық -ды қайтарады — бұл TVL емес екеніне назар аударыңыз; бұл ағымдағы тикте белсенді болатын тереңдік параметрі, әрі баға инициализацияланған тикті кесіп өткенде секіріп өзгереді. ticks(int24) тикке тән күйді қайтарады: liquidityGross (тикке сілтеме жасайтын жалпы ), liquidityNet (солдан оңға қарай кесіп өткенде қосылатын таңбалы ) және feeGrowthOutside аккумуляторлары. Инициализацияланған тиктер бойынша liquidityNet-ті қайталай отырып (tickBitmap барлық 1.7 миллионды сканерлемей-ақ қандай тиктер бар екенін айтады) толық тереңдік профилі -ды — сіздің ордер кітабы снапшотыңызды қалпына келтіреді.
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 арқылы минттейді (mainnet: 0xC36442b4a4522E871399CD717aBDD847Ab11FE88), бұл әрбір позицияны ERC-721 NFT-ге орап, толық кортежді қайтаратын positions(tokenId) ұсынады: токендер, комиссия деңгейі, диапазон, , feeGrowthInsideLast және tokensOwed. Портфельді бақылау үшін осы бір шақыру плюс пулдың ағымдағы feeGrowthInside-і (алдыңғы бөлімдегідей ticks()-тен қайта есептелген) индексаторға жүгінбей-ақ нарықтық құн мен жиналған комиссияларды береді — дегенмен кез келген тарихи деректер үшін своп-оқиғаларын қайта ойнату немесе subgraph қажет болады, өйткені комиссия өсімі жол тәуелді, ал тізбек тек ағымдағы аккумуляторларды ғана сақтайды.
Капитал орналастырар алдында есте сақтайтын екі операциялық деталь бар. Біріншіден, тик аралығы стратегия кеңістігіңізді квантталайды: 0.05% деңгейінде 10 б.п. ені бар диапазондарды орналастырып, шынайы лимиттік ордерге жақын нәрсені жүргізе аласыз (спот бағасынан жоғары/төмен минттеп, комиссияны жинап, кесіп өткеннен кейін өртеу — whitepaper бұл «диапазондық ордер» қолданысын нақты сипаттайды), ал 1% деңгейінде ең аз диапазоныңыз шамамен 2% ені бар, әрі LOB аналогиясы дөрекілене түседі. Екіншіден, диапазондық ордер — басымдықпен болдырмау мүмкіндігі жоқ лимиттік ордер: егер баға диапазоныңызды кесіп өтіп, кейін қайта оралса, инвентарьды бір айналымда өткізіп жібересіз және пайданы қайтарасыз (комиссияларды сақтап қалу арқылы). Пассивті диапазондар — сіз кері шақыра алмайтын баға ұсыныстары, дәл осы себепті қайта теңгерілу жиілігінің мәселесі және оны шешудегі LVR перспективасы соншалықты маңызды.
Осыдан не шығады
v3 стегін қысқаша: бағалар 1.0001-геометриялық тордағы тиктер; тереңдік — , квадрат түбір айырмашылықтарынан өзге ешнәрсенің көмегінсіз токен көлемдеріне түрлендіріледі; комиссиялар — диапазон шекараларыңыз бойынша айырмашылық жасайтын -ге келетін аккумулятор; ал нәтижесінде шыққан позиция — атауы, формуласы және arXiv нөмірі бар ағымдағы шығыны бар қысқа-волатильді диапазондық ордер. Осы примитивтермен қаруланған соң, қызық сұрақтар сандық сипатқа ие болады: диапазон қаншалықты кең болу керек, қаншалықты жиі қайта теңгеру керек және белгілі бір пул мен режим үшін комиссиялар LVR-ді жабады ма — дәл осы жерден бұл серия жалғасады.
Әдебиеттер
- Adams, H., Zinsmeister, N., Salem, M., Keefer, R., Robinson, D. (2021). Uniswap v3 Core (whitepaper).
- Uniswap v3 негізгі кітапханалары:
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.
Authors
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.