Czy trader na żywo robi to, co backtest? Nasze codzienne porównanie prod vs backtest
· Framework
Wszystko, o czym decydujemy w naszej strategii BTC, opiera się na backtestach: które scenariusze zostają, jak duża jest pozycja, gdzie stoi stop. Backtest jest jednak coś wart tylko wtedy, gdy trader na żywo robi tego samego dnia to samo. Dlatego zaczęliśmy to sprawdzać — codziennie, automatycznie, krok po kroku.
W pierwszym tygodniu porównanie znalazło dwie realne różnice między handlem na żywo a backtestem. Żadna nie była błędem w strategii i żadnej nie zobaczylibyśmy na wykresie zysków.
1. Jak działa codzienne porównanie
Co noc, po północy UTC, dataset backtestu dostaje dzień, który właśnie się skończył: minutowe świece z Binance i wszystkie wskaźniki policzone dla każdego 10-minutowego kroku kodem samego tradera. Zaraz potem raport porównuje ten dzień na trzy sposoby:
- Wskaźniki, krok po kroku. Trader na żywo zapisuje w każdym cyklu około 40 wartości — trendy, pivoty, breakouty, odległość od ostatniego szczytu i dołka, nachylenia wsparcia i oporu, momentum trendu, %B Bollingera, CCI, oscylator wolumenu, ATR, cenę. Każdą porównujemy z tym, co widział backtest w tym samym 10-minutowym kroku: wartości opisowe jako odsetek zgodnych kroków, liczby w granicach tolerancji.
- Dane on-chain. Każda wartość on-chain zapisana przez tradera (SOPR, MVRV, exchange netflow, funding rate i inne) wobec wartości, którą backtest czyta dla tego dnia.
- Transakcje. Dla każdego konta handlującego na żywo jego transakcje z tego dnia wobec backtestu jego obecnej konfiguracji (z 30-dniowym rozbiegiem, żeby pozycje mogły być już otwarte). Transakcje parujemy po stronie, scenariuszu i momencie otwarcia.
2. Odkrycie pierwsze: trader na żywo patrzył na rynek w złej minucie
Pierwszy raport pokazał coś dziwnego: wskaźnik price momentum — czy wygładzona cena wzrosła w ostatnich 10 minutach — zgadzał się z backtestem tylko w 48% kroków. To rzut monetą. Kilka scenariuszy używa go jako warunku wejścia.
Logika była po obu stronach identyczna. Różnica tkwiła w tym, kiedy się liczyła. Backtest liczy każdy krok w 5. minucie 10-minutowego okna. Trader na żywo zaczynał cykl 600 sekund po poprzednim, więc jego moment przesuwał się w obrębie okna — jednego dnia patrzył na rynek około 1. minuty, innego około 5., a każdy restart ustawiał to od nowa. Dla wolnego wskaźnika to bez znaczenia. Dla 10-minutowej zmiany ceny decyduje o wszystkim: typowa zmiana w 10 minut wynosiła około 57 USD, a próbkowanie kilka minut obok przesuwało cenę średnio o 24 USD, a czasem o 200 USD.
Jeden dzień miał oba rodzaje cykli, więc łatwo było zmierzyć efekt:
| Wskaźnik | Cykle w minucie 5–7 | Cykle w innych minutach |
|---|---|---|
| Momentum trendu (godzinowe) | 98% | 25% |
| CCI (godzinowe) | 100% | 51% |
| %B Bollingera (godzinowe) | 92% | 45% |
| Price momentum | 92% | 77% |
| Cena rynkowa | 98% | 69% |
| ATR | 100% | 88% |
Naprawa to jedna zmiana w harmonogramie: cykle na żywo startują teraz według zegara, w 5. minucie każdego 10-minutowego okna (00:05, 00:15, …) — dokładnie wtedy, gdy backtest liczy swoje kroki. Sama strategia się nie zmieniła; trader na żywo patrzy teraz na rynek w momencie, który zakłada backtest.
3. Odkrycie drugie: „świeższe” dane on-chain to inne dane
Większość wartości on-chain zgadzała się z backtestem w 94–100% kroków. Jedna nie zgodziła się ani razu: exchange netflow.
Dostawca danych uzupełnia dzisiejszy rekord w ciągu dnia. Trader na żywo czyta najnowszy dostępny rekord, więc rano widzi netflow rzędu, powiedzmy, 66 BTC, który rośnie przez cały dzień. Backtest ma tylko końcowe wartości dzienne, więc używa pełnej sumy z wczoraj — tego samego dnia było to 5 692 BTC. To nie jest ta sama liczba widziana wcześniej, tylko inna wielkość. Próg dobrany na pełnych sumach dziennych znaczy coś innego, gdy przykłada się go do częściowej sumy o 9 rano.
Czy szybsze dane są lepsze? Nie wiadomo, bo nikt tego nie przetestował: historia przechowuje tylko końcowe wartości dzienne, a użycie w backteście dzisiejszej wartości końcowej oznaczałoby znajomość przyszłości. Dlatego zostawiliśmy tradera na żywo bez zmian i zaczęliśmy co 10 minut zapisywać dokładnie to, co widzi. Za kilka miesięcy te zapisy pozwolą uczciwie przetestować szybsze dane — i zdecydować na podstawie liczb, a nie intuicji.
4. Mierzyć właściwą rzecz
Porównanie ma sens tylko wtedy, gdy zestawia to samo z tym samym. Dwie wczesne „niezgodności” były błędami raportu, a nie tradera:
- Breakouty. Trader zapisuje breakout po filtrach (breakout liczy się tylko blisko ostatniego pivota). Dataset przechowuje surowe przecięcie linii. W porównaniu surowym tygodniowy breakout zgadzał się w 0% kroków; po zastosowaniu tych samych filtrów — w 100%.
- Odległość od ostatniego szczytu i dołka. Liczy się ją w procentach ostatniego zakresu, a godzinowy zakres bywa szeroki tylko na około 100 USD. Różnica ceny 30–50 USD to wtedy kilka punktów procentowych — szum, a nie niezgodność. Raport używa teraz tolerancji dla każdego interwału.
5. Transakcje: ta sama decyzja, trochę później
Sparowane transakcje mówią najwięcej. Na przykład dwa konta z tą samą konfiguracją otworzyły long ze scenariusza Puella dwie i pół godziny po backteście — ta sama decyzja, w trochę innym momencie i po trochę innej cenie. Niesparowane transakcje mają na razie proste wyjaśnienia: pozycja otwarta ręcznie albo transakcja, która zaczęła się przed 30-dniowym oknem backtestu.
Podsumowanie
Backtest odpowiada na pytanie „co zrobiłaby strategia”. Nie odpowiada na pytanie „co faktycznie robi nasz system na żywo”. Codzienne porównanie zamyka tę lukę:
- szczegół harmonogramu sprawiał, że jeden warunek wejścia był na żywo losowy — naprawione startem cykli według zegara;
- różnica w świeżości danych zmienia jedno wejście on-chain — teraz zapisujemy je, żeby to przetestować, zamiast zgadywać;
- od teraz każda nowa różnica między handlem na żywo a backtestem pokaże się następnego ranka, zanim zdąży kosztować pieniądze.
Zasada jest ta sama co w naszych testach: ufaj wynikowi dopiero, gdy sprawdzisz go w warunkach, w których naprawdę ma działać.