5 septembrie 2026 · risc

Backtestul tău nu a fost niciodată lichidat: marja, prețul mark și nivelul de levier pe care l-ai ignorat

Backtestul tău nu a fost niciodată lichidat: marja, prețul mark și nivelul de levier pe care l-ai ignorat

Luna trecută, o strategie generată a produs o curbă a capitalului cu o scădere de 63%. Adâncă, urâtă, apoi o revenire lină în următoarele 6 săptămâni — genul de tipar la care un cercetător se uită atent și decide că poate fi suportat dacă reduci dimensiunea poziției. Am rulat-o din nou printr-un motor de marjă care știe ce este un nivel de marjă de întreținere. Contul a fost lichidat în ziua 41, în plină scădere, iar tot ce urma după ziua 41 era ficțiune.

Aceasta este cea mai costisitoare categorie de erori de backtesting pe care o cunosc, fiindcă nu îți denaturează randamentele cu câteva puncte de bază. Elimină din simulare o stare absorbantă. O strategie care poate ajunge la zero și una care nu poate sunt strategii diferite, iar un backtest care nu verifică niciodată marja nu îți poate spune pe care dintre ele o ai.

Iată 3 moduri în care văd mereu că se greșește.

Primul mod greșit: levierul ca număr cu care înmulțești randamentele

Cel mai des întâlnit tipar. Calculezi o serie de randamente pe baza semnalelor, decizi că vei tranzacționa cu levier 10x și înmulțești. Uneori abordarea e puțin mai sofisticată — dimensiunea poziției este equity * leverage / price — dar starea contului rămâne doar un scalar care urcă și coboară. Fără sold de marjă, fără limită pentru valoarea noțională, fără condiție de faliment.

Problema e subtilă, de aceea trece de revizuire. Sharpe nu depinde de scară, așa că valoarea principală nu se schimbă când modifici levierul de la 3x la 30x, iar cercetătorul trage concluzia că levierul e un reglaj gratuit, care schimbă volatilitatea pe randament. Scăderea maximă se scalează liniar și rămâne sub 100% printr-un accident aritmetic, fiindcă o serie de randamente înmulțite se apropie asimptotic de zero fără să îl depășească. Înmulțește o zi de -9% cu 12 și obții -108% în versiunea corectă și „-108%, dar curba capitalului e tot pozitivă” în cea naivă, în funcție de faptul că ai compus randamentele sau le-ai însumat. Le-am văzut pe amândouă.

Ce lipsește este faptul că levierul nu se aplică randamentelor. Se aplică garanției tale, iar garanția este o cantitate finită pe care bursa o monitorizează în fiecare secundă. Când scade sub cerința de marjă de întreținere, poziția nu-ți mai aparține.

Indiciul: dacă simularea ta nu poate produce o pierdere totală la niciun nivel de levier, atunci nu modelează levierul.

Al doilea mod greșit: un preț de lichidare calculat doar pe baza levierului

Al doilea nivel de sofisticare adaugă o verificare a lichidării, de obicei cam așa: la 20x, o mișcare nefavorabilă de 5% șterge marja, deci lichidezi la prețul de intrare × 0.95 pentru o poziție long. Simplu, intuitiv și greșit în 4 privințe deodată.

Platformele de contracte perp nu folosesc setarea levierului ca să decidă când ai pierdut. Folosesc o rată a marjei de întreținere care crește în trepte odată cu valoarea noțională a poziției, conform unui tabel de niveluri. O structură aproximativă pentru BTCUSDT USDⓈ-M, care se modifică atunci când platformele o revizuiesc:

Valoarea noțională a poziției (USDT)Rata marjei de întreținereLevier maxim
0 – 50,0000.40%125x
50,000 – 600,0000.50%100x
600,000 – 3,000,0001.00%50x
3,000,000 – 12,000,0002.50%20x
12,000,000 – 70,000,0005.00%10x

