La 08:00 UTC, într-o zi de marți, o platformă crypto a schimbat pasul minim de preț pentru un contract perpetuu cu preț mediu. Strategia noastră de bază nu a observat schimbarea. Semnalul vedea în continuare același spread între spot și futures, limitele de risc rămăseseră neschimbate, iar backtestul continua să afișeze aceleași rezultate.
Tranzacționarea pe hârtie a observat schimbarea în locul ei. Adaptorul de ordine a rotunjit în jos prețul ordinului limită de cumpărare, până la cel mai apropiat preț permis. Astfel, ordinul a ajuns cu un tick sub nivelul modelat de backtest. Piața a atins prețul inițial, ordinul simulat s-a executat, iar ordinul pe hârtie a rămas neexecutat. Până la prânz, poziția strategiei devenise dezechilibrată.
Incidentul părea o mică eroare de rotunjire. De fapt, era o problemă la granița modelului: strategia cunoștea prețurile, dar backtestul nu cunoștea grila de prețuri a platformei.
Tranzacționam pe baza unui semnal simplu de arbitraj: cumpăram spot și vindeam un contract perpetuu când prima futures depășea un prag. Ordinele erau pasive, deoarece avantajul anticipat al bazei era mic. Câțiva ticki puteau decide dacă intrarea aducea suficient cât să acopere comisioanele și ieșirea ulterioară.
Ce s-a schimbat odată cu pasul minim de preț?
Înainte de actualizare, contractul perpetuu accepta prețuri în trepte de 0.01. După actualizare, în banda de preț relevantă accepta trepte de 0.05. Semnalul calcula un preț-țintă de vânzare de 42,318.03, valid conform regulii vechi. Conform celei noi, prețul era invalid.
Bursa respingea prețurile invalide, dar adaptorul nostru avea o soluție de rezervă: rotunjea prețul de vânzare în jos, la 42,318.00. Nici acesta nu era valid. O a doua soluție de rezervă rotunjea din nou, de data aceasta la 42,318.05, care era valid, dar mai puțin avantajos pentru vânzător. Ordinul nu mai putea fi vândut la prețul modelat. Calea de cod fusese scrisă pentru o altă piață și transforma pe nesimțite respingerea într-un ordin cu preț modificat.
Acel ordin ridica două întrebări distincte. Mai întâi, ce preț poate accepta platforma? Apoi, cum ar trebui să reacționeze strategia când prețul dorit nu se află pe grilă? Bursa răspunde la prima întrebare. Strategia sau politica de execuție trebuie să răspundă la a doua.
| Intenția ordinului | Regula grilei | Direcția obișnuită de rotunjire | Ce poate schimba |
|---|---|---|---|
| Limită de cumpărare | Prețul trebuie să fie multiplu al pasului minim | În jos, pentru a rămâne la sau sub limită | Probabilitate mai mică de execuție |
| Limită de vânzare | Prețul trebuie să fie multiplu al pasului minim | În sus, pentru a rămâne la sau peste limită | Probabilitate mai mică de execuție |
| Limită executabilă imediat | Trebuie să respecte și limitele de preț | Depinde de prețul maxim acceptabil | Dacă traversează spreadul |
Nu există o regulă de rotunjire universal corectă. Rotunjirea în jos a unui ordin de cumpărare păstrează limita de preț a cumpărătorului, dar poate reduce șansele de execuție. Rotunjirea în sus poate face ordinul executabil imediat, ceea ce schimbă comisioanele și impactul asupra pieței. Pentru intrarea noastră pasivă pe baza dintre spot și futures, modificarea tacită a ordinului era comportamentul greșit. Strategia alesese o țintă; adaptorul îi schimbase economia.
De ce părea backtestul în continuare sănătos?
Simulatorul nostru istoric de ordine trata prețurile-limită ca numere continue. Dacă minimul barei atingea prețul de cumpărare sau maximul ei atingea prețul de vânzare, înregistra o execuție. Aceasta este deja o aproximare generoasă pentru un ordin pasiv, deoarece faptul că prețul tranzacționat a atins limita nu spune nimic despre poziția în coadă. Dar actualizarea pasului minim de preț a scos la iveală problema mai fundamentală: ordinul nu ar fi putut exista la acel preț.
Am reluat aceleași decizii aplicând noua grilă de la momentul intrării ei în vigoare. Mai multe execuții au dispărut. Câteva ordine s-au rotunjit la prețuri care au traversat spreadul și au atras comisioane taker în loc de comisioane maker. Traseul rezultat al poziției a deviat, așa că s-au schimbat și hedgingurile și ieșirile ulterioare. O regulă care părea simplă metadată modificase întreaga succesiune de tranzacții.
Iar actualizarea nu era o surpriză ascunsă într-un grafic. Platforma publicase o modificare a regulilor instrumentului, cu un marcaj temporal al intrării în vigoare. Stocam cu atenție datele de piață, dar metadatele instrumentelor se aflau într-o memorie cache reîmprospătată la pornire. Backtestul folosea regulile curente pentru toate datele istorice; tranzacționarea pe hârtie folosea reguli depășite până la repornirea procesului. Niciunul dintre medii nu reprezenta ce permitea platforma în fiecare moment.
Cum ar trebui să modeleze un backtest schimbările pasului minim de preț?
Versionați regulile instrumentelor cu intervale de valabilitate, la fel ca alte date disponibile la un moment dat. Cel puțin, păstrați momentul intrării în vigoare și valorile regulilor necesare pentru validarea ordinului: pasul minim de preț, pasul cantității, cantitatea minimă și eventualele benzi de preț. Simulatorul ar trebui să încarce setul de reguli valabil la momentul deciziei simulate.
Apoi faceți explicită gestionarea ordinelor. Dacă un preț-țintă este invalid, respingeți-l, rotunjiți-l conform unei politici documentate sau recalculați ținta pe grilă. Înregistrați ce s-a întâmplat. Un backtest care repară automat fiecare ordin poate fi util pentru estimarea unei anumite politici de execuție, dar nu ar trebui să prezinte acea politică drept o execuție pe bursă.
Pentru ordinele pasive, un preț valid pe grilă este doar prima condiție pentru execuție. Aveți în continuare nevoie de un model care să arate dacă piața a tranzacționat dincolo de prețul vostru, ce ordine erau înaintea voastră în coadă, ce anulări au avut loc și ce nivel de comision ați fi obținut.
Am adăugat două verificări. Prima validează fiecare ordin generat conform regulilor instrumentului valabile la momentul respectiv și oprește execuția cu o eroare clară dacă prețurile sau cantitățile sunt invalide. A doua compară ordinul final normalizat de adaptorul de backtest cu cel al adaptorului pentru tranzacționare pe hârtie: sensul, prețul, cantitatea, timpul de valabilitate și tipul de comision urmărit. Dacă diferă, rularea nu este considerată comparabilă.
După aceea, am reluat schimbarea de marți. Backtestul nu a mai pretins că s-au executat ordine la 42,318.03 după actualizarea grilei. Tranzacționarea pe hârtie și simularea au luat aceeași decizie pentru fiecare țintă invalidă, chiar și atunci când decizia a fost să omită ordinul.
Semnalul nu se stricase. Se învechiseră presupunerile despre instrumentul pe care îl putea tranzacționa. O strategie poate face față unui pas minim de preț nou, dar numai dacă sistemul de cercetare tratează regulile platformei ca parte a pieței pe care o simulează.
← Toate articolele


