2. september 2026 · mikrostruktura

Vaše limitno naročilo ni bilo izpolnjeno: pismo o položaju v čakalni vrsti, maker backtestih in Sharpu, ki ste si ga izmislili

Vaše limitno naročilo ni bilo izpolnjeno: pismo o položaju v čakalni vrsti, maker backtestih in Sharpu, ki ste si ga izmislili

Prejšnji teden ste mi poslali zvezek: isti signal, isti nabor instrumentov, istih 14 mesecev podatkov za BTCUSDT perp. Spremenilo se je samo izvrševanje. Nehali ste presegati razpon in začeli puščati ponudbe eno cenovno spremembo pod najboljšo prodajno ceno, Sharpe pa je zrasel z 0.42 na 2.14. Vprašali ste, ali je to resnično ali ste kaj pokvarili.

Nekaj ste pokvarili. Rad bi vam natančno pokazal kje, ker je napaka v eni vrstici, nauk za njo pa je veliko pomembnejši od te vrstice.

Tukaj je vaše pravilo za izvršitev, prepisano iz vašega pogona:

if bar.low <= limit_price: fill(limit_price)

To pravi: če je bila v tej minuti zabeležena transakcija po moji ceni ali nižje, sem bil izpolnjen po svoji ceni. V resnici pa kodira to, da se je cena dotaknila vaše ravni. Dotik ni izvršitev. Med njima je čakalna vrsta, vi pa ste jo modelirali, kot da je prazna.

Kaj stoji pred vami

Ko oddate nakupno ponudbo pri 84,120.0 za BTCUSDT perp, se postavite na konec vsega, kar tam že čaka. Na najboljši nakupni ceni te pogodbe je to običajno od 4 do 30 BTC, odvisno od ure; mediana v vašem vzorčnem obdobju je okoli 12 BTC. Vaše naročilo znaša 0.4 BTC. Da bi prišlo do posla, morajo prodajalci z dovolj skupnim obsegom zadeti to raven in izčrpati vse, ki so prispeli pred vami, še preden se raven prekliče pod vami ali se trg premakne navzgor.

Zato bi se moral vaš backtest vprašati: ne »ali je cena dosegla 84,120.0«, temveč »ali je bilo pri 84,120.0 izvršenih vsaj 12.4 BTC tržnih prodaj, medtem ko je tam čakalo moje naročilo«. To sta zelo različna dogodka. V vaših podatkih se razlikujeta za približno faktor tri.

12.4 BTCmediana obsega pred vami ob dotiku ravni
100%stopnja izvršitev, ki jo predpostavlja vaš backtest
31%dotikov, pri katerih je bila vaša čakalna vrsta izčrpana
4,180poslov, ki so jih postali približno 1,300

Tri pravila izvrševanja, tri različne strategije

Vaš signal sem ponovno izvedel z istimi vstopi in tremi modeli izvrševanja. Isti alpha, iste provizije, isto financiranje. Spremenila se je samo logika izvršitev.

Pravilo izvršitveIzvršitvePovprečni 60-sekundni donos po izvršitviSharpe
Dotik: low <= limit4,180+2.6 bp2.14
Strogo prebitje: low < limit - 1 tick1,712+0.4 bp0.61
Simulacija čakalne vrste po obsegu na ravni1,306+0.9 bp0.77

Srednja vrstica je grobi popravek, po katerem vsi najprej posežejo: izvršitev upoštevajte samo, če je trg trgoval strogo prek vaše cene, z utemeljitvijo, da vas je trg, če je šel mimo vaše cene, gotovo izčrpal. Smer je prava in odpravi večino fantazije. Vendar je tudi grdo pristranski, do česar se še vrnem.

Spodnja vrstica je model, ki ga morate izdelati. Ne potrebuje vira L3 niti rekonstrukcije posameznih naročil. Večino podatkov že imate.

Simulacija čakalne vrste, ki jo lahko sestavite iz aggTrades

