Újra lefuttattunk egy elmentett visszatesztet, és más tőkegörbét kaptunk. Ugyanaz a stratégia kódja, ugyanaz az időszak, ugyanaz a szimbólum. A záró egyenleg 1.8%-kal eltért, három kötés pedig egy gyertyával arrébb került.
Ez már elég ahhoz, hogy nehéz legyen megbízni egy kutatási eredményben. Ha egy csapattárs, a jövőbeli éned vagy egy papírkereskedési szolgáltatás nem tudja reprodukálni a futást, nem lehet megállapítani, hogy egy változtatás javította-e a stratégiát, vagy csak a kísérletet módosította. Így kerestük meg az eltérés forrását.
1. nap: Leírtuk, mit jelent az, hogy „ugyanaz a futás”
Az első hibánk az volt, hogy a stratégiafájlt magával a kísérlettel azonosítottuk. Pedig nem az volt. A futás a bemeneti adatoktól, a motor verziójától, a naptártól, az instrumentumok metaadataitól és a végrehajtási beállításoktól is függött. A kód csak a számítás egyik részét írta le.
Még bármi módosítása előtt összeállítottunk egy futási jegyzéket. Rögzítettük benne a stratégia commitját, az adatsnapshotok azonosítóit, az időszakot, a kereskedési helyszínt, a díjszabást, a finanszírozási adatforrást, a teljesülési modellt és a szoftververziókat. Az eredményül kapott megbízásokat és teljesüléseket is elmentettük, mert a tőkegörbe önmagában nem mutatja meg, hol tért el először a két futás.
| Elem | Mit rögzítsünk | Miért fontos |
|---|---|---|
| Piaci adatok | Snapshotazonosító, séma verziója, korrekciók | A szolgáltatók javítják az előzményeket és módosítják a vállalati események korrekcióit |
| Végrehajtás | Díjszint, finanszírozási adatsor, teljesülési és piaci hatás beállításai | Az alapértelmezések és a számlára vonatkozó feltételezések módosítják az eredményeket |
| Futtatókörnyezet | Kód commitja, a motor és a függőségek verziói | A könyvtárak megváltoztathatják a sorrendet, a kerekítést vagy az indikátorokat |
| Kimenet | Megbízások, teljesülések, pozíciók és mutatók | Megmutatja, hol kezd eltérni a két futás |
2. nap: A Sharpe-mutató helyett a kötéseket hasonlítottuk össze
Az összesítő mutatók elterelték a figyelmünket. A két futás Sharpe-mutatója szinte azonos volt, a teljesülési naplók viszont az első eltérést egy finanszírozási elszámolásnál mutatták. Az egyik futás az elszámolás időpontjában nyitott pozícióra terhelte a díjat, a másik pedig az időpontbeli újrasúlyozás utáni pozíciót vette alapul.
A stratégia kódja nem változott. A motor eseményfeldolgozási sorrendje viszont igen. Egy kisebb verziófrissítés egyértelművé tette a sorrendet ott, ahol korábban attól függött, hogyan rendeződött véletlenül két esemény.
A futási szerződést úgy módosítottuk, hogy rögzítse a sorrendet: először a finanszírozási díjat alkalmazzuk az elszámoláskor fennálló pozícióra, majd feldolgozzuk az adott időponthoz tartozó stratégiai döntéseket. A pontos szabály kereskedési helyszínenként és motoronként eltérhet. A hiba az, ha ezt nem rögzítjük.
3. nap: A „ugyanolyan” adatfájlról kiderült, hogy mégsem az
Az eseménysorrend rögzítése után a maradék eltérések néhány részvénypiaci kötésre összpontosultak. A szolgáltató korrigált egy múltbeli splitkorrekciót. A fájl neve és sorainak száma ugyanaz maradt, ezért úgy tűnt, mintha semmi sem változott volna.
Most minden változtathatatlan adatsnapshotot ujjlenyomattal látunk el, és mellé rögzítjük a korrekciós szabályzatot is. A hash megmutatja, hogy változtak-e a bájtok, de azt nem árulja el, hogy miért. Ezért a jegyzék az adatforrást, a lekérés idejét és az átalakítás verzióját is tartalmazza. A módosuló adatoknál ezek a részletek is az eredményhez tartoznak.
Egy reprodukálható visszatesztnél tudnunk kell válaszolni arra, hogy „a múlt melyik változatát látta?”
4. nap: Megtaláltunk egy rejtett alapértelmezett értéket
Az utolsó eltérést egy maker díj okozta, amely 0 volt, mert a stratégia konfigurációjából hiányzott ez a mező. Az újabb motor már alkalmazta a számlához tartozó alapértelmezett díjat. Ez az egyetlen alapértelmezés épp eléggé módosította a határesetnek számító kötéseket ahhoz, hogy megmagyarázza a záró egyenlegkülönbség nagy részét.
Kifejezetten megadjuk a gazdaságilag jelentős beállításokat, és a motort úgy állítottuk be, hogy a feloldott konfigurációt is beírja a futási nyilvántartásba. A felfedezés során kényelmesek az alapértelmezések. Az eredmények időbeli összehasonlításához azonban gyenge bizonyítékot jelentenek.
Mit csinálnánk másképp legközelebb
Fél napot töltöttünk az összesített mutatók összehasonlításával, mielőtt megnéztük volna az első eltérő teljesülést. Ne ezzel kezdjük. Rendezzük időbélyeg szerint mindkét eseménynaplót, és keressük meg az első eltérést; a későbbi eltérések gyakran ugyanabból az okból következnek.
Azt az elképzelést is elvetnénk, hogy egy konténerkép önmagában reprodukálhatóvá teszi a futást. A szoftverkörnyezet nagy részét rögzíti, de egy külső adatfájlt, futás közben lekért díjszabást vagy a szolgáltató módosított adatelőzményeit nem.
Ha megváltozik egy visszateszt, őrizzük meg mindkét futás jegyzékét és naplóit, majd egyszerre csak egy eltérési forrást javítsunk. A hasznos eredmény nem csupán egy újrafuttatható görbe. Olyan nyilvántartás, amely megmutatja, milyen adatok és feltételezések hozták létre, és miért térhet el a következő futás.
← Összes bejegyzés


