Tiistaina kello 08:00 UTC eräs kryptovaluuttojen kaupankäyntipaikka muutti keskihintaisen perpetual-sopimuksen tick-kokoa. Basis-strategiamme ei huomannut muutosta. Sen signaali näki yhä saman hintaeron spotin ja futuurien välillä, riskirajat pysyivät ennallaan ja backtest tuotti edelleen samoja tuloksia.
Paperikaupankäynnissä muutos huomattiin. Toimeksiantosovitin pyöristi ostorajan lähimpään sallittuun hintaan alaspäin. Näin toimeksianto päätyi yhden tickin alemmas kuin backtestissä mallinnettu hinta. Markkina kävi vanhassa hinnassa, simuloitu toimeksianto toteutui, mutta paperitoimeksianto jäi toteutumatta. Lounasaikaan mennessä strategian varasto oli vinoutunut.
Tapaus näytti pieneltä pyöristysvirheeltä. Todellisuudessa kyse oli mallin rajapinnasta: strategia tunsi hinnat, mutta backtest ei tuntenut kaupankäyntipaikan hintaruudukkoa.
Kävimme kauppaa yksinkertaisella basis-signaalilla: ostimme spotia ja myimme perpetual-sopimusta, kun futuuripreemio ylitti kynnysarvon. Toimeksiannot olivat passiivisia, koska odotettu basis-tuotto oli pieni. Muutama tick saattoi ratkaista, jäikö sisääntulosta tarpeeksi katteeksi kuluihin ja myöhempään sulkemiseen.
Mitä tick-koon muutos käytännössä muutti?
Ennen päivitystä perpetual-sopimuksessa hyväksyttiin hinnat 0.01:n välein. Sen jälkeen kyseisellä hintavälillä hyväksyttiin hintoja 0.05:n välein. Signaali laski tavoitemyyntihinnaksi 42,318.03, joka oli vanhan säännön mukaan kelvollinen. Uuden säännön mukaan hinta oli virheellinen.
Pörssi hylkäsi virheelliset hinnat, mutta sovittimessamme oli varatoiminto: se pyöristi myyntihinnan alaspäin arvoon 42,318.00. Sekin oli virheellinen. Toinen varatoiminto pyöristi hinnan uudelleen, tällä kertaa arvoon 42,318.05, joka oli kelvollinen mutta myyjälle vähemmän aggressiivinen. Toimeksiannolla ei enää voinut myydä mallinnettuun hintaan. Koodipolku oli kirjoitettu eri markkinalle, ja se muutti huomaamatta hylkäyksen uudelleenhinnoitelluksi toimeksiannoksi.
Tuo yksi toimeksianto nosti esiin kaksi erillistä kysymystä. Ensinnäkin, minkä hinnan kaupankäyntipaikka voi hyväksyä? Toiseksi, miten strategian tulisi toimia, kun sen haluama hinta ei osu ruudukkoon? Pörssi vastaa ensimmäiseen kysymykseen. Strategian tai toteutuspolitiikan on vastattava toiseen.
| Toimeksiannon tarkoitus | Ruudukon sääntö | Tavallinen pyöristyssuunta | Mitä se voi muuttaa |
|---|---|---|---|
| Ostoraja | Hinnan on oltava tickin monikerta | Alaspäin, jotta hinta pysyy rajalla tai sen alapuolella | Pienempi toteutumistodennäköisyys |
| Myyntiraja | Hinnan on oltava tickin monikerta | Ylöspäin, jotta hinta pysyy rajalla tai sen yläpuolella | Pienempi toteutumistodennäköisyys |
| Markkinoitava rajatoimeksianto | Myös hintarajoja on noudatettava | Riippuu suurimmasta hyväksyttävästä hinnasta | Ylittääkö toimeksianto spreadin |
Yhtä kaikissa tilanteissa oikeaa pyöristyssääntöä ei ole. Ostohinnan pyöristäminen alaspäin säilyttää ostajan hintarajoituksen, mutta voi pienentää toteutumisen todennäköisyyttä. Pyöristäminen ylöspäin voi tehdä toimeksiannosta markkinoitavan, mikä muuttaa kuluja ja markkinavaikutusta. Passiivisessa basis-sisääntulossamme toimeksiannon hiljainen siirtäminen oli väärä toimintatapa. Strategia oli valinnut tavoitteen; sovitin muutti sen taloudellisia ehtoja.
Miksi backtest näytti silti hyvältä?
Historiallinen toimeksiantosimulaattorimme käsitteli rajahintoja jatkuvina lukuina. Jos kynttilän alin hinta ylsi ostohintaan tai ylin hinta myyntihintaan, simulaattori kirjasi toteutuman. Se on jo valmiiksi suotuisa arvio passiiviselle toimeksiannolle, sillä kaupankäynti rajahinnassa ei kerro mitään jonosijastasi. Tick-päivitys teki ongelmasta vielä perustavamman: toimeksiantoa ei olisi voinut olla olemassa kyseisellä hinnalla.
Ajoimme samat päätökset uudelleen siten, että uutta ruudukkoa sovellettiin sen voimaantulohetkestä alkaen. Useita toteutumia katosi. Muutamien toimeksiantojen pyöristys siirsi hinnan spreadin yli, jolloin niistä kertyi taker-kulut maker-kulujen sijaan. Tämän seurauksena positioiden kehitys erosi, joten myös myöhemmät suojaukset ja sulkemiset muuttuivat. Sääntö, joka näytti metatiedolta, oli muuttanut koko kauppojen sarjaa.
Päivitys ei myöskään ollut kaavioon kätketty yllätys. Kaupankäyntipaikka oli julkaissut instrumenttisääntöjen muutoksen ja sen voimaantuloajan. Säilytimme markkinadataa huolellisesti, mutta instrumenttien metatiedot olivat käynnistyksen yhteydessä päivitettävässä välimuistissa. Backtest käytti tämän päivän sääntöjä kaikille historiallisille päiville; paperikaupankäynnissä säännöt olivat vanhentuneet, kunnes prosessi käynnistettiin uudelleen. Kumpikaan ympäristö ei kuvannut sitä, mitä kaupankäyntipaikka salli kullakin hetkellä.
Miten tick-koon muutokset tulisi mallintaa backtestissä?
Versioi instrumenttisäännöt voimassaoloväleittäin muiden ajankohdan mukaisten syötteiden tavoin. Säilytä vähintään voimaantuloaika ja toimeksiannon kelpoisuuden tarkistamiseen tarvittavat sääntöarvot: tick-koko, määrän askelkoko, vähimmäismäärä ja mahdolliset hintavälit. Simulaattorin tulee ladata sääntöjoukko, joka oli voimassa simuloidun päätöksen hetkellä.
Tee sitten toimeksiantojen käsittelystä yksiselitteistä. Jos tavoitehinta ei ole kelvollinen, hylkää se, pyöristä dokumentoidun käytännön mukaan tai laske tavoite uudelleen ruudukkoon sopivaksi. Kirjaa, mitä tapahtui. Backtest, joka korjaa automaattisesti jokaisen toimeksiannon, voi auttaa tietyn toteutuspolitiikan arvioinnissa, mutta se ei saa esittää tätä käytäntöä pörssin toteutumana.
Passiivisissa toimeksiannoissa tickin mukainen hinta on vasta ensimmäinen toteutumisen ehto. Tarvitset edelleen mallin sille, kävikö markkina hinnassasi, mikä oli edelläsi olevan jonon pituus, tapahtuiko peruutuksia ja minkä kulutason olisit saanut.
Lisäsimme kaksi tarkistusta. Ensimmäinen tarkistaa jokaisen luodun toimeksiannon ajankohdan mukaisten instrumenttisääntöjen perusteella ja pysäyttää ajon selkeään virheeseen, jos hinta tai koko ei kelpaa. Toinen vertaa backtestin ja paperikaupankäynnin sovittimen lopullista normalisoitua toimeksiantoa: suuntaa, hintaa, määrää, voimassaoloaikaa ja kuluaikomusta. Jos ne eroavat, ajoa ei pidetä vertailukelpoisena.
Sen jälkeen ajoimme tiistain muutoksen uudelleen. Backtest ei enää väittänyt toimeksiantojen toteutuneen hinnassa 42,318.03 ruudukon päivityksen jälkeen. Paperikaupankäynti ja simulaatio tekivät jokaisen virheellisen tavoitehinnan kohdalla saman päätöksen, vaikka päätös olisi ollut toimeksiannon ohittaminen.
Signaali ei ollut rikkoutunut. Sen oletukset kaupankäynnin kohteesta olivat vanhentuneet. Strategia voi selvitä uudesta tick-koosta, kunhan tutkimusjärjestelmä käsittelee kaupankäyntipaikan säännöt osana simuloimiaan markkinoita.
← Kaikki kirjoitukset


