Walidacja backtestu: czego dane nie mówią wprost

Średni ~9 min czytania

Backtest to symulacja strategii na danych z przeszłości. Jego wynik jest oceną hipotezy, nie gwarancją tego, co stanie się jutro. Problem w tym, że krzywa kapitału z testu prawie zawsze wygląda lepiej niż to, co rynek odda na żywo, i to nie przez jeden błąd, tylko przez cztery różne sposoby, na które dane potrafią skłamać: liczymy na tych, którzy przetrwali, wpuszczamy informację z przyszłości, dopasowujemy parametry do szumu i zapominamy o kosztach. Każdy z nich z osobna zawyża wynik. Razem potrafią zamienić stratny system w pozornie zyskowny.

Dlatego u nas backtest pełni jedną rolę, węższą niż się wydaje: służy do odrzucania hipotez, nie do ich potwierdzania. Dobry backtest nie mówi „ta strategia zarabia”. Mówi „tej strategii nie udało się jeszcze obalić po kosztach”. To rozróżnienie decyduje o tym, czy uczymy się z danych, czy tylko utwierdzamy w błędzie. Pokażemy te cztery pułapki po kolei i to, jak każdą z nich blokujemy w naszym własnym systemie, bo łatwiej zaufać zasadzie, gdy widać, jak działa na liczbach.

Liczymy na tych, którzy przetrwali

Sztych: flota żaglowców płynących w złocie na powierzchni morza, a pod granatową taflą wody zarysy wraków wielu zatopionych statków. Widać tylko tych, którzy przetrwali.

Pierwsza pułapka jest cicha, bo dotyczy danych, których w zbiorze nie ma. Liczymy na spółkach, które dotrwały do dziś. Tych, które zbankrutowały, zostały wycofane z giełdy albo przejęte, w próbce już nie znajdziesz. System oparty na założeniu „mocne rosną” wygląda świetnie, dopóki testujesz go wyłącznie na ocalałych, bo z próbki wypadły właśnie te przypadki, w których założenie zawiodło najmocniej. To jest fałszywy pozytyw wbudowany w sam dobór danych.

W intraday na jednym instrumencie survivorship spółek nie dotyczy nas wprost, ale jego młodsza siostra owszem, i jest groźniejsza, bo trudniej ją zauważyć: liczenie tylko na transakcjach, które się odbyły. Jeśli mierzysz skuteczność setupu wyłącznie na sygnałach, w które wszedłeś, mierzysz na ocalałych dokładnie tak samo jak ktoś liczący na spółkach, które przetrwały. Sygnały odrzucone, te które nie spełniły progu, znikają z rachunku, a wśród nich kryje się informacja o tym, kiedy strategia milczała słusznie.

Dlatego w naszym systemie każdy sygnał trafia do bazy, nie tylko ten zaakceptowany. Setup z wynikiem scoringu poniżej progu dostaje status NO_TRADE i jest logowany razem z powodem, która składowa oceny była za niska. Sygnał na granicy dostaje status WATCH i też ląduje w bazie, choć nie wywołuje alertu. Cała populacja sygnałów jest widoczna, nie tylko ta, która „zadziałała”. Co ważne, odrzuconym sygnałom doliczamy też wynik, jaki dałyby po upływie horyzontu, gdybyśmy w nie weszli. Dopiero to pozwala sprawdzić, czy odrzucenie było słuszne, czy przegapiliśmy okazję, bo sama decyzja bez jej hipotetycznego skutku nic nie mówi o przegapionych szansach. Idziemy dalej: metryki liczymy osobno dla każdego typu setupu, nie jako jeden uśredniony wynik systemu. Agregat całości jest informacyjny, ale decyzje podejmujemy na poziomie pojedynczego setupu, bo jeden mocny wzorzec potrafi w średniej zamaskować trzy stratne i znów dostajesz fałszywy pozytyw, tym razem przez uśrednianie.

