În cadrul piețelor dinamice unde prețurile activelor variază și fiecare decizie contează, soluțiile tehnice de arbitraj promit o cale fină de a ajunge la echilibru. Cum funcționează? Ce provocări ridică? Și mai ales ce oportunități aduc? Explorăm mecanismele din spatele automatizării arbitrajului și al impactului lor real.
Arbitrajul este o strategie financiară prin care un trader profită de diferențele de preț între două sau mai multe piețe, cumpărând la un preț mai mic de pe niște piețe și vânzând la preț mai mare pe alte piețe.
Oportunitățile sunt limitate și apar când există niște dezechilibre temporare ale pieței, când prețurile nu sunt bine aliniate din cauza diferențelor de lichiditate, viteză de execuție sau acces la informații.
Deși arbitrajul se poate aplica pe multiple tipuri de piețe, incluzând piețele financiare tradiționale (burse de valori, piețe de obligațiuni, piețe de mărfuri, forex), piețele fizice sau pariurile sportive, în continuare ne vom focusa doar pe piețele de criptomonede de tip spot pentru a exemplifica funcționarea unui bot de arbitraj.
Putem încadra piețele de criptomonede spot în următoarele mari categorii:
CEX-uri (exchange-uri centralizate);
în general, bazate pe order book: buy orders & sell orders;
DEX-uri (exchange-uri descentralizate);
în general, AMM-uri (automated market makers) bazate pe liquidity pools folosesc uzual un model matematic de tipul x*y = constantă;
Formal, definim profitul ca:
Profit=preț de vânzare - preț de cumpărare - costuri asociate
unde costurile asociate pot include comisioane de tranzacționare, costuri de transfer (în rețea sau între rețele), taxe și impozite (în funcție de jurisdicție) sau costuri tehnologice.
Un set minim de precondiții trebuie îndeplinit ca boții de arbitraj să genereze profit:
Diferențe de prețuri între exchange-uri (oportunități de arbitraj);
Lichiditate suficientă;
Latență minimă;
E nevoie de o viteză ridicată, deoarece ofertele pot să dispară foarte rapid.
Monitorizarea continuă a piețelor;
Gestionarea riscurilor;
Un bot de arbitraj trebuie să fie rapid, fiabil și modular, pentru a permite extinderea și adaptarea la noi exchange-uri, noi criptomonede și noi strategii.
Putem împărți arhitectura în mai multe module cu următoarele responsabilități:
Pentru ca un bot să poată interacționa cu exchange-urile în vederea executării unor ordere, este nevoie de niște precondiții în funcție de tipul exchange-ului.
În cazul CEX-urilor, putem exemplifica pașii necesari pentru Binance, cel mai mare exchange centralizat:
Utilizatorul botului de arbitraj își creează un cont care implică și trecerea printr-un proces de KYC.
Pentru interacțiunea cu un API există două variante dintre care putem alege:
System generated: prin API keys și secret keys (HMAC - criptare simetrică)
Se pot genera cel mult 30 API keys / cont.
Din motive de securitate, se recomandă restricționări la nivel de IP-uri care pot să interacționeze cu API-ul, iar periodic cheile pot fi invalidate.
Pentru fiecare API key, utilizatorul poate să activeze multiple restricții API, cele mai de interes fiind:
Enable Reading;
Enable Spot & Margin Trading;
În cazul DEX-urilor, utilizatorul trebuie să:
Își creeze un wallet (portofel) propriu.
Stocheze cheia privată a walletului în siguranță.
Asigură legitimitatea accesării funcționalităților oferite de exchange-uri.
Modul în care se realizează autentificarea și autorizarea depinde dacă vorbim de CEX-uri sau DEX-uri.
Pentru interacțiunea cu un exchange centralizat, vom exemplifica pașii necesari pentru a interacționa cu Binance.
Partea de REST API se poate folosi și pentru a prelua prețuri și ordinele plasate din piața, dar se pretează mai ales pentru obținerea balanței și pentru a plasa ordere:
API key & API secret pot fi folosite de către bot pentru interacțiunea cu exchange-ul.
API key - nu este secret în sine, fiind mai degrabă un identificator unic prin care Binance poate face identificarea. Totuși, e bine să evităm expunerea lui, fiindcă împreună cu Secret Key ar putea fi folosit pentru acces neautorizat. Fiind inclus într-un header al fiecărui request către API (ex: în câmpul X-MBX-APIKEY), acesta este vizibil în interacțiunea cu serverele Binance.
Botul va face un request HTTP de tip POST care ar arăta de forma:
Method: POST
URL: https://api.binance.com/api/v3/order
Headers:
Content-Type: application/x-www-form-urlencoded
X-MBX-APIKEY:
Request payload:
mbol=BTCUSDT&side=BUY&type=MARKET&
quantity=0.001×tamp=1710576000000&
signature=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u2v3w3x4y5z6
Pentru stream-urile publice (ex: orderbook) nu este nevoie de autentificare, deci pot fi accesate fără API Key sau Secret Key. În cazul în care exchange-ul oferă și o variantă premium pentru accesul la date, este posibil să fie necesară și autentificare, folosind un listenKey ce trebuie împrospătat periodic printr-un apel REST API
O cheie privată este un cod criptografic care permite accesul la fondurile dintr-un portofel digital și este folosită pentru a semna tranzacții. În contextul unui DEX (Decentralized Exchange), cheia privată este esențială pentru autentificarea utilizatorului și pentru autorizarea tranzacțiilor.
În timpul unui swap, cheia privată este utilizată programatic pentru a semna tranzacția care inițiază schimbul de criptomonede.
Este important să menționăm că această cheie privată nu trebuie să fie expusă sau partajată cu nimeni, deoarece compromiterea ei poate duce la pierderea fondurilor.
Colectează date de preț, orderele dintr-un order book și volumele în timp real de la mai multe exchange-uri. De asemenea, preia balanța userului pentru diverse criptomonede.
Componente:
Conectori: "market watchers" pentru fiecare exchange pentru a prelua date folosind WebSocket pentru date live și REST API pentru cereri statice.
Adaptor de date: normalizează datele preluate din exchange-uri la un format standardizat.
În cazul CEX-ului Binance, când avem nevoie de prețul curent pentru o pereche de criptomonede sau toate orderele plasate pentru acea pereche, folosim web sockets în fața REST API-ului din motive de performanță, pentru a evita interogarea continuă:
Se identifică stream-ul corect. De exemplu, pentru BTCUSDT avem variantele:
btcusdt@depth - implicită, pentru actualizări la nivel de secundă,
btcusdt@depth@100ms - pentru actualizări la fiecare 100ms,
Endpoint-ul pentru stream-urile publice este: wss://stream.binance.com:9443/ws , iar pentru a ne abona la date despre order book-ul BTCUSDT, ne putem conecta la wss://stream.binance.com:9443/ws/btcusdt@depth. Putem să o facem manual sau prin intermediul unei biblioteci puse la dispoziție de exchange care gestionează și cazurile de reconectare, backoff exponențial, etc.
Însă când preluăm balanța userului din exchange-ul centralizat, vom face o cerere cu API key și secret key cum a fost descris în secțiunea despre autentificare și autorizare.
În cazul DEX-ului Uniswap, după ce preluăm datele prin API (prin conectare la un nod Ethereum care ne permite să citim datele din blockchain sau folosind The Graph - printr-un query rapid de GraphQL) sau WebSockets (pentru a primi notificări despre evenimentele de pe rețea, cum ar fi cele de Swap), va trebui să efectuăm calcule pentru a stabili prețul token-ului de interes. Putem folosi API sau WebSocket. Uniswap nu are un server propriu care să ne ofere aceste funcționalități, fiind doar un protocol (smart contracts) de pe blockchain-ul Ethereum, iar pentru a prelua date de pe blockchain este nevoie de un nod dedicat ce necesită costuri ridicate. De aceea, se pot folosi soluții ca Infura sau Alchemy care oferă acces instant la un nod Ethereum, expunând și funcționalitate API peste HTTPS, dar și WSS, request-urile făcându-se pe bază de API key.
Componente:
Fee Calculator: Estimează comisioanele de tranzacționare și transfer
Comisioane de tranzacționare:
CEX - taxe de tip maker (dacă plasăm un order) / taker (dacă acceptăm unul sau mai multe ordere existente);
Comisioane de retragere/depunere
Comisioane de conversie valutară - dacă prețurile sunt în monede diferite;
Price Comparator: Compară prețurile între exchange-uri și calculează potențialul profit scăzând și fee-urile.
Calculează diferența absolută și procentuală între prețuri, ținând cont și de comisioane.
Pentru a minimiza riscurile, ține cont de sumele disponibile pentru tranzacționare, de valoarea absolută de potențial câștig, dar și de valoarea procentuală.
Nu se uită doar la prețul maxim/minim, ci se uită pe o adâncime mai mare de ordere în CEX / ce preț ar obține în DEX dacă ar mări suma tranzacționată de x ori.
Strategy Engine:
Tipuri de arbitraj (Ex: între exchange-uri, triunghiular în cadrul aceluiași exchange sau între exchange-uri).
Opportunity Filter: Filtrează oportunitățile pe baza unor praguri (Ex: profit minim de 0,5% după comisioane) și lichiditate.
Plasează ordinele pe exchange-uri pentru a exploata oportunitățile detectate.
Componente:
Order Manager: Gestionează execuția ordinelor de buy/sell.
Order Executor: Creează și trimite ordine (buy/sell) către exchange-uri.
Pentru interacțiunea cu un exchange descentralizat, vom exemplifica pașii necesari pentru Uniswap, un DEX important de tip AMM, bazat pe liquidity pools, de pe blockchainul Ethereum. Prețurile sunt calculate în timp real pe baza raportului dintre activele aflate în poolul de lichiditate și nu necesită existența unor ordere ca în cazul exchange-urilor centralizate.
Pașii pentru o tranzacție de swap sunt următorii:
Conectare la un provider Ethereum.
Definirea tokenilor implicați în swap.
Preluarea datelor despre perechea de tokeni.
Configurarea tranzacției dorite (ruta de schimb și parametrii trade-ului: cantitatea de tokeni de intrare, tipul tranzacției)
Calcularea cantității minime a tokenilor primiți - pe bază de slippage.
Generarea parametrilor swapului - necesari apelării Smart Contract-ului.
Semnarea și trimiterea tranzacției.
Pe lângă datele prepregătite anterior, se stabilește și gas-ul necesar.
Semnarea se face folosind cheia privată a walletului.
Protejează botul de pierderi.
Componente:
Balance Checker: Verifică disponibilitatea fondurilor pe fiecare exchange înainte de tranzacții.
Stop-Loss Mechanism: Oprește tranzacțiile dacă piața devine prea volatilă.
Salvează istoricul tranzacțiilor și al oportunităților și oferă utilizatorului un dashboard personalizat.
Gestionează setările și legătura dintre module.
Componente:
Fișiere de configurare: Permit utilizatorului să definească exchange-urile, perechile de tranzacționare, slippage-urile, pragurile de profit și cheile API.
Scheduler: Rulează botul continuu sau la intervale specificate.
Deoarece pe exchange-urile mari, pe criptomonedele cunoscute există deja o multitudine de boți de arbitraj foarte performanți și bine optimizați, oportunitățile reale de arbitraj rămân în cazul tokenilor mai puțin cunoscuți sau a exchange-urilor mai mici.
de Ovidiu Mățan
de Ioana Barboș