Namesto klines pridobite tok združenih poslov. Vsak zapis vsebuje ceno, količino, časovni žig in oznako strani maker, ki pove, ali je bil agresor kupec ali prodajalec. To zadostuje za uporabno simulacijo vašega pasivnega naročila:

  1. Ko oddate naročilo, zajemite trenutno čakajoči obseg po svoji ceni. Če imate samo knjižno datoteko s posodobitvami vsakih 100ms, uporabite zadnji posnetek; napaka je majhna v primerjavi s tisto, ki jo odpravljate.
  2. Nastavite queue_ahead = resting_size. Bodite pesimistični in predpostavite, da ste zadnji. Saj ste, razen če sami ustvarite raven.
  3. Spremljajte tok poslov. Vsak zapis s prodajnim agresorjem pri vaši ceni ali nižje zmanjša queue_ahead za svojo količino. Ko vrednost postane negativna, je vaše naročilo izpolnjeno po vaši ceni in ob tem časovnem žigu.
  4. Če se cena premakne za eno cenovno spremembo stran, čakalne vrste ne ponastavite na nič. Zmanjšujte jo. Nekatera naročila pred vami se prekličejo, ko raven zastara, druga pa ostanejo. Zmanjšanje za 30-40% za vsako polno sekundo, ko cena ni na ravni, se je mojim rekonstrukcijam prilegalo bolje kot katera koli skrajnost.
  5. Če bi vaša strategija naročilo preklicala in ga oddala znova, novo naročilo modelirajte kot sveže naročilo na koncu nove ravni. Ta korak ljudje izpustijo in prav tu se skriva preostanek fantazije.

Pri 2. koraku se boste želeli prepirati z mano. Da, včasih ste blizu začetka vrste, ker ste naročilo oddali takoj, ko je nastala raven. Prav. To merite, ne predpostavljajte. Zabeležite čakajoči obseg ob oddaji in pustite podatkom povedati, kolikšen delež vaših naročil je res oddan zgodaj. Pri vaši strategiji je bil ta delež 11%, ker se vaš signal sproži po premiku, kar pomeni, da raven, ki se ji pridružite, že obstaja in je na njej že množica.

Izvršitve, ki jih dobite, so tiste, ki si jih želite, da jih ne bi bilo

Zdaj pa k delu, ki je zares pomemben, in razlogu, da je pravilo strogega prebitja pristransko.

Pomislite, kdaj je vaša nakupna ponudba v celoti izčrpana. To se zgodi, ko je prodajni pritisk dovolj velik, da poje celotno raven. Po definiciji je to trenutek, ko se trg pomika navzdol skozi vašo ceno. Izvršitve, o katerih ste najbolj prepričani, so tiste, pri katerih ste takoj v izgubi.

Razdelite izvršitve glede na to, kako so nastale, in izmerite 60-sekundni mark-out:

Vrsta izvršitveDelež izvršitevMark-out po 60s
Trgovanje na ravni, cena se je odbila navzgor38%+3.1 bp
Trgovanje na ravni, cena je ostala nespremenjena21%+0.2 bp
Cena je prebila raven za 2+ tikov41%−2.4 bp

Vaš naivni backtest je zajel vse tri skupine in vse ovrednotil, kot da so brezplačne. Pravilo strogega prebitja zajame skoraj izključno tretjo skupino, zato je njegova prednost upadla še bolj kot pri simulaciji čakalne vrste. Nobeno ni pravilno. Simulacija čakalne vrste vam da realistično mešanico in vsa igra je v tej mešanici: pasivno izvrševanje vam prinese razpon, nato pa vam ga vzame nazaj z neugodno selekcijo; razmerje med njima je vaša dejanska strategija.

Stari okvir z delniškega trgovalnega pulta še vedno drži: naročilo maker je brezplačna opcija, ki ste jo napisali za trg. Nekdo jo uveljavi, ko se mu to splača. Vaš backtest je pobiral premijo in pozabil, da ima opcija tudi izplačilni del.

Posli, ki jih niste dobili, spremenijo strategijo, ne le stroškov

To je del, o katerem bi najraje videl, da dobro premislite. Če slabo modelirate izvrševanje taker, dobite prave posle po napačni ceni, popravek provizij pa odpravi večino težave. Če slabo modelirate izvrševanje maker, dobite povsem napačen nabor poslov. Približno 2,900 od vaših 4,180 vstopov se sploh ni zgodilo. Nekateri so bili vaši najboljši signali, na svečah, ki so sunkovito prebile raven in se obrnile — točno tak vzorec, pri katerem je trg odšel brez vas.

Zato veja za neizpolnjeno naročilo potrebuje pravo logiko. Kaj naredi strategija, ko se vstop ne izvrši, preden signal zastara? Sledite ceni z naročilom taker in plačate razpon ter vpliv na trg? Oddate novo naročilo nižje in sprejmete drugačno osnovo vstopa? Preskočite posel in ostanete brez pozicije? Vsaka možnost ustvari bistveno drugačno krivuljo kapitala, nobena pa ne pomeni »predpostavite, da ste bili izpolnjeni«. V naših preizkusih je pošteno pravilo lovljenja cene (prestop vlogo po 20 sekundah brez izvršitve, z največ 3 bp zdrsa) povrnilo približno tretjino manjkajočih poslov in približno polovico razlike v Sharpu med naivnim modelom in simulacijo čakalne vrste. To je res zanimiv rezultat, ki se pokaže šele, ko je model izvrševanja dovolj realističen, da je vprašanje smiselno.

Hiter preizkus smiselnosti, deset minut: vzemite svoj dnevnik trgovanja v živo na papirju in backtest za isto obdobje. Primerjajte stopnjo izvršitev, ne PnL. Če backtest izvrši 100% čakajočih naročil, trgovanje na papirju pa 34%, nimate primerjave strategij, ampak napako v modelu izvršitev. To popravite, preden pogledate katero koli številko donosnosti.

Še dve manjši stvari, ko vas že imam

Zavrnitve post-only. Če uporabljate post-only, da si zagotovite cenovni razred maker, in se knjiga naročil premakne med vašo odločitvijo in potrditvijo borze, se naročilo vrne zavrnjeno, namesto da bi čakalo v knjigi. V naših dnevnikih papirnega trgovanja je to 3-6% poskusov na BTCUSDT v običajnih urah in več kot 15% v minuti po objavi CPI v ZDA. Zavrnjeno naročilo ni izvršeno naročilo in tudi ni čakajoče neizvršeno naročilo; gre za posel, ki se sploh ni zgodil. Če vaš backtest tega stanja ne upošteva, je število poslov napihnjeno prav v režimih, ki vas najbolj zanimajo.

Preprečevanje samoizvršitev in vaš tržni odtis. Pri 0.4 BTC ne premikate BTCUSDT, zato to izpustite. Omenili pa ste, da želite to preizkusiti na terminski pogodbi za altcoin s srednjo tržno kapitalizacijo, kjer je nominalna vrednost najboljše ravni v knjigi pogosto pod $15k. Tam je vaše naročilo pomemben delež čakalne vrste, številka čakajočega obsega pred vami, ki jo zajamete, pa vključuje vpliv prisotnosti vašega prejšnjega naročila. Ko vaša velikost preseže približno 10% čakajočega obsega na ravni, mora simulacija upoštevati, da se drugi udeleženci odzivajo na vas; odkrito povedano bi takrat bolj zaupal trgovanju na papirju kot kateri koli simulaciji, ki jo lahko napiševa jaz ali vi.

Znova zaženite backtest s simulacijo čakalne vrste in mi pošljite tabelo mark-outov, razdeljeno po vrsti izvršitve. Če skupina odbojev še vedno prispeva večino prednosti in skupina prebitij ne izniči vsega, imate morda nekaj, kar je vredno preizkusiti na papirju. Če je vse temeljilo na 2,900 izvršitvah, ki jih sploh ne bi dobili, je bolje to izvedeti zdaj kot po štirih tednih opazovanja papirnega računa, ki ne počne tega, kar je obljubljal zvezek.

limitna naročilapoložaj v čakalni vrstineugodna selekcijabacktestingkripto terminske pogodbe
← Vse objave