2. september 2026 · mikrostruktuur

Sinu limiitorderit ei täidetud: kiri järjekohast, maker-taganttestidest ja Sharpe’ist, mille sa välja mõtlesid

Sinu limiitorderit ei täidetud: kiri järjekohast, maker-taganttestidest ja Sharpe’ist, mille sa välja mõtlesid

Sa saatsid mulle eelmisel nädalal oma notebook’i: sama signaal, sama instrumentide valik, samad 14 kuud BTCUSDT perp’i andmeid. Muutunud oli ainult orderite täitmine. Sa ei ületanud enam hinnavahet, vaid jätsid ostuorderid ühe tick’i võrra turuhinnast ülespoole, ning Sharpe tõusis 0.42-lt 2.14-ni. Küsisid, kas tulemus on päris või läks midagi katki.

Midagi läks katki. Tahan sulle täpselt näidata, kus, sest viga on ühes reas, aga selle taga olev õppetund on palju suurem kui see rida.

Siin on sinu täitmisreegel, otse mootorist kopeerituna:

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

See tähendab: kui turul toimus selle minuti jooksul tehing minu hinnaga või sellest madalamal, siis sain orderi oma hinnaga täidetud. Tegelikult tähendab see aga, et hind puudutas sinu taset. Puudutamine ei tähenda täitmist. Nende kahe vahele jääb järjekord, mille sa oled modelleerinud tühjana.

Kes sinu ees seisavad

Kui esitad BTCUSDT perp’is ostuorderi hinnaga 84,120.0, jääb see kõigi samal hinnal juba ootavate orderite taha. Selle lepingu parima hinnaga tasemel on neid tavaliselt 4–30 BTC, olenevalt kellaajast; sinu valimi mediaan on umbes 12 BTC. Sinu order on 0.4 BTC. Tehingu tegemiseks peavad müüjad turuhinnaga müües ära täitma piisava koguse, et kõik enne sind saabunud orderid läbi järada. See peab juhtuma enne, kui taseme orderid tühistatakse või hind üles liigub.

Seega ei peaks taganttest küsima „kas hind jõudis tasemeni 84,120.0”, vaid „kas ajal, mil mu order seal ootas, täideti hinnaga 84,120.0 vähemalt 12.4 BTC turumüüke”. Need on täiesti erinevad sündmused. Sinu andmetes erinevad need umbes 3 korda.

12.4 BTCmediaankogus, mis oli puudutuse hetkel sinu ees
100%täitmismäär, mida taganttest eeldab
31%puudutustest, mille puhul järjekord sai tühjaks
4,180tehingut, millest sai umbes 1,300

Kolm täitmisreeglit, kolm eri strateegiat

Käivitasin sinu signaali uuesti samade sisenemiste ja kolme täitmismudeliga. Alfa, tasud ja rahastamiskulud jäid samaks. Muutsin ainult täitmisloogikat.

TäitmisreegelTäitedKeskmine 60 s hinnamuutus pärast täitmistSharpe
Puudutus: low <= limit4,180+2.6 bp2.14
Range läbimine: low < limit - 1 tick1,712+0.4 bp0.61
Taseme käibepõhine järjekorrasimulatsioon1,306+0.9 bp0.77

Keskmine rida on lihtne parandus, mille poole kõik esmalt haaravad: arvesta täide ainult siis, kui turg kauples sinu hinnast rangelt läbi, eeldades, et kui hind läks sinust mööda, pidi see sinu orderi ära täitma. Suund on õige ja see kaotab suurema osa fantaasiast. Samas tekitab see üsna vastiku kallutatuse, milleni jõuan kohe.

Alumine rida on see, mille peaksid valmis tegema. Selleks pole vaja L3 voogu ega iga orderi eraldi rekonstrueerimist. Enamik vajalikust on sul juba olemas.

Järjekorrasimulatsioon, mille saad aggTrades’i põhjal ehitada

