22. lokakuu 2026 · data

Rakensimme backtestin uudelleen, kun datatoimittaja muutti historiatietojaan

Rakensimme backtestin uudelleen, kun datatoimittaja muutti historiatietojaan

Kuusi viikkoa backtestin ajamisen jälkeen ajoimme sen uudelleen samalla koodilla, samoilla asetuksilla ja samalla päivämäärävälillä. Loppupääoma oli erilainen. Ero ei ollut valtava, mutta riittävä siirtämään Sharpe-suhteen arvosta 1.31 arvoon 1.08 ja muuttamaan sitä, mikä parametrisarja näytti parhaalta.

Strategia ei ollut muuttunut. Historiadata oli. Toimittaja oli korjannut useiden päivien kauppoja ja kynttilöitä, emmekä olleet säilyttäneet ensimmäisen ajon täsmällistä syötedatan tilannevedosta. Seuraavat päivät selvitimme, oliko uusi tulos datakorjaus, putkiston virhe vai tutkimusprosessi, jota emme pystyneet toistamaan.

Maanantai: uudelleenajo antoi eri tuloksen

Ensimmäinen vihje oli pieni ero likvidissä spot-parissa. Alkuperäisessä kynttilässämme huippu oli 62,418. Uudelleenajossa huippu oli 62,431. Ero näytti harmittomalta, kunnes jäljitimme strategian sisääntulon: sen kynnysarvo oli näiden hintojen välissä. Muutamat muuttuneet kynttilät tarkoittivat eri signaaleja ja sitä kautta eri positioita useita päiviä myöhemmin.

Vertasimme päivittäisiä kauppamääriä ja havaitsimme eron alkavan yhtenä päivänä. Sitten vertasimme kyseisen päivän syötteenä olleita raakadata-rivejä. Toimittajan tämänhetkisessä vastauksessa oli muutamia korjattuja kauppoja ja päivitetty koontikynttilä. Käyttämäämme vastaukseen ei liittynyt muutoslokia.

Tämä on datalle tavallista toimintaa. Pörssit korjaavat tietueita, toimittajat täydentävät puuttuvia tietoja, oikaisevat virheellisiä kauppoja ja muuttavat aggregointilogiikkaa. ”Tammikuun dataa” koskeva kysely voi palauttaa maaliskuussa eri vastauksen.

Tiistai: löysimme puuttuvan kuitin

Olimme tallentaneet ajotietueeseen toimittajan nimen, symbolin ja päivämäärävälin. Emme olleet tallentaneet itse vastausta emmekä kunkin syöteosion sisältötiivistettä. Pystyimme siis todistamaan, mitä olimme pyytäneet, mutta emme sitä, mitä tavuja toimittaja oli palauttanut.

Haettiin vanhimmat löytämämme välimuistitiedostot ja verrattiin niitä nykyiseen vastaukseen. Ero ei johtunut split-oikaisusta eikä aikavyöhykemuunnoksesta. Kyseessä oli pieni joukko korjattuja kauppatietueita, jotka kulkivat kynttilöiden muodostajan läpi. Se sulki pois yhden teorian, mutta välimuisti oli puutteellinen, joten emme silti pystyneet rekonstruoimaan jokaista muuttunutta kynttilää täsmälleen.

Mitä kirjasimmeMihin se antoi vastauksenMitä puuttui
Toimittaja, symboli, päivämääräväliMinkä pyynnön ajo tekiVastauksen sisältö
Putkiston versioMillä koodilla kynttilät muodostettiinTäsmälliset syöterivit
AjankohtaMilloin ajoimme työnMikä toimittajan versio oli silloin saatavilla

Olimme rinnastaneet ”saman kyselyn” ”samaan dataan”. Tämä oletus sai kokeen vaikuttamaan toistettavammalta kuin se oli.

Keskiviikko: korjaus muutti tulkintaa

Ajoimme muuttuneet päivät läpi käyttäen dataa molemmista saatavilla olevista versioista. Korjatut kynttilät poistivat kaksi sisääntuloa ja siirsivät yhtä ulostuloa kynttilällä. Nämä kolme kauppaa selittivät suurimman osan Sharpe-muutoksesta. Strategia oli herkkä muutamille laukaisukynnyksensä lähellä oleville havainnoille, vaikka hintasarja näytti kaaviossa lähes samalta.

Tämä ei tarkoittanut, että alkuperäinen tulos olisi ollut vilpillinen tai että korjattu tulos olisi automaattisesti parempi. Se tarkoitti, että väitteelle piti määritellä rajaus: vanha ajo kuvasi tuolloin käytössämme ollutta datatilannevedosta, kun taas uudelleenajo kuvasi toimittajan nykyistä historiadataa. Emme voineet rehellisesti kutsua toista toisen toistoksi.

Torstai: päivitimme tutkimustietueen

Lisäsimme uusiin tutkimusajoihin muuttumattomat syötedatan tilannevedokset. Jokainen osio saa sisältötiivisteen, ja ajon manifestiin kirjataan lähde, hakuajankohta, skeemaversio, oikaisukäytäntö ja muunnoskoodin versio. Suurten aineistojen varsinaiset tiedostot säilytämme sisältöosoitteisessa tallennuksessa, jolloin identtiset osiot voidaan jakaa aiempia versioita ylikirjoittamatta.

Jos tallennus- tai lisenssiehdot estävät raakadata säilyttämisen, säilytämme vahvimman ehtojen salliman kuitin: tiivisteet, pyynnön parametrit, lähteen version tunnisteet ja pienen näytteen jäsennetyistä riveistä vianmääritystä varten. Tiiviste ei voi palauttaa dataa, mutta sen avulla voimme havaita, etteivät kaksi ajoa käyttäneet samoja tavuja.

Toistettava backtest vaatii syötteen yksilöivän tunnisteen, ei pelkkää data-URL-osoitetta. Kirjaa, mitä saapui, milloin se saapui ja miten siitä muodostuivat strategian käyttämät rivit.

Perjantai: mitä jättäisimme ensi kerralla väliin

Jättäisimme väliin pelkkien päätunnuslukujen vertailun. Muuttunut Sharpe kertoo, että jokin muuttui, mutta ei paljasta syytä. Aloita rivimääristä ja osioiden tiivisteistä, ja etsi sitten ensimmäinen dataeroja sisältävä syötepäivä. Vertaa siitä lähtien muunneltuja rivejä, signaaleja, toimeksiantoja ja toteutumia tässä järjestyksessä.

Jättäisimme myös vanhan datan huomaamatta korvaamisen korjatulla historialla. Korjaukset ovat hyödyllisiä, mutta vanhojen ajojen tulee pysyä sidottuina alkuperäisiin syötteisiinsä. Uuden aineiston tulee luoda uusi ajo, jolla on selkeä yhteys vanhempaan ajoon.

Käytännön sääntömme on nyt yksinkertainen: jos uudelleenajon tarkoitus on toistaa koe, lukitse datan tilannevedos. Jos tarkoitus on hyödyntää korjattua historiadataa, merkitse se uudeksi kokeeksi. Opimme eron muutamassa päivässä, ja se näkyy nyt yhtenä rivinä ajon manifestissa.

markkinadatabacktestausdata engineeringtoistettavuus
← Kaikki kirjoitukset