Așadar, mișcarea nefavorabilă pe care o poți suporta cu o poziție long izolată este aproximativ 1/L − MMR, nu 1/L. La 20x, în al doilea nivel, asta înseamnă 5% − 0.5% = 4.5%. O jumătate de procent pare o simplă rotunjire. La BTC, la 84,000, înseamnă 420 de dolari din preț, iar într-o oră violentă, 420 de dolari fac diferența dintre o umbră care te-a scos din poziție și una care nu. Fiecare umbră devine o aruncare cu banul, iar tu ai înclinat toate aruncările în favoarea ta.

Apoi vin comisioanele. Comisionul taker la intrare se scade din marjă în clipa în care ordinul este executat: 0.045% dintr-o valoare noțională de 500,000 înseamnă 225 USDT, scăzuți dintr-un sold de marjă de 25,000, ceea ce deplasează prețul de lichidare înainte ca poziția să fi făcut ceva. Funding-ul are același efect, încontinuu, iar la o valoare noțională cu levier impactul este mult mai mare decât se așteaptă cercetătorii:

4.55%mișcarea nefavorabilă efectivă până la lichidare la 20x, inclusiv comisionul de intrare
0.60%cost zilnic al funding-ului raportat la marjă la 20x, 0.01%/8h
18%din marja respectivă se pierde într-o lună fără variații

O poziție care nu face nimic timp de treizeci de zile — fără mișcări nefavorabile, fără tranzacții — a consumat aproape o cincime din garanție și și-a apropiat semnificativ prețul de lichidare. A treia și a patra problemă: nivelul de marjă se schimbă pe măsură ce mărești poziția, așa că o poziție care începe la nivelul de 0.5% și ajunge, prin mediere în sus, la nivelul de 1.0% primește un preț de lichidare mai nefavorabil decât cel calculat la intrare; iar marja cross pune garanția la comun între poziții, astfel încât supraviețuirea poziției tale long pe BTC depinde de evoluția poziției tale short pe ETH. Dacă simulezi marja cross ca pe un set de poziții izolate și independente, ai inversat structura de corelație a propriului cont.

Al treilea mod greșit: lichidarea este soluționată la prețul greșit, în momentul greșit și la execuția greșită

Să zicem că ai nimerit nivelul de declanșare. Acum: ce preț îl depășește, când verifici și la ce preț ți se execută ordinul?

Lichidarea este declanșată de prețul mark, un indice al mai multor platforme spot, cu o componentă de bază netezită, construit intenționat să reziste umbrelor de pe o singură platformă. Stop-loss-ul tău, în funcție de cum l-ai configurat, este probabil declanșat de ultimul preț tranzacționat. Cele două prețuri nu coincid exact când contează cel mai mult. În timpul unei cascade, ultimul preț al contractului perp se poate decupla cu 1–2% sub prețul mark timp de zeci de secunde. Un backtest care calculează atât stop-ul, cât și lichidarea pe baza aceluiași minim OHLCV modelează o platformă care nu există.

Aici sunt posibile ambele erori și nu se anulează reciproc. Dacă folosești ultimul preț, lichidezi la umbre pe care platforma le-a ignorat. Dacă folosești prețul mark, nu prinzi situația în care s-a mișcat chiar prețul mark — o decuplare a indicelui pe o platformă spot te poate lichida la un preț care nu s-a înregistrat niciodată pe contractul perp pe care îl tranzacționai.

