2. syyskuu 2026 · mikrorakenne

Rajahintasi ei täyttynyt: kirje jonosijasta, maker-backtesteistä ja keksimästäsi Sharpe-luvusta

Rajahintasi ei täyttynyt: kirje jonosijasta, maker-backtesteistä ja keksimästäsi Sharpe-luvusta

Lähetit notebookin viime viikolla: sama signaali, sama instrumenttijoukko, samat 14 kuukautta BTCUSDT-perpetuaalidataa. Ainoa muutos oli toteutustapa. Lopetit spreadin ylittämisen ja aloitit lepäävien ostotarjousten asettamisen yhden tikin päähän, ja Sharpe nousi 0.42:sta 2.14:ään. Kysyit, onko tulos todellinen vai hajosiko jokin.

Jokin hajosi. Haluan käydä kanssasi läpi tarkalleen, missä, sillä bugi on yhden rivin mittainen, mutta sen taustalla oleva opetus on paljon riviä suurempi.

Tässä on täyttösääntösi suoraan moottoristasi:

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

Säännön mukaan sain täytön rajahinnallani, jos markkinassa tehtiin tämän minuutin aikana kauppa hintaani tai sen alle. Käytännössä se tarkoittaa, että hinta kävi tasollasi. Käyminen ei ole täyttyminen. Niiden välissä on jono, jonka olet mallintanut tyhjäksi.

Mitä edessäsi on

Kun asetat BTCUSDT-perpetuaaliin ostotarjouksen hintaan 84,120.0, liityt kaikkien siellä jo lepäävien tilausten perään. Sopimuksen parhaan hintatason jono on yleensä 4–30 BTC kellonajasta riippuen; otosjaksosi mediaani on noin 12 BTC. Toimeksiantosi koko on 0.4 BTC. Jotta pääset kauppaan, myyjien täytyy myydä tälle tasolle yhteensä niin paljon, että kaikki ennen sinua saapuneet toimeksiannot täyttyvät, ja tämän täytyy tapahtua ennen kuin taso perutaan alta tai markkina nousee siitä pois.

Backtestisi ei siis pitäisi kysyä ”saavuttiko hinta tason 84,120.0”, vaan ”toteutuiko hinnassa 84,120.0 vähintään 12.4 BTC:n edestä markkinamyyntejä samalla kun toimeksiantoni lepäsi siellä”. Nämä ovat täysin eri tapahtumia. Datassasi tapahtumien määrä eroaa noin kolminkertaisesti.

12.4 BTCedelläsi olevan jonon mediaanikoko kosketushetkellä
100%backtestisi olettama täyttöaste
31%kosketuksista, joissa jono edelläsi täyttyi
4,180kauppaa, joista jäljelle jäi noin 1,300

Kolme täyttösääntöä, kolme eri strategiaa

Ajoin signaalisi uudelleen samoilla sisääntuloilla ja kolmella toteutusmallilla. Sama alfa, samat kulut, sama rahoitus. Vain täyttölogiikka muuttui.

TäyttösääntöTäytötKeskimääräinen 60 sekunnin tuotto täytön jälkeenSharpe
Kosketus: low <= limit4,180+2.6 bp2.14
Tiukka läpäisy: low < limit - 1 tick1,712+0.4 bp0.61
Volyymiin perustuva jonosimulaatio hintatasolla1,306+0.9 bp0.77

Keskimmäinen rivi on karkea korjaus, johon moni tarttuu ensin: täyttö hyväksytään vain, jos markkinahinta kävi rajahintasi ohi, sillä ajatuksella, että jos hinta meni siitä läpi, sen täytyi täyttää toimeksiantosi. Suunta on oikea ja suurin osa kuvitelmista katoaa. Sääntö on myös ikävällä tavalla vinoutunut, kuten kohta näet.

Alin rivi on se, joka sinun kannattaa rakentaa. Se ei vaadi L3-syötettä eikä toimeksiantokohtaista rekonstruktiota. Sinulla on jo suurin osa tarvittavasta.

Jonosimulaatio, jonka voit rakentaa aggTrades-datasta