Wpuszczanie przyszłości do przeszłości

Sztych: wykres świecowy obok klepsydry, a zakrzywiona strzałka sięga od strony klepsydry z powrotem ku wcześniejszej świecy, wpuszczając informację z przyszłości do przeszłości.

Druga pułapka to look-ahead bias: strategia w teście korzysta z informacji, której w danym momencie realnie nie mogła mieć. To grzech, który najłatwiej popełnić i najtrudniej wykryć, bo wynik wygląda wtedy nie podejrzanie dobrze, tylko po prostu dobrze.

Najprostsza postać siedzi w samej cesze. Jeśli liczysz wskaźnik na zamkniętej świecy, a potem podejmujesz decyzję „w” tej świecy, to w teście znasz jej zamknięcie, a na żywo poznasz je dopiero, gdy świeca się domknie, czyli o całą świecę za późno. U nas warunek wejścia dla każdej cechy jest twardy: musi być stabilnie obliczalna z danych dostępnych w momencie, w którym zapada decyzja. Cecha liczona z zamknięcia bieżącego baru nie przechodzi tej bramki, choćby najlepiej wyglądała na wykresie.

Subtelniejsza postać to przeciek danych: informacja z przyszłości albo ze zbioru testowego sączy się do treningu bocznymi drzwiami. U nas rozdziela to sama architektura zapisu. Rekord, który model widzi w chwili decyzji, zawiera wyłącznie cechy policzone do tego momentu. Pola z wynikiem, czyli zrealizowane R, maksymalne obsunięcie w trakcie, czas do rozstrzygnięcia, są dopisywane dopiero po upływie horyzontu transakcji. W payloadzie decyzyjnym ich fizycznie nie ma, więc nie da się ich przypadkiem użyć. Analizy po fakcie robimy na pełnym rekordzie, ale model nigdy nie dostaje pól, których w realnym czasie by nie znał.

Przeciek ma też wersję, o której mało kto myśli: kalendarz zdarzeń. Jeśli backtest handluje w momencie, w którym na żywo obowiązywałby zakaz wejścia, na przykład tuż przed odczytem makro, to handluje na danych, których realnie by nie dostał. U nas twardy filtr NO_TRADE nadpisuje każdy wynik oceny. Nawet setup z maksymalną notą leci do kosza, jeśli w ciągu dziesięciu minut wypada zdarzenie wysokiej wagi. Ostatnia wersja przecieku jest na poziomie egzekucji i wrócimy do niej przy kosztach: backtest, który zakłada wypełnienie dokładnie po cenie sygnału, też zagląda w przyszłość, bo w realnym świecie fill jest gdzie indziej.

Zapamiętywanie szumu zamiast rynku

Trzecia pułapka to przeoptymalizowanie. Im więcej parametrów dokładasz i im dłużej je stroisz, tym lepiej system pasuje do przeszłości i tym gorzej do przyszłości. W pewnym momencie przestajesz opisywać rynek, a zaczynasz zapamiętywać szum tej konkretnej próbki. Krzywa kapitału robi się piękna, bo dopasowałeś ją do przypadkowych drgań, których jutro nie będzie.

Najczęściej overfitting nie jest jednym wielkim błędem, tylko sumą drobnych. Każda hipoteza sprawdzona na tych samych danych zwiększa szansę, że któraś wypadnie dobrze przez czysty przypadek. To wielokrotne testowanie: przetestuj dwadzieścia wariantów, a któryś prawdopodobnie pokaże świetny wynik, który nie ma nic wspólnego z przewagą. Stąd osobna miara, prawdopodobieństwo przeoptymalizowania, która pyta wprost, jak często konfiguracja wybrana jako najlepsza na treningu wypada słabo poza nim. Pokrewne ostrzeżenie niesie prawo Goodharta: kiedy miara staje się celem strojenia, przestaje być dobrą miarą.

