Ajoimme tallennetun backtestin uudelleen ja saimme erilaisen pääomakäyrän. Sama strategian koodi, sama ajanjakso, sama instrumentti. Loppusaldo poikkesi 1.8%, ja kolmen kaupan ajoitus oli siirtynyt yhdellä kynttilällä.
Tällainen ero riittää horjuttamaan luottamusta tutkimustulokseen. Jos tiimikaveri, sinä itse myöhemmin tai paperikaupankäyntipalvelu ei pysty toistamaan ajoa, et voi tietää, paransiko muutos strategiaa vai muuttiko se vain koetta. Tässä on järjestys, jota noudatimme eron lähteen löytämiseksi.
Päivä 1: Määrittelimme, mitä ”sama ajo” tarkoittaa
Ensimmäinen virheemme oli pitää strategiatiedostoa koko kokeena. Se ei riittänyt. Ajo riippui myös syötedatasta, moottorin versiosta, kalenterista, instrumentin metatiedoista ja toteutusasetuksista. Koodi kuvasi laskennasta vain yhden osan.
Laadimme ajon manifestin ennen kuin muutimme mitään. Siihen kirjattiin strategian commit-tunniste, datan tilannevedosten tunnisteet, ajanjakso, kaupankäyntipaikka, kulutaulukko, rahoituksen lähde, täyttömalli ja ohjelmistoversiot. Tallensimme myös syntyneet toimeksiannot ja toteutumat, sillä pelkkä pääomakäyrä ei näytä, missä kaksi ajoa alkavat erota.
| Artefakti | Mitä kirjataan | Miksi sillä on merkitystä |
|---|---|---|
| Markkinadata | Tilannevedoksen tunniste, skeeman versio, oikaisut | Datantoimittajat korjaavat historiatietoja ja muuttavat yhtiötapahtumien oikaisuja |
| Toteutus | Kulutaso, rahoitussarja, täyttö- ja vaikutusasetukset | Oletusarvot ja tiliä koskevat oletukset muuttavat tuloksia |
| Ajoympäristö | Koodin commit-tunniste, moottorin ja riippuvuuksien versiot | Kirjastot voivat muuttaa järjestystä, pyöristystä tai indikaattoreita |
| Tuloste | Toimeksiannot, toteutumat, positiot ja mittarit | Näyttää, mistä kohdasta ajot alkavat erota |
Päivä 2: Vertasimme kauppoja Sharpen sijaan
Yhteenvetomittarit veivät huomion muualle. Ajojen Sharpe-luvut olivat lähes samat, mutta toteumalokeista löytyi ensimmäinen ero rahoituksen selvityksen kohdalla. Yhdessä ajossa korko veloitettiin selvityshetkellä avoinna olleelta positiolta, toisessa taas position uudelleenpainotuksen jälkeiseltä positiolta.
Strategian koodi ei ollut muuttunut. Moottorin tapahtumajärjestys oli. Pieni versiopäivitys oli tehnyt järjestyksestä eksplisiittisen, kun aiemmin se riippui siitä, miten kahden tapahtuman sattui käymään lajittelussa.
Täsmensimme ajon sopimusta järjestyksen osalta: kohdistetaan rahoitus selvitykseen siirtyvään positioon ja käsitellään sitten strategian päätökset kyseisellä aikaleimalla. Käytäntö voi vaihdella kaupankäyntipaikan ja moottorin mukaan. Virhe syntyy siitä, että järjestys jätetään määrittelemättä.
Päivä 3: ”Sama” datatiedosto osoittautui erilaiseksi
Kun tapahtumajärjestys oli lukittu, jäljelle jääneet erot keskittyivät muutamaan osakekauppaan. Datantoimittaja oli korjannut historiallisen split-oikaisun. Tiedostollamme oli sama nimi ja rivimäärä kuin ennen, joten se näytti muuttumattomalta.
Nyt luomme sormenjäljen jokaiselle muuttumattomalle datan tilannevedokselle ja tallennamme oikaisukäytännön sen rinnalle. Tiiviste kertoo, ovatko tavut muuttuneet, mutta ei selitä miksi. Siksi manifestiin merkitään myös lähde, noutoaika ja muunnoksen versio. Muuttuvan datan tapauksessa nämä tiedot ovat osa tulosta.
Toistettavan backtestin on vastattava kysymykseen: ”Minkä version menneisyydestä se näki?”
Päivä 4: Löysimme yhden huomaamattoman oletusarvon
Viimeinen ero johtui maker-kulusta, joka oli asetettu nollaan, koska strategian asetustiedostosta puuttui tämä kenttä. Uudempi moottori käytti tilin oletuskulua. Tämä yksittäinen oletusarvo muutti rajatapauksen kauppoja niin paljon, että se selitti suurimman osan loppusaldon erosta.
Määritimme taloudellisesti merkitykselliset asetukset eksplisiittisesti ja laitoimme moottorin tulostamaan ratkenneen kokoonpanon ajon tietoihin. Oletusarvot ovat käteviä kokeiluvaiheessa. Ne ovat heikkoa näyttöä, kun tuloksia verrataan eri ajankohtina.
Mitä jättäisimme ensi kerralla väliin
Käytimme puoli päivää koontimittareiden vertailuun ennen kuin katsoimme ensimmäistä erilaista toteutumaa. Älä aloita siitä. Lajittele molemmat tapahtumalokit aikaleiman mukaan ja etsi ensimmäinen ero; myöhemmät erot johtuvat usein samasta alkuperäisestä syystä.
Jättäisimme myös väliin ajatuksen, että konttikuvalla saa ajon yksinään toistettavaksi. Se lukitsee suuren osan ohjelmistoympäristöstä, mutta ei ulkoista datatiedostoa, ajon aikana haettua kulutaulukkoa tai datantoimittajan päivitettyä historiatietoa.
Kun backtest muuttuu, säilytä molempien ajojen manifestit ja lokit ja korjaa sitten yksi erojen lähde kerrallaan. Hyödyllinen tulos ei ole vain uudelleen ajettava käyrä. Se on tietue, joka kertoo, mikä data ja mitkä oletukset tuottivat sen sekä miksi seuraava ajo saattaa erota.
← Kaikki kirjoitukset