Hae aggTrades-kauppavirta kynttilädataklinejen sijaan. Jokaisessa kauppatapahtumassa on hinta, määrä, aikaleima ja maker-puolen lippu, joka kertoo, oliko hyökkääjä ostaja vai myyjä. Siitä riittää oman passiivisen toimeksiantosi käyttökelpoiseen simulointiin:

  1. Kun toimeksiantosi asetetaan, ota talteen lepäävä määrä hinnallasi. Jos käytössäsi on vain 100ms:n kirjasyöte, käytä viimeisintä näkymää; virhe on pieni verrattuna korjaamaasi virheeseen.
  2. Aseta queue_ahead = resting_size. Oleta mieluummin pessimistisesti, että olet jonon viimeinen. Olet sitä, ellet itse luo hintatasoa.
  3. Käy kauppavirta läpi. Jokainen myyjän aloitteesta syntynyt kauppa hinnallasi tai sen alapuolella vähentää queue_ahead sen määrällä. Kun arvo muuttuu negatiiviseksi, toimeksiantosi täyttyy hinnallasi kyseisellä aikaleimalla.
  4. Jos hinta siirtyy yhden tikin päähän, älä nollaa jonoa. Anna sen pienentyä. Osa edelläsi olevista toimeksiannoista perutaan, kun taso vanhenee, osa jää. Rekonstruktioissani 30-40%:n pienentyminen jokaista kokonaista kosketuksen ulkopuolella vietettyä sekuntia kohti vastasi dataa paremmin kuin kumpikaan ääripää.
  5. Jos strategiasi peruisi toimeksiannon ja asettaisi sen uudelleen, mallinna uusi toimeksianto uuden hintatason jonon viimeiseksi. Tämä vaihe jää monelta pois, ja juuri sinne jäljelle jäävä kuvitelma piiloutuu.

Vaiheessa 2 haluat varmasti väittää vastaan. Kyllä, joskus olet lähellä jonon kärkeä, koska asetat toimeksiannon heti hintatason synnyttyä. Hyvä — mittaa se, älä oleta. Kirjaa lepojonon koko toimeksiannon asetushetkellä ja anna datan kertoa, kuinka moni toimeksiannoistasi todella on aikainen. Strategiassasi osuus oli 11%, koska signaalisi laukeaa liikkeen jälkeen. Silloin liittymäsi hintataso on jo olemassa ja siellä on jo väkeä.

Saamasi täytöt ovat juuri niitä, joita et olisi halunnut

Nyt päästään olennaiseen osaan ja syyhyn, miksi tiukan läpäisyn sääntö on vinoutunut.

Mieti, milloin ostotarjouksesi täyttyy kokonaan. Se tapahtuu, kun myyntipaine riittää syömään koko hintatason. Määritelmän mukaan markkina liikkuu silloin alas hintasi läpi. Varmimmin saamasi täytöt ovat juuri niitä, joissa jäät heti väärälle puolelle markkinaa.

Jaa täytöt niiden syntytavan mukaan ja mittaa 60 sekunnin mark-out:

TäyttötyyppiOsuus täytöistäMark-out 60 sekunnin kohdalla
Hintatasolla tehtiin kauppoja, hinta pomppasi ylös38%+3.1 bp
Hintatasolla tehtiin kauppoja, hinta pysyi paikallaan21%+0.2 bp
Hinta kävi 2+ tikkiä rajahinnan ohi41%−2.4 bp

Yksinkertainen backtestisi antoi sinulle kaikki kolme ryhmää ja hinnoitteli ne kaikki ilmaisiksi. Tiukan läpäisyn sääntö antaa lähes yksinomaan kolmannen ryhmän täytöt, minkä vuoksi sen etu romahti jonosimulaation etua enemmän. Kumpikaan ei ole oikein. Jonosimulaatio antaa realistisen jakauman, ja koko peli on siinä: passiivinen toteutus tuo spreadin verran tuottoa ja maksaa sen takaisin haitallisena valikoitumisena. Näiden suhde on strategiasi todellinen tuotto.

Vanha osakekaupan pöytäkirjamalli pitää yhä paikkansa: maker-toimeksianto on markkinoille kirjoittamasi maksuton optio. Joku käyttää sitä, kun sen käyttäminen kannattaa. Backtestisi keräsi option preemion ja unohti option tuottavan myös vastakkaiseen suuntaan.

Kaupat, joita et saanut, muuttavat strategiaa, eivät pelkkiä kuluja

Tämä on se kohta, jonka haluan sinun ottavan kunnolla mietittäväksi. Kun mallinnat taker-toteutuksen huonosti, saat oikeat kaupat väärään hintaan, ja kulujen korjaus oikaisee suurimman osan virheestä. Kun mallinnat maker-toteutuksen huonosti, saat kokonaan väärät kaupat. Noin 2,900 sisääntuloistasi 4,180:stä ei koskaan toteutunut. Osa niistä oli parhaita signaalejasi: kynttilöitä, jotka piikkasivat tason läpi ja kääntyivät. Juuri silloin markkina karkasi sinulta.

