Käynnistimme paperistrategian uudelleen kesken kaupan ja saimme eri toimeksiantosarjan kuin ennen uudelleenkäynnistystä. Sama markkinadata, sama strategian versio, sama tilin saldo. Signaalilaskenta täsmäsi. Strategian muistikuva positiostaan ja odottavista toimeksiannoistaan ei täsmännyt.
Jäljitimme poikkeaman päivän kestäneessä toistotyössä. Hyödyllinen opetus oli yksinkertainen: uudelleenkäynnistys on ohjelmistollesi markkinatapahtuma. Jos et testaa, miten strategia rakentaa tilansa uudelleen, siisti backtest voi peittää alleen paperijärjestelmän, joka unohtaa omistuksensa.
09:10 — Valitsimme tylsän position
Testistrategia kävi kauppaa likvidillä perpetual-sopimuksella: se avasi pitkän position, kun lyhyt liukuva keskiarvo ylitti pidemmän, ja sulki sen vastakkaisessa risteämässä. Aloitimme toiston niin, että pieni positio oli jo auki ja sitä keventävä reduce-only-rajahintatoimeksianto odotti täyttymistä. Palautuksen piti siis selvittää kaksi asiaa: mitä omistimme ja mitä olimme jo pyytäneet kaupankäyntipaikkaa tekemään.
Tarkistushetkellä tilillä oli 0.04 sopimusta. Avoin toimeksianto koski 0.01 sopimusta. Strategiaprosessi oli tallentanut molemmat arvot muistiin, mutta käynnistyspolku haki vain position. Se käsitteli välimuistissa ollutta toimeksiantoa ikään kuin sitä ei enää olisi.
09:25 — Ensimmäinen kaksoistoimeksianto ilmestyi
Uudelleenkäynnistyksen jälkeen strategia näki olemassa olevan pitkän position, suoritti signaalilogiikkansa ja lähetti uuden 0.01 position keventävän toimeksiannon. Paperikaupankäyntipaikalla oli nyt kaksi aktiivista toimeksiantoa. Kumpikaan ei yksinään ollut virheellinen. Yhdessä ne saattoivat kuitenkin myydä kaksinkertaisen määrän, jos molemmat täyttyisivät.
Aluksi syytimme signaalisilmukkaa. Vika ei ollut silmukassa vaan puutteellisessa tilannekuvassa. Strategia kysyi: ”Mikä positio minulla on?” mutta ei koskaan kysynyt: ”Mitkä toimeksiannot ovat yhä voimassa?”
| Tila uudelleenkäynnistyksen jälkeen | Prosessin käsitys | Tilin todellinen tila |
|---|---|---|
| Positio | Pitkä 0.04 | Pitkä 0.04 |
| Avoimet kevennystoimeksiannot | Ei yhtään | Kaksi, kumpikin 0.01 |
| Tavoiteltu altistus yhden täyttymisen jälkeen | Pitkä 0.03 | Voi pienentyä pitkään positioon 0.02 |
10:00 — Korjasimme palautuksen ja löysimme sitten ajoitusongelman
Muutimme käynnistystä niin, että tila rakennetaan uudelleen tilin positioista ja avoimista toimeksiannoista ennen uusien päätösten sallimista. Kaksoistoimeksianto katosi. Sitten teimme yhteyskatkosta sotkuisemman: yksi toimeksianto täyttyi strategian ollessa offline-tilassa, ja täyttymisilmoitus saapui vasta yhteyden palauduttua.
Tilin tilannekuva sisälsi jo täyttymisen. Myöhästynyt ilmoitus pienensi paikallista positiota sen jälkeen vielä toistamiseen. Muutaman sekunnin ajan strategia luuli, että sillä oli 0.02 sopimusta, vaikka tilillä oli 0.03. Seuraava tasapainotus perustui kuvitteelliseen vajaukseen.
Lisäsimme täsmäytyssäännöt: tilin tilannekuvaa käsitellään lähtötilanteena, tapahtumatunnisteiden avulla sivuutetaan jo siinä näkyvät täyttymiset, eikä toimeksiantoja lähetetä ennen kuin ensimmäinen synkronointi on valmis. Ilmoitus voi saapua myöhässä tai kahdesti. Palautuksen on kestettävä molemmat tilanteet.
13:40 — Toisto paljasti huomaamattoman poikkeaman
Toistimme saman hintapolun alkuperäisessä ja uudelleenkäynnistetyssä ajossa. Loppu-P&L:n vertailu ei olisi paljastanut ongelmaa: molemmat versiot päätyivät samaan positioon markkinan käännyttyä. Toimeksiantotapahtumien vertailu toi sen esiin.
Kirjasimme jokaisen päätöksen yhteydessä sen lukeman tilan: position, avoimet toimeksiannot, viimeksi käsitellyn täyttymisen tunnisteen, signaaliarvon ja strategian version. Ensimmäiselle poikkeavalle tapahtumalle löytyi selitys. Yhdessä ajossa näkyi voimassa oleva toimeksianto, toisessa lista oli tyhjä. Myöhemmin toisessa ajossa täyttymä käsiteltiin kahdesti.
Sama loppusaldo ei todista, että toiminta oli samanlaista. Vertaa päätösten ja toimeksiantojen järjestystä, etenkin palautuksen yhteydessä.
16:20 — Mitä tekisimme ensi kerralla toisin
Käytimme liian kauan hintadatan toistamiseen ennen kuin tarkistimme tilin tilasiirtymät. Ensi kerralla tuottaisimme virhetilanteet ensin ja pitäisimme markkinapolun lähes tasaisena. Näin ohjelmistovirhe erottuu helposti ilman, että epävakaa markkinaliike sotkee vianmääritystä.
- Käynnistä uudelleen position ja osittain täyttyneen toimeksiannon kanssa.
- Katkaise yhteys toimeksiannon lähettämisen jälkeen ja yhdistä uudelleen ennen täyttymisilmoituksen saapumista.
- Toimita sama täyttymistapahtuma kahdesti ja varmista, että se muuttaa tilaa vain kerran.
- Estä uudet toimeksiannot, kunnes positiot ja avoimet toimeksiannot on molemmat täsmäytetty.
- Vertaa päätös- ja toimeksiantolokeja keskeytymättömissä ja uudelleenkäynnistetyissä ajoissa.
Opimme myös tallentamaan palautustilannekuvan strategian version ja tapahtumalokin rinnalle. Sen ansiosta virhetilanne oli toistettavissa minuuteissa sen sijaan, että jonkun olisi pitänyt muistaa tarkka uudelleenyhdistämisen järjestys.
Paperistrategia, joka toimii oikein vain prosessinsa pysyessä käynnissä, ei ole läpäissyt täyttä harjoitusta. Käynnistä se uudelleen position ollessa auki, anna täyttymisten saapua myöhässä ja tarkista jokainen sen jälkeen lähettämä toimeksianto. Tarkoitus ei ole todistaa, ettei se koskaan vikaannu. Tarkoitus on tehdä palautuminen näkyväksi ennen kuin paperitili joutuu yllättäen opettamaan saman läksyn.
← Kaikki kirjoitukset


