Der er ét spørgsmål, enhver backtest smyger sig uden om: ville den samme kode, fodret med det samme marked live, have gjort det samme? Det kan du ikke svare på med mere backtesting. Du kan kun svare på det ved at køre strategien mod live data med ægte eksekveringssemantik og derefter tjekke — handel for handel — at de to verdener er enige. Det tjek kører vi hver dag, automatisk, og det har været den suverænt mest produktive fejlfinder i hele platformen.
Dag ét: byg spejlet
Hver promoveret strategi kører i sin egen isolerede live-node og forbruger rigtige børsstreams: live quotes til fills, rigtige spreads, rigtige sessionstider. Ingen delt tilstand mellem strategier (den lærte vi på den hårde måde — en delt node lod den ene strategis positionsopslag sive over i en andens). Hvert fill bliver registreret sammen med den signalværdi, der udløste det.
Hver morgen: replay og diff
Et dagligt job tager hver strategis paper-vindue, kører den identiske kode gennem backtest-motoren over samme periode på katalogdata og matcher fills én til én: samme side, samme tidsstempeltolerance, samme størrelse. Resultatet er ikke en korrelation eller en mavefornemmelse. Det er en tabel: matchede, kun-paper, kun-replay. En sund strategi lander på 54 ud af 55 matchede. En usund fortæller dig præcis hvilken handel der divergerede, og hvornår.
Hvad der gik i stykker, i den rækkefølge det gik i stykker
- Warmup-fills. Live-noden fodrede historik ind for at varme indikatorer op — og strategier med egne bar-handlers handlede muntert på den. De fantom-indgange så backtests aldrig. Rettelsen kom i afsendelseslaget, ikke i strategien, for ellers arver hver eneste strategi fejlen.
- Sekventiel multi-leg-warmup. En cross-sectional strategi varmede op ét instrument ad gangen; hvert ben så tomme søskende, og ankeret blev aldrig initialiseret. Live handlede den ingenting; i replay handlede den fint. Nul matchede handler — men kun diffen sagde det højt.
- Tick-præcisions-crashloops. Live aggTrade-ticks ankommer med en anden præcision, end sandkasse-instrumentet forventede. Noden crash-loopede på en assertion, som backtesten aldrig kunne udløse, fordi katalog-bars allerede er normaliserede.
- Genstartsamnesi. Procesgenstarter affyrede entry-logikken igen på positioner, der allerede fandtes — for en rebalancerende strategi blev en genstart stille og roligt til en rebalancering. I live trading er det ikke en fodnote om paritet; det er et rødt flag med penge på.
Læg mærke til mønsteret: ikke én af dem er en signalfejl. De er alle sammen fejl på eksekveringsgrænsen — warmup, tilstand, præcision, genstarter. Det er præcis den klasse af fejl, backtests er strukturelt blinde over for, for backtest-motoren er eksekveringsgrænsen i en backtest.
De asymmetrier, vi bevidst holder fast i
De to verdener er med vilje ikke identiske. Backtesten opkræver et modelleret halvt spread plus kvadratrods-impact inde i PnL; paper betaler det rigtige spread i fill-prisen og har ingen impact-model. At lægge det modellerede spread oveni paper (eller det rigtige oveni backtests) ville tælle dobbelt. Paritet betyder samme beslutninger, samme fills inden for tolerancen — ikke bit-identisk PnL. At vide hvilke forskelle der er principielle, og hvilke der er fejl, er det meste af disciplinen.
En backtest er en hypotese. Paper trading er eksperimentet. Replay-paritet er laboratoriejournalen, der fanger dig i at narre dig selv.
Hvis du kører strategier og ikke systematisk sammenligner live-adfærd med replay-adfærd, har du en kategori af fejl, du aldrig har set. Vi finder cirka én hver anden uge, og hver eneste var usynlig indefra backtesten.
← Alle indlæg
