7 noiembrie 2026 · microstructură

Backtestul a citit prețul corect de pe piața greșită

Backtestul a citit prețul corect de pe piața greșită

La 10:14 UTC, o strategie simplă de străpungere a cumpărat un contract perpetual cripto după ce prețul a depășit maximul ultimelor 20 de minute. Backtestul a indicat o execuție la $64,210. Numărul apărea în date, semnalul avea marcajul temporal corect, iar ordinul simulat a fost trimis la bara următoare. Aproape că am numit rezultatul curat.

Apoi am aliniat ID-urile instrumentelor. Semnalul provenea de la contractul perpetual BTCUSDT. Execuția provenea de la un contract invers BTCUSD. Ambele se tranzacționau în jurul valorii de $64,210 și ambele erau piețe lichide. Totuși, aveau registre de ordine diferite, cu prețuri, mărimi de tick, adâncimi și grile de comisioane diferite. Backtestul combinase date dintr-o piață inaccesibilă oricărui trader.

Strategia în sine era banală: intrare la închiderea peste maximul mobil, ieșire la închiderea sub minimul mobil, iar fiecare poziție dimensionată la un risc fix în dolari. Problema a ieșit la iveală abia când am pus o întrebare mai precisă decât „cât valora BTC?”. Am întrebat: „ce ar fi putut cumpăra ordinul acesta, în acest contract exact, la momentul respectiv?”

Graficul era compozit înainte să pornească strategia

Fluxul nostru de date de cercetare facilita compararea platformelor. Normaliza simbolurile și afișa o serie de prețuri consolidate. Era utilă pentru a observa piața, dar nepotrivită ca referință pentru execuție. O serie compozită poate afișa cel mai bun preț de pe mai multe burse, deși strategia poate trimite un ordin pe o singură platformă.

La momentul străpungerii, maximul barei consolidate era $64,205. Ultima tranzacție a contractului selectat ajunsese deja la $64,218. Între timp, o cotație din cache pentru contractul invers încă afișa o ofertă de vânzare la $64,210. Simulatorul a folosit străpungerea dintr-o serie și oferta atractivă din alta. Fiecare valoare era reală. Împreună, însă, erau fictive.

IntrareCe a folosit backtestulDe ce avea nevoie ordinul
Maximul străpungeriiPrețul consolidat al BTCIstoricul prețului contractului selectat
Referință pentru intrareOferta de vânzare din cache pentru contractul inversOfertă de vânzare actualizată pentru instrumentul tranzacționat
Cantitatea executatăDimensiunea solicitată a pozițieiCantitatea disponibilă la fiecare nivel de preț

Un rând dintr-un tabel de date de piață poate părea complet, deși câmpurile lui descriu piețe diferite. Un alias de simbol nu dovedește că două instrumente folosesc același registru de ordine. ID-ul contractului, platforma, moneda de cotare și marcajul temporal trebuie păstrate împreună pe tot parcursul generării semnalului și execuției.

Am simulat din nou ordinul pe baza registrului de ordine

Am reluat intrarea folosind cea mai bună ofertă de vânzare proprie contractului perpetual selectat și actualizările registrului de ordine disponibile la momentul deciziei. Cotația era actualizată, dar la nivelul superior erau disponibili doar 0.18 BTC. Ordinul nostru simulat era de 0.50 BTC. Restul de 0.32 BTC ar fi fost executat la oferte de vânzare mai mari.

$64,218cea mai bună ofertă de vânzare la sosirea ordinului
0.18 BTCdisponibili la acel preț
$64,231prețul mediu ponderat cu volumul din simulare

Intrarea ajustată era cu $21 mai scumpă pe BTC decât execuția afișată, înainte de comisioane. Diferența e mică pentru o singură tranzacție. În testul complet, însă, strategia obținea cea mai mare parte din profitul brut din câteva străpungeri rapide. Simularea din nou a acelor intrări pe baza registrelor corecte a redus rezultatul brut cu 31%; comisioanele taker și impactul asupra pieței l-au redus și mai mult.

Am găsit și două cazuri în care cotația din registrul de ordine a sosit după momentul deciziei semnalului. Un backtest care unește datele pe baza celui mai apropiat marcaj temporal poate selecta pe nesimțite o actualizare viitoare. Acum facem asocierea înapoi în timp: cotația trebuie să fi fost observată până la trimiterea ordinului, iar vechimea ei este înregistrată. Dacă cea mai recentă cotație utilizabilă este prea veche, simulatorul marchează ordinul ca neexecutabil sau aplică o regulă explicită pentru datele învechite.

De ce este nevoie pentru ca un preț să fie tranzacționabil

Prețul de închidere al unei bare este util pentru calcularea unui semnal. Nu dovedește că un anumit ordin ar fi putut fi executat la acel preț. Pentru asta, prețul trebuie să corespundă instrumentului și platformei exacte, să fie disponibil la sosirea ordinului și să existe suficientă cantitate disponibilă în partea opusă pentru volumul solicitat. Când datele nu pot răspunde acestor întrebări, rezultatul onest este un interval sau o execuție lipsă, nu un preț exact inventat.

Am păstrat seria consolidată pentru contextul pieței și am scos-o din fluxul de execuție. Semnalele folosesc acum istoricul propriu al contractului ales; ordinele sunt simulate pe baza registrului de ordine al acelui contract, iar comisioanele și dimensiunea se aplică după calcularea execuției. Puțin mai multă infrastructură și o curbă a capitalului mult mai puțin măgulitoare.

Străpungerea chiar a avut loc. Backtestul doar i-a oferit o piață mai bună decât cea selectată de strategie.

contracte futures criptoregistre de ordinedate de piațăbacktestingexecuție
← Toate articolele