Aveam o strategie de momentum BTC pe 1 minut care arăta onestă pe Binance. Comisioane taker, funding, un termen de impact în rădăcină pătrată pe care îl făcusem deja puțin prea aspru. Un walk-forward care nu ne-a făcut de rușine. Contul paper trăia pe Bybit, pentru că acolo erau cheile. Mi-am spus că BTC e BTC. Până vineri aveam o strategie care tranzacționase un lead-lag pe care nu-l puteam umple, și un Sharpe care aparținea unei burse pe care nu aveam cont.
Luni: un backtest curat pe Binance
Agentul aruncase ceva aproape plictisitor: randament pe 15 bare versus o medie lentă, long sau short pe open-ul barei următoare, închidere pe un stop sau după 12 minute. L-am forțat pe Binance USD-M BTCUSDT, 2023 până la începutul lui 2026, și am refuzat să ne uităm la orice rezultat înainte de costuri.
După 4.0 bps taker, funding orar și impact, Sharpe-ul walk-forward stătea la 1.6. Avantajul net mediu per fill era 3.4 bps. Numărul de tranzacții era destul de mare încât am încetat să mai scormonesc bootstrap-ul. Buffer-ul de latență pe care îl adăugăm oricum pentru stiva noastră (semnal către ordin, 40 de milisecunde într-o zi bună) abia l-a mișcat. Îmi amintesc că eram vag iritat că nu era mai fragil.
Marți: contul paper începe să „alunece”
Paper-ul a intrat live la 09:12 UTC. Același cod, aceiași parametri, aceeași regulă „next open”, îndreptat către BTCUSDT linear de pe Bybit. Prima după-amiază arăta ca o serie de ghinioane. Umpleam cu 2–8 bps mai prost decât replay-ul Binance al acelorași minute, întotdeauna în direcția tranzacției. Blotter-ul spunea slippage. Am crezut blotter-ul până când miss-urile s-au aglomerat pe minutele în care Binance pornise deja.
Peste noapte gap-ul nu a făcut mean-revert în felul în care un model zgomotos de fill face mean-revert. A rămas acolo. Un buy pe Bybit s-a printat la un preț pe care Binance îl arătase cu un beat mai devreme, apoi a sosit Bybit, apoi l-am plătit. Iar minutele pe care le voia strategia erau minutele în care cele două benzi divergau. În minutele liniștite, close-urile stăteau unul peste altul și strategiei nu-i păsa. Selecta divergența și o numea alpha.
Miercuri: două benzi, un ceas
Am tras ambele feed-uri de last-trade, le-am aliniat pe timestamp-urile burselor și am pus o întrebare obraznică: când BTC se mișca cu cel puțin 2 tick-uri, care venue printa primul? În orele calme Binance conducea Bybit pe circa două treimi din acele puseuri, cu un lead median în jur de 40 de milisecunde, ceea ce e în interiorul a multe conversații de „am adăugat latență” și în afara unei bare de 1 minut. În timpul printului CPI de marți lead-ul s-a întins în sute de milisecunde, și pentru câteva secunde urâte cele două last price-uri erau la $80 distanță. Stăteam acolo cu ambele scări de ordine deschise, privind Bybit cum aleargă un film pe care Binance îl proiectase deja.
Asta a fost aroma săptămânii, și nu e în Sharpe. Poți să știi, intelectual, că last price-urile din crypto sunt locale pe venue. E altceva să vezi aceeași monedă în două ferestre și să realizezi că una dintre ele trăiește în trecut.
Apoi am făcut testul pe care ar fi trebuit să-l cer luni. Păstrează semnalul Binance. Fill la next open-ul de pe Bybit. Ăsta e setul real de informații al contului paper dacă tragi cu ochiul la banda lichidă și tranzacționezi în altă parte, și e totodată o formă de lookahead pe care n-o vei primi niciodată în size: folosești un preț pe care venue-ul de execuție nu l-a printat încă. Avantajul a ajuns la 0.6 bps. Inversează (semnal Bybit, fill Binance) și fabrici o fantezie. Varianta Binance pe același venue a rămas la 3.4. „Strategia” era, în principal, să fii pe cartea mai rapidă.
Gap-ul de close pe 1 minut, pe minutele pe care le-am tranzacționat, avea o mediană de 4.1 bps. Necondiționat, pe toate minutele, era circa 1.5. Firește. Semnalul se declanșează când cineva a început deja să se miște. Măsurasem avantajul pe eșantionul selectat, care e exact locul în care trăiește dezacordul dintre venue-uri.
Obișnuiam să cred că cel mai urât bug de venue era maparea de simboluri, BTCUSDT versus BTC-PERP, un join care duplică în tăcere o poziție. Asta e contabilitate. Asta a fost să privești două cărți în timpul CPI și să observi că cercetasei o piață pe care nu o tranzacționez.
Joi: nici funding-ul, mark-urile și comisioanele nu erau aceeași piață
Odată ce recunoști că last price-urile sunt diferite, trebuie să recunoști că și restul contractului de market data e diferit. Copiasem grila de comisioane de pe Binance într-un cont paper Bybit și apoi ne întrebam de ce linia de costuri deriva.
| Intrare | backtest Binance | paper Bybit, săptămâna aia |
|---|---|---|
| Last price | Binance USD-M | Bybit linear |
| Comision taker | 4.0 bps | 5.5 bps |
| Interval de funding | orar | 00 / 08 / 16 UTC |
| Mark / index | coș Binance | coș Bybit |
| Qty min / tick | 0.001 / 0.10 | 0.001 / 0.10 |
| Matematica lichidării | niciodată atins, BTC | mark diferit, tot nu s-a atins |
Tick-ul și lot-ul s-au nimerit să coincidă pe BTC. N-aș generaliza. Pe cartea SOL la care am tras cu ochiul joi seara, atât tick size-ul cât și noționalul minim diferau, iar gap-ul de close pe minutele de tranzacție era 11 bps. Funding-ul era scurgerea mai lentă. Binance plătea orar. Bybit era încă pe ceasul de 8 ore pentru acel linear. O poziție ținută peste 01:00 UTC primea o taxă Binance în registrul de research și tăcere în paper, apoi o sumă în bloc la 08:00 pe care backtest-ul o picurase deja. Carry-ul se potrivea pe o săptămână și se contrazicea pe o după-amiază, care e exact orizontul pe care trăia strategia asta.
Comisioanele erau aproape plictisitoare, și tot au mâncat 1.5 bps dintr-o poveste de 3.4 bps. Lumea tratează 4.0 versus 5.5 ca pe o notă de subsol pentru că arată mic lângă o mișcare zilnică de 2%. Nu e mic lângă un avantaj de 3.4 bps. Știam deja asta. Doar că aplicasem cunoașterea la grila venue-ului greșit.
Vineri: o rulare nativă pe Bybit
Refaci totul pe OHLCV Bybit, ștampile de funding Bybit, 5.5 bps Bybit. Aceeași cale de cod, aceleași tăieturi walk-forward, aceeași funcție de impact. Sharpe 0.4. Avantaj net mediu 0.9 bps, care e în zgomotul unei strategii taker de 1 minut odată ce nu-i mai dăruiești primul look al Binance.
Era o piață diferită, nu una mai zgomotoasă. Paper-ul nu respinsese backtest-ul pentru că paper-ul e „mai realist” în abstract. Paper-ul executase într-o carte pe care research-ul n-o văzuse niciodată. 1.6 era consistent intern. Era consistent cu privire la bursa greșită.
Am lăsat versiunea Binance în arhivă cu o notă pe raport: nu pune în paper acest cont împotriva acestei benzi. Versiunea Bybit e cea care rămâne să ruleze, la un număr despre care nimeni n-ar scrie un thread. Ăsta e rezultatul corect. Îmi e încă un pic dor de 1.6, ceea ce e felul în care știi că făcea o muncă pe care n-o merita.
Ce am sări peste data viitoare
Scurtătura era sociologică. Binance e banda pe care fiecare vendor, fiecare notebook de research, fiecare default de agent vrea să ți-o pună în mână. Contul e acolo unde ai putut, de fapt, să-l deschizi. Cele două fapte par un detaliu de operațiuni. Ele sunt backtest-ul.
- Alege mai întâi venue-ul de execuție. Construiește banda de research din last price-urile, ștampilele de funding, mark-urile, tick-urile și treapta de comisioane ale acelui venue. Dacă default-ul vendorului e Binance, ăla nu e un default. E o strategie diferită.
- Dacă nu poți obține istoric pentru venue-ul pe care vei face paper, nu substitui o bandă care conduce și nu numi gap-ul slippage. Ori aștepți, ori tratezi banda străină ca pe un semnal întârziat și o decalezi până ar fi putut fi văzută în cartea de execuție.
- Când compari paper-ul cu backtest-ul, desparte deriva: gap-ul de last price pe minutele de tranzacție, linia de comisioane, timestamp-urile de funding, mark-ul folosit pentru stopuri. Blotter-ul de marți le-a amestecat pe toate patru și le-a etichetat slippage.
- Rulează testul încrucișat intenționat. Semnal pe A, fill pe B. Dacă acolo trăiește tot avantajul, nu ai o strategie. Ai un lead-lag pe care nu vei primi fill în size.
M-aș mai uita pe furiș la Binance când tranzacționez pe Bybit? Pentru un sanity check discreționar, da. Pentru un fill, nu. Contul paper ne-a spus deja cât valorează acea privire. Valează cei 4.1 bps pe care cealaltă sală i-a printat prima, și pe ăia nu-i primim.
← Toate articolele