Apoi vine execuția. Motoarele naive închid poziția la prețul de lichidare și înregistrează pierderea ca și cum ar fi un stop. În realitate, motorul de lichidare preia poziția la prețul de faliment — nivelul la care marja ta este exact zero, mai nefavorabil decât pragul de declanșare — și se percepe suplimentar un comision de lichidare, dependent de nivel și de aproximativ 1% din valoarea noțională pentru nivelurile inferioare. La 20x, 1% din valoarea noțională înseamnă 20% din marja rămasă. Dacă motorul execută ordinul sub prețul de faliment, fondul de asigurare acoperă diferența; pe unele platforme, dacă fondul se epuizează, pierderea socializată ajunge și la partea profitabilă a registrului de ordine. Pierderea realizată nu este scăderea până la prețul de lichidare. Este mai mare, iar diferența e maximă exact în zilele în care registrul de ordine era suficient de puțin lichid încât situația să fie cea mai gravă.

Întrebarea despre momentul execuției, din mecanica intrabar, capătă aici consecințe mai grave ca de obicei. Dacă o bară de 1-minute include atât nivelul take-profit, cât și nivelul de lichidare, un backtest care verifică ieșirile înaintea marjei va înregistra fără probleme câștigul. Platforma verifică marja la fiecare actualizare a prețului mark, aproximativ o dată pe secundă, înainte de orice altceva ai fi vrut să se întâmple.

Ce trebuie să urmărească motorul în schimb

Nimic din toate astea nu trebuie să fie exotic. Trebuie să țină cont de stare. Contul este un obiect cu un sold, nu o serie de randamente, iar la fiecare bară este actualizat în ordinea în care ar face-o platforma:

  1. Soldul portofelului și PnL-ul nerealizat, separat. Raportul marjei este marja de întreținere împărțită la soldul marjei, iar soldul marjei include PnL-ul nerealizat. Dacă le confunzi, o poziție pe pierdere pare să aibă o garanție mai bună decât în realitate.
  2. Tabelul de niveluri pentru fiecare simbol, cu versiuni datate. Nivelurile sunt revizuite. Un backtest din 2023 rulat cu nivelurile din 2026 introduce subtil informații din viitor — de obicei în avantajul tău, fiindcă în general platformele au relaxat în timp cerințele pentru activele majore.
  3. O serie de prețuri mark, nu doar klines. Dacă nu poți obține istoricul prețului mark, menționează asta în rezultate și folosește un indicator indirect prudent. Nu înlocui niciodată prețul mark cu ultimul preț în mod tacit.
  4. Verificarea marjei prima în ordinea evenimentelor barei, înainte de stop-uri, ținte, semnale sau reechilibrare.
  5. Execuții la prețul de faliment, plus comisionul de lichidare, cu rata comisionului preluată din același rând al nivelului ca MMR-ul.
  6. O stare terminală absorbantă. Când capitalul ajunge la zero, rularea se încheie. Fără resetarea bazei, fără „presupunem că traderul adaugă bani”, fără continuarea seriei cu o valoare noțională nouă.

Ultimul punct provoacă cele mai multe dezbateri. Cineva atrage mereu atenția că o echipă de tranzacționare reală ar depune mai multă garanție, deci oprirea simulării este nerealist de dură. Poate. Dar „strategia asta funcționează dacă tot îi dai bani după ce dă faliment” este o afirmație care merită formulată exact așa și testată intenționat, cu alimentările suplimentare ca parametru explicit, nu strecurate pe furiș ca setare implicită. Când o formulezi sincer, cei mai mulți descoperă că nu asta voiau să spună.

Beneficiul practic al tuturor acestor măsuri: când rulezi aceeași strategie pe hârtie, în paralel cu platforma live, raportul marjei raportat de bursă și cel calculat de simulator ar trebui să rămână la o diferență de cel mult 1 sau 2 puncte de bază, toată ziua. Acordul poate fi verificat în fiecare minut, pentru fiecare poziție deschisă, fără niciun cost. Este cel mai ieftin test de paritate din întregul sistem și aproape nimeni nu îl face — iar când cele două valori se abat, bursa are dreptate și ai o eroare pe care merită s-o găsești înainte s-o găsească scăderea în locul tău.

contracte futures perpetuelevierlichidaremotor de marjăbacktesting
← Toate articolele