Tõmba küünlaandmete asemel koondtehingute voog. Iga tehing sisaldab hinda, kogust, ajatemplit ja maker-poole lippu, mis näitab, kas agressor oli ostja või müüja. Sellest piisab sinu enda passiivse orderi korralikuks simulatsiooniks:

  1. Kui sinu order esitatakse, salvesta selle hinnataseme ootel kogus. Kui sul on ainult 100 ms raamatusööt, kasuta viimast hetktõmmist; viga on väike võrreldes sellega, mida praegu parandad.
  2. Määra queue_ahead = resting_size. Ole pessimistlik ja eelda, et oled järjekorra viimane. Oledki, kui sa just ise taset ei loo.
  3. Liigu tehinguvoos edasi. Iga müüja-agressori tehing hinnaga, mis on sinu hinnaga võrdne või sellest madalam, vähendab queue_ahead kogust tehingu mahu võrra. Kui väärtus muutub negatiivseks, täidetakse sinu order sinu hinnaga sellel ajatemplil.
  4. Kui hind liigub ühe tick’i võrra eemale, ära lähtesta järjekorra suurust nulli. Vähenda seda järk-järgult. Osa sinust ees olevatest orderitest tühistatakse, kui tase aegub, osa jääb alles. 30-40% vähenemine iga terve eemal oldud sekundi kohta sobis minu rekonstruktsioonidega paremini kui kumbki äärmus.
  5. Kui sinu strateegia tühistaks orderi ja esitaks uue, modelleeri uuesti esitamine uue orderina, mis jääb uue taseme järjekorra lõppu. Selle sammu jätavad inimesed vahele, ja just sinna peidab end allesjäänud fantaasia.

Samm 2 tekitab ilmselt tahtmise mulle vastu vaielda. Jah, vahel oled järjekorra alguses, sest esitasid orderi kohe, kui tase tekkis. Hästi — mõõda seda, ära eelda. Salvesta esitamise hetkel ootel kogus ja lase andmetel näidata, kui suur osa sinu orderitest on tõesti varakult kohal. Sinu strateegias oli see 11%, sest signaal käivitub pärast hinnaliikumist. See tähendab, et liitud juba olemasoleva tasemega, kus on juba teisi ootamas.

Saadud täited on need, mida oleksid tahtnud vältida

Nüüd jõuame tegelikult olulise osani ja põhjuseni, miks range läbimise reegel on kallutatud.

Mõtle, millal sinu ostuorder täielikult ära täidetakse. See juhtub siis, kui müügisurve on piisavalt suur, et kogu taseme tühjaks süüa. Ehk see juhtub definitsiooni järgi hetkel, mil turg liigub sinu hinnast allapoole. Kõige kindlamalt saadud täited on need, mille korral oled kohe kahjumis.

Jaga täited nende tekkimise viisi järgi rühmadesse ja mõõda 60 sekundi hinnamuutust:

Täitmise tüüpTäidete osakaalHinnamuutus 60 s pärast
Tase kaubeldi läbi, hind põrkas üles38%+3.1 bp
Tase kaubeldi läbi, hind jäi paigale21%+0.2 bp
Hind liikus sellest läbi vähemalt 2 tick’i võrra41%−2.4 bp

Sinu lihtsakoeline taganttest hõlmas kõiki kolme rühma ja luges nende täitmise tasuta teenuseks. Range läbimise reegel annab peaaegu ainult kolmanda rühma täited, mistõttu selle tootlus langes veel rohkem kui järjekorrasimulatsioonil. Kumbki pole õige. Järjekorrasimulatsioon annab realistliku jaotuse ning kogu mäng käibki selle jaotuse ümber: passiivne täitmine teenib sulle hinnavahe, kuid selle eest maksad ebasoodsa valikuga. Nende suhe ongi sinu tegelik strateegia.

Vana aktsiakauplemise laua võrdlus peab endiselt paika: maker-order on tasuta optsioon, mille sina turule kirjutad. Keegi kasutab seda siis, kui see talle kasulik on. Sinu taganttest korjas preemia kokku ja unustas, et optsiooniga kaasneb ka väljamakse.

Tehingud, mida sa ei saanud, muudavad strateegiat, mitte ainult kulusid

