Jest pytanie, przed którym umyka każdy backtest: czy ten sam kod, karmiony tym samym rynkiem na żywo, zrobiłby to samo? Nie odpowiesz na nie kolejnym backtestem. Odpowiesz tylko wtedy, gdy uruchomisz strategię na danych na żywo z realną semantyką egzekucji, a potem sprawdzisz — transakcja po transakcji — że oba światy się zgadzają. Robimy to sprawdzenie codziennie, automatycznie, i okazało się ono najbardziej produktywnym wykrywaczem błędów w całej platformie.
Dzień pierwszy: zbuduj lustro
Każda promowana strategia działa we własnym, odizolowanym węźle na żywo, konsumując prawdziwe strumienie z giełdy: kwotowania na żywo do wypełnień, realne spready, realne godziny sesji. Żadnego współdzielonego stanu między strategiami (nauczyliśmy się tego na własnej skórze — wspólny węzeł sprawiał, że zapytania o pozycje jednej strategii przeciekały do drugiej). Każde wypełnienie jest zapisywane wraz z wartością sygnału, który je wywołał.
Każdego ranka: powtórka i porównanie
Codzienne zadanie bierze okno paper tradingu każdej strategii, przepuszcza identyczny kod przez silnik backtestu na tym samym okresie na danych z katalogu i dopasowuje wypełnienia jeden do jednego: ta sama strona, ta sama tolerancja znacznika czasu, ten sam rozmiar. Wynikiem nie jest korelacja ani ogólne wrażenie. To tabela: dopasowane, tylko-paper, tylko-powtórka. Zdrowa strategia siedzi na 54 z 55 dopasowanych. Niezdrowa mówi ci dokładnie, która transakcja się rozjechała i kiedy.
Co się psuło, w kolejności psucia
- Wypełnienia w rozgrzewce. Węzeł na żywo podawał historię, żeby rozgrzać wskaźniki — a strategie z własnymi handlerami barów radośnie na niej handlowały. Backtesty nigdy nie widziały tych fantomowych wejść. Poprawka trafiła do warstwy składania zleceń, a nie do samej strategii, bo inaczej każda strategia dziedziczy ten błąd.
- Sekwencyjna rozgrzewka wielu nóg. Strategia cross-sectional rozgrzewała po jednym instrumencie naraz; każda noga widziała puste rodzeństwo, a kotwica nigdy się nie inicjalizowała. Na żywo nie handlowała wcale; w powtórce handlowała bez zarzutu. Zero dopasowanych transakcji — ale tylko porównanie powiedziało to na głos.
- Pętle awarii przez precyzję ticków. Ticki aggTrade na żywo przychodzą z inną precyzją, niż zakładał instrument w piaskownicy. Węzeł wpadał w pętlę awarii na asercji, której backtest nigdy nie mógłby wywołać, bo bary z katalogu są już znormalizowane.
- Amnezja po restarcie. Restart procesu ponownie odpalał logikę wejścia na pozycjach, które już istniały — dla strategii rebalansującej restart po cichu stawał się rebalansem. W handlu na żywo to nie jest przypis o parytecie; to czerwona flaga z pieniędzmi w tle.
Zauważ wzorzec: żaden z tych błędów nie dotyczy sygnału. Wszystkie siedzą na granicy egzekucji — rozgrzewka, stan, precyzja, restarty. To dokładnie ta klasa awarii, na którą backtesty są strukturalnie ślepe, bo w backteście to silnik backtestu jest granicą egzekucji.
Asymetrie, które utrzymujemy celowo
Oba światy z premedytacją nie są identyczne. Backtest nalicza modelowany pół-spread plus wpływ pierwiastkowy wewnątrz PnL; paper płaci realny spread w cenie wypełnienia i nie ma modelu wpływu. Dodanie modelowanego spreadu do papera (albo realnego do backtestów) liczyłoby to samo dwa razy. Parytet oznacza te same decyzje, te same wypełnienia w granicach tolerancji — a nie bit-w-bit identyczny PnL. Wiedza o tym, które różnice są zamierzone, a które to błędy, stanowi większość tej dyscypliny.
Backtest to hipoteza. Paper trading to eksperyment. Parytet powtórki to zeszyt laboratoryjny, który przyłapuje cię na oszukiwaniu samego siebie.
Jeśli prowadzisz strategie i nie porównujesz regularnie zachowania na żywo z zachowaniem w powtórce, masz całą kategorię błędów, których nigdy nie widziałeś. My znajdujemy jeden mniej więcej co dwa tygodnie — i każdy z nich był niewidoczny z wnętrza backtestu.
← Wszystkie wpisy