Nasza obrona jest nudna i celowo taka jest. Po pierwsze prostota: model oceny ma cztery składowe i maksimum dziewięć punktów, bo prosty model ma mniej miejsc, w których da się ukryć szum, i łatwiej go zaudytować. Złożoność nie jest tu zaletą. Po drugie wąska klatka strojenia: parametry wolno ruszać tylko w niewielkim zakresie, na przykład próg wolumenu o 0,2, a nie dowolnie. Po trzecie hamulec na pętlę: najwyżej jedna zmiana parametru na pięćdziesiąt nowych sygnałów, żeby nie dostrajać systemu do każdego ostatniego wahnięcia. Po czwarte rejestr: każda zmiana zapisuje oczekiwaną wartość, trafność i wielkość próby przed i po. Bez tej pary liczb nie wiesz, czy poprawa jest realna, czy tylko wpasowałeś się w próbkę. Audyt to liczba, nie wrażenie. Ta sama zasada rządzi cechami: nowa wchodzi jako kandydat logowany do bazy, zbiera kilkaset próbek i dopiero porównanie oczekiwanej wartości z punktem odniesienia decyduje, czy zostaje. Jeśli nie wnosi informacji, wylatuje, bo każda zbędna cecha to kolejny stopień swobody, na którym model może zapamiętać szum.

Brutto kłamie, liczy się netto

Sztych: ozdobne nożyce tnące złotą krzywą kapitału. Odcięta prawa część wykresu opada i rozsypuje się na fragmenty. Koszty odcinające zysk brutto.

Czwarta pułapka jest najprostsza do zrozumienia i najczęściej pomijana w testach: koszty. Rzeczywisty wynik jest zawsze niższy niż teoria, bo prowizja, spread i poślizg zjadają przewagę, której w arkuszu nie widać. W intraday na futures koszt jest cichym zabójcą przewagi, a system, który nie liczy go jawnie od pierwszego dnia, buduje na piasku.

Policzmy to na MES. Prowizja w obie strony to około 1,30 dolara, a poślizg modelujemy konserwatywnie jako dwa ticki, czyli 2,50 dolara, łącznie 3,80 dolara na transakcję. Przy ryzyku na transakcję równym czterem punktom, czyli 20 dolarom, to koszt rzędu 0,19 R. I tu robi się ciekawie, bo ten koszt działa asymetrycznie: wygrana daje nie pełne +1 R, tylko +0,81 R, a przegrana kosztuje nie 1 R, lecz 1,19 R. Koszt ścina zysk i pogłębia stratę jednocześnie, więc backtest liczony brutto zawyża wynik po obu stronach, nie tylko „trochę zaniża zarobek”.

Najważniejsze pokazuje rachunek na trzech transakcjach. Wygrana, przegrana i pozycja zamknięta po czasie z drobnym plusem dają oczekiwaną wartość brutto +0,12 R, czyli system z pozorną przewagą. Po odjęciu kosztów ta sama trójka daje -0,07 R. Sam koszt zamienił znak wyniku: hipoteza, która brutto wyglądała na zyskowną, netto jest stratna. Dlatego liczy się oczekiwana wartość netto, nie brutto, i dlatego ostrożnie traktujemy metryki, które kosztów nie widzą, jak profit factor czy wskaźnik Sharpe’a liczone na surowych ruchach ceny.

Z tej arytmetyki płynie wniosek, który łatwo przeoczyć: im ciaśniejszy stop, tym koszt zjada większą część przewagi. Przy ryzyku dwóch punktów koszt rośnie do 0,38 R i do wyjścia na zero potrzebujesz aż 69 procent trafień, co w intraday jest trudne do utrzymania. Przy czterech punktach wystarczy 60 procent. Ten sam setup bywa rentowny brutto i stratny netto wyłącznie przez wybór wielkości ryzyka, a tej zmiennej backtest brutto w ogóle nie widzi. To także miejsce, gdzie wraca przeciek z egzekucji: jeśli test zakłada wypełnienie po cenie sygnału, po cichu zakłada zerowy poślizg, czyli wynik lepszy, niż rynek realnie odda.