Täyttymättömän toimeksiannon haaralle tarvitset siis oikean logiikan. Mitä strategia tekee, jos sisääntulo ei täyty ennen kuin signaali vanhenee? Lähteekö se perään taker-toimeksiannolla ja maksaa spreadin sekä markkinavaikutuksen? Asettaako se uuden tarjouksen alemmas ja hyväksyy eri sisääntulohinnan? Jättääkö se kaupan väliin ja pysyy ilman positiota? Kukin vaihtoehto tuottaa olennaisesti erilaisen oman pääoman käyrän, eikä mikään niistä ole ”oletetaan, että toimeksianto täyttyi”. Ajoissamme rehellisen kiinniottosäännön lisääminen (ylitetään spread 20 sekunnin kuluttua, jos toimeksianto ei ole täyttynyt; lipsuma enintään 3 bp) toi takaisin noin kolmanneksen puuttuvista kaupoista ja suunnilleen puolet yksinkertaisen backtestin ja jonosimulaation Sharpe-lukujen erosta. Tämä on todella kiinnostava tulos, ja se tulee näkyviin vasta, kun täyttömalli on riittävän todellinen, jotta kysymys on mielekäs.

Nopea järkevyystarkistus, 10 minuuttia: vertaa live-paperikaupankäynnin lokiasi ja backtestiäsi samalta ajanjaksolta. Vertaa täyttöastetta, älä PnL:ää. Jos backtesti täyttää 100% lepäävistä toimeksiannoista ja paperikaupassa täyttöaste on 34%, et vertaile strategioita vaan sinulla on täyttömallin bugi. Korjaa se ennen kuin katsot yhtäkään tuottolukua.

Kaksi pienempää asiaa vielä

Post-only-hylkäykset. Jos käytät post-only-asetusta maker-maksuluokan takaamiseksi ja kirjan tilanne muuttuu päätöksesi ja pörssin kuittauksen välillä, toimeksianto hylätään lepäämisen sijaan. Paperikauppalokeissamme näin käy normaalina aikana 3-6%:lle BTCUSDT:n yrityksistä ja yli 15%:lle US CPI -julkistusta seuraavan minuutin aikana. Hylätty toimeksianto ei ole täyttynyt eikä lepäävänä täyttymättä jäänyt toimeksianto. Se on kauppa, jota ei koskaan ollut, ja jos backtestissäsi ei ole tätä tilaa, kauppojen määräsi paisuu juuri niissä markkinatilanteissa, joilla on eniten merkitystä.

Itsensä kanssa käytävän kaupan esto ja oma markkinajalanjälkesi. 0.4 BTC:n koolla et liikuta BTCUSDT-markkinaa, joten voit ohittaa tämän. Mainitsit kuitenkin haluavasi ajaa strategiaa keskisuuressa altcoin-perpetuaalissa, jossa parhaan hinnan nimellisarvo jää usein alle $15k:n. Siellä toimeksiantosi on merkittävä osa jonoa, ja ottamassasi jonokokoa edellä -lukemassa näkyy viimeisen toimeksiantosi vaikutus. Kun kokosi ylittää noin 10% lepäävästä määrästä, simulaation täytyy ottaa huomioon muiden markkinaosapuolten reaktiot sinuun. Rehellisesti sanottuna siinä vaiheessa luottaisin paperikauppaan enemmän kuin mihinkään simulaatioon, jonka sinä tai minä voisimme kirjoittaa.

Aja se uudelleen jonosimulaatiolla ja lähetä minulle mark-out-taulukko täyttötyypeittäin jaoteltuna. Jos pomppuryhmä kantaa yhä suurimman osan tuotosta eikä läpimenoryhmä syö sitä kokonaan, sinulla saattaa olla jotain, jota kannattaa kokeilla paperikaupassa. Jos koko tulos perustui niihin 2,900 täyttöön, joita et olisi koskaan saanut, parempi oppia se nyt kuin neljän viikon päästä, kun paperitili ei teekään sitä, mitä notebook lupasi.

rajahintatoimeksiannotjonosijahaitallinen valikoituminenbacktestauskryptofutuurit
← Kaikki kirjoitukset