See on osa, mille üle tahan, et sa kõige rohkem mõtleksid. Kui modelleerid taker-täitmist halvasti, saad õiged tehingud vale hinnaga ning tasude korrigeerimine parandab suurema osa tulemusest. Kui modelleerid maker-täitmist halvasti, saad täiesti valed tehingud. Umbes 2,900 sinu 4,180 sisenemisest ei toimunudki. Mõned neist olid sinu parimad signaalid, küünaldel, mille hind sööstis läbi taseme ja pöördus siis tagasi — just sellistes olukordades liikus turg sinust eemale.

Seega peab täitmata orderi harul olema päris loogika. Mida strateegia teeb, kui sisenemisorderit ei täideta enne signaali aegumist? Kas sööstab taker-orderiga järele ning maksab hinnavahe ja turumõju? Esitab madalama hinnaga uue orderi ning lepib teistsuguse sisenemishinnaga? Jätab tehingu vahele ja jääb positsioonita? Iga valik annab märgatavalt erineva omakapitalikõvera ning ükski neist pole „eelda, et order täideti”. Meie katsetes taastas aus järelejõudmise reegel (ületamine pärast 20 sekundit täitmiseta, libisemine piiratud 3 bp-ga) umbes kolmandiku puuduvatest tehingutest ja ligikaudu poole lihtsakoelise mudeli ning järjekorrasimulatsiooni Sharpe’i erinevusest. See on tõesti huvitav tulemus, mis ilmneb alles siis, kui täitmismudel on piisavalt realistlik, et see küsimus oleks mõttekas.

Lihtne kontroll, kümme minutit: võrdle sama ajavahemiku reaalajas paberkaubanduse logi ja taganttesti. Võrdle täitmismäära, mitte PnL-i. Kui taganttest täidab 100% ootel orderitest, aga paberkaubandus 34%, siis sa ei võrdle strateegiaid, vaid sul on viga täitmismudelis. Paranda see enne, kui vaatad ühtegi tootlusnumbrit.

Veel paar väiksemat asja, kui juba räägime

Post-only tagasilükkamised. Kui kasutad post-only režiimi maker-tasude tagamiseks ja orderiraamat muutub sinu otsuse ning börsi kinnituse vahel, lükatakse order tagasi, mitte ei jäeta ootele. Meie paberkaubanduse logides juhtub seda tavalisel ajal 3-6% BTCUSDT katsetest ning USA CPI avaldamisele järgneval minutil üle 15% juhtudest. Tagasi lükatud order pole täidetud order ega täitmist ootav order. See on tehing, mida kunagi ei eksisteerinud. Kui sinu taganttestis selline olek puudub, on tehingute arv paisutatud just nendes turuolukordades, millest sa kõige rohkem hoolid.

Enda orderitega kauplemise vältimine ja sinu enda turumõju. 0.4 BTC-ga sa BTCUSDT hinda ei liiguta, nii et jäta see kõrvale. Mainisid aga, et tahaksid seda kasutada keskmise turuväärtusega altcoin’i perp’is, kus parima hinnaga taseme nimiväärtus on sageli alla $15k. Seal moodustab sinu order järjekorrast märkimisväärse osa ning salvestatud sinu ees oleva järjekorra maht hõlmab ka sinu viimase orderi mõju. Kui sinu order on üle umbes 10% ootel kogusest, peab simulatsioon arvestama, et teised osalised reageerivad sinu tegevusele. Ausalt öeldes usaldaksin selles punktis paberkaubandust rohkem kui ühtki simulatsiooni, mille sina või mina kirjutada suudame.

Käivita see järjekorrasimulatsiooniga uuesti ja saada mulle hinnamuutuste tabel täitmise tüübi järgi. Kui põrkerühmas on endiselt suurem osa tootlusest ning läbi kauplemise rühm seda kõike ära ei söö, võib sul olla midagi, mida tasub paberil katsetada. Kui kogu tulemus tuli neist 2,900 täitest, mida sa tegelikult poleks saanud, on parem seda teada nüüd, kui pärast nelja nädalat paberikonto jälgimist ja avastamist, et see ei tee seda, mida notebook lubas.

limiitorderidjärjekohtebasoodne valiktaganttestiminekrüptofutuurid
← Kõik postitused