Jak walidować, żeby nie kłamać

Skoro backtest tak łatwo kłamie, pytanie brzmi, jak go ustawić, żeby kłamał jak najmniej. Punkt wyjścia to rozdział próby treningowej od testowej: parametry dobierasz na jednej części danych, a oceniasz wyłącznie na drugiej, której strojenie nie widziało. U nas każda zmiana parametru jest sprawdzana na ostatnich dwudziestu procentach próbki, nieużytych do jej wyliczenia. Jeśli zmiana pogarsza wynik na tym wydzielonym kawałku, wraca skąd przyszła. To mikro-wersja podziału na trening i test wbita w codzienny mechanizm, nie rytuał raz na kwartał.

Mocniejszy wariant to walk-forward: stroisz na oknie przeszłości, testujesz na kolejnym kawałku, przesuwasz okno i powtarzasz. Dostajesz wynik z wielu następujących po sobie okresów, których model w chwili strojenia nie znał, więc znacznie trudniej go oszukać niż jednym podziałem. Dla danych uporządkowanych w czasie istnieje też ostrożniejsza walidacja krzyżowa z buforami, które wycinają próbki sąsiadujące w czasie, żeby trening nie podejrzał testu przez korelację dnia z dniem.

Żadna z tych technik nie działa bez statystyki. Trzy transakcje pokazują mechanikę liczenia, ale nie mówią nic o przewadze; sensowne wnioski zaczynają się od około stu zamkniętych transakcji na typ setupu. Mniej to anegdota, którą łatwo nadinterpretować. I rzecz, o której łatwo zapomnieć: trzeba wiedzieć, czym jest zmienna, na której budujesz. Wskaźniki przepływu zleceń z popularnych platform bywają proxy liczonym z ruchu ceny, a nie prawdziwą deltą kupna i sprzedaży z taśmy. Backtest na proxy daje wynik, który nie przeniesie się na realny order flow, choć na wykresie wygląda przekonująco.

Do czego backtest naprawdę służy

Wracamy do początku. Backtest sam w sobie nie jest dowodem, że strategia zarabia. W najlepszym razie jest próbą jej obalenia, która się nie powiodła, i im wcześniej przyjmiemy tę skromniejszą rolę, tym mniej kosztują pomyłki. Cztery pułapki z tego tekstu, ocaleni, przyszłość, szum i koszty, mają wspólny mianownik: każda sprawia, że test wygląda lepiej niż rzeczywistość.

Dlatego najcenniejsze bywają dane, które mówią „nie wchodź”. W naszym dzienniku sporo nauczyły nas sytuacje, w których ktoś wszedł mimo niskiej oceny i stracił. Pojedynczy taki przypadek to jeszcze anegdota, ale z serii buduje się materiał audytowy, który pokazuje, czy model milczy słusznie. Tej lekcji nie da się kupić za krzywą kapitału, która zawsze rośnie. Budujemy ten warsztat na żywo i jesteśmy na wczesnym etapie, więc każdy wynik traktujemy jak hipotezę do obalenia, nie jak obietnicę. Backtest, który przetrwał wszystkie cztery testy i nadal pokazuje przewagę po kosztach, nie jest gwarancją. Jest hipotezą, której jeszcze nie udało się obalić, i to już dużo.


Ten tekst opisuje metodę i sposób sprawdzania strategii, nie stanowi rekomendacji inwestycyjnej ani porady. Budujemy warsztat badawczy i dzielimy się procesem; decyzje i ryzyko pozostają po Twojej stronie. Dane liczbowe dotyczące kosztów zakotwiczone w realiach kontraktu MES z początku 2026 roku i mogą się zmieniać.