Sygnał wejścia prawdopodobnie ma najmniejsze znaczenie w całym Twoim backteście. Mogę wziąć przeciętną regułę momentum, pozostawić wszystkie znaczniki czasu wejść i wyjść bez zmian, zmienić tylko funkcję decydującą o liczbie utrzymywanych kontraktów i przesunąć Sharpe’a netto z 0.41 do 0.71, a maksymalne obsunięcie z 31% do 13%. Te same transakcje. Te same realizacje. Inna strategia.
To twierdzenie irytuje ludzi — i słusznie, bo sugeruje, że większość czasu poświęcanego na dostrajanie okresów wstecznych i progów filtrów idzie na dopracowywanie mniej istotnego elementu. Pokażę więc rzeczywiste wyniki, a potem przyznam rację krytykom, bo istnieje błędna wersja tego argumentu i warto wiedzieć, którą z nich przedstawiam.
1 sygnał, 6 sposobów na ustalenie wielkości pozycji
Sygnał: kontrakt perpetual ETHUSDT na Binance USDⓈ-M, świece 1-godzinne, pozycja długa, gdy EMA z 12 godzin znajduje się powyżej EMA z 96 godzin, w przeciwnym razie brak pozycji, bez pozycji krótkich. Od lipca 2022 do czerwca 2026. 431 transakcji zamkniętych. Prowizje taker po obu stronach po 5.0 bps, funding płacony lub otrzymywany co 8 godzin dla faktycznie utrzymywanej pozycji, poślizg modelowany na podstawie głębokości najlepszych ofert. To celowo nudny sygnał — wybrałem go, bo nikt by go nie bronił, dzięki czemu nadaje się do czystego testu.
Każdy wiersz poniżej ma identyczne znaczniki czasu wejścia i wyjścia na świecach. Różni się wyłącznie funkcja sizingu.
| Reguła sizingu | Sharpe netto | Maks. DD | Obrót nominałem rocznie (× średnia pozycja) | Koszty jako % zysku brutto | Maks. dźwignia |
|---|---|---|---|---|---|
| Stały nominał 10 000 USD | 0.41 | 18.2% | 246× | 14% | 1.0× |
| Stały ułamek kapitału, 100% equity | 0.44 | 30.8% | 251× | 15% | 1.0× |
| Odwrotność zrealizowanej zmienności z 20 dni | 0.68 | 14.1% | 690× | 29% | 4.4× |
| Cel zmienności 20% w ujęciu rocznym, rekalkulacja co godzinę, bez limitu | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| Cel zmienności 20%, pasmo bez transakcji 20%, limit dźwigni 3× | 0.66 | 15.3% | 402× | 19% | 3.0× |
| Połowa Kelly’ego na podstawie kroczącej średniej/wariancji z 60 dni | 0.52 | 24.6% | 830× | 33% | 8.1× |
Spójrz na rozpiętość wyników. Między najgorszym a najlepszym wierszem różnica względna Sharpe’a wynosi 73%, a obsunięcie różni się 2.4 raza. Znajdź teraz parametr sygnału wejścia w tym zbiorze danych, który zmienia Sharpe’a o 0.30 bez oczywistego przeuczenia. Szukałem. Długość pary EMA zmienia go o około 0.12 w całej wiarygodnej siatce, a większość tej zmiany to szum, którego nie da się utrzymać poza próbą.
Dlaczego sizing odwrotnie proporcjonalny do zmienności wypada tak dobrze i jaka część tego wyniku jest prawdziwa
Mechanizm jest prosty. Przy stałym nominale wielkość pozycji nie jest skorelowana ze zrealizowaną zmiennością, co oznacza, że ryzyko w dolarach przypadające na transakcję jest proporcjonalne do tego, jaka akurat jest zmienność w danym tygodniu. W przypadku ETH w tym okresie zrealizowana zmienność z 20 dni wahała się od 31% do 118% w ujęciu rocznym. W marcu 2024 wariant ze stałym nominałem podejmował ryzyko w dolarach 3.8× większe niż w lipcu 2023 — nie dlatego, że sygnał był bardziej wiarygodny, lecz dlatego, że rynek był bardziej rozchwiany. Niemal całe jego obsunięcie przypada na najwyższy kwintyl zmienności. Sizing odwrotnie proporcjonalny do zmienności usuwa to powiązanie, co rzeczywiście poprawia kształt strumienia stóp zwrotu.
Część wzrostu Sharpe’a wynika jednak z artefaktu pomiarowego. Jeśli nie rozdzielisz tych dwóch rzeczy, podejmiesz później złe decyzje. Sharpe dzieli stopę zwrotu przez jej odchylenie standardowe. Targetowanie zmienności z definicji stabilizuje odchylenie standardowe stóp zwrotu. Bezpośrednio optymalizujesz mianownik. Reguła skalująca pozycje tak, by trafiać w stałą zmienność ex ante, poprawi Sharpe’a niemal na każdym strumieniu stóp zwrotu z klasteryzacją zmienności, także takim bez jakiejkolwiek przewagi. Sprawdziłem to na losowo przetasowanych sygnałach: losowo zmień znaczniki czasu wejść, zachowaj nakładkę targetowania zmienności, a Sharpe i tak wzrośnie o około 0.06 względem stałego nominału przy średniej równej zeru. To niewiele, ale nie zero — i wynika wyłącznie z mechaniki.
Dlatego porównując wewnętrznie reguły sizingu, nigdy nie patrzę tylko na Sharpe’a. Interesuje mnie Calmar, zysk netto PnL na jednostkę średniego zaangażowanego nominału i rozliczenie przejścia od zysku brutto do netto — tych 3 miar razem znacznie trudniej jest nadużyć sztuczką z mianownikiem.
Szacunek zmienności to model — i tak jak model może powodować wyciek danych
Najczęstsza przyczyna, dla której dobry wynik sizingu okazuje się fikcyjny: szacunek zmienności wykorzystuje dane z tej samej świecy, dla której ustalasz wielkość pozycji. Jeśli seria zmienności jest obliczana na wycentrowanym oknie, za pomocą domyślnego `rolling().std()` w pandas po resamplingu obejmującym bieżącą, niezamkniętą świecę albo przez standaryzację na całej próbie, masz wyciek danych. Łatwo go przeoczyć, bo zmienność jest trwała, więc wyciek jest mały w każdym wierszu, a krzywa kapitału nadal wygląda wiarygodnie. Jest tylko nieco zbyt gładka dokładnie w tych tygodniach, które mają znaczenie.
Nasi agenci sprawdzają 4 rzeczy przy każdej regule sizingu, zanim wynik trafi do kolejki paper tradingu:
- Dostępność w chwili podjęcia decyzji. Wielkość pozycji użyta na świecy otwierającej się o 14:00 musi dać się obliczyć z danych, których znacznik czasu zamknięcia wynosi ≤ 13:59:59.999. Sprawdzamy to, ponownie obliczając serię wielkości pozycji na podstawie obciętej ramki danych dla losowej próbki 200 punktów decyzyjnych, a następnie porównując wyniki.
- Okres estymacji to rzeczywisty parametr. Okno zmienności 20-dniowe i 60-dniowe oznacza 2 różne strategie. Okres uwzględniamy w siatce walk-forward razem ze wszystkimi pozostałymi parametrami. Jeśli wynik działa tylko dla 1 długości okna, świadczy to o kruchości strategii.
- Przebieg dźwigni, a nie tylko jej maksimum. Pokazuj pełny rozkład dźwigni brutto. Opisany wyżej wariant bez limitu, targetujący zmienność, przez 4% czasu działał z dźwignią powyżej 5×. Takie rzeczy nigdy nie trafiają do tabeli podsumowującej, a w pełni decydują o tym, czy strategię da się wdrożyć.
- Wrażliwość sizingu jako test odporności. Jeśli Sharpe załamuje się po zmianie celu zmienności z 20% na 25%, strategia nie targetuje zmienności — jest dostrojona do dźwigni i właśnie znalazłeś przewagę przez wybór jednej liczby.
Limit dźwigni nie jest ozdobnym dodatkiem do zarządzania ryzykiem — stanowi część definicji strategii. Progi dla ETHUSDT na Binance obniżają maksymalną dźwignię wraz ze wzrostem nominału pozycji, a wymagany depozyt zabezpieczający rośnie skokowo. Backtest pozwalający regule targetowania zmienności osiągnąć 6.3× przy nominale 400 tys. USD opisuje pozycję, której giełda nie pozwoli utrzymać przy takim depozycie. Wiersz z limitem kosztuje 0.05 Sharpe’a i tylko on z tych 2 opisuje coś rzeczywistego.
Na rebalansowaniu uciekają pieniądze
Zwróć uwagę na kolumnę kosztów. Godzinne rebalansowanie do celu zmienności dało najwyższy Sharpe w nagłówku, a zarazem oddało giełdzie 41% zysku brutto. To obrót nominałem równym 1,180× średniej pozycji rocznie po 5 bps za stronę, plus spread i wpływ na cenę. Naiwnym rozwiązaniem jest rzadsze rebalansowanie według harmonogramu. Lepszym jest pasmo bez transakcji: zmieniaj wielkość pozycji dopiero wtedy, gdy aktualna pozycja odchyli się od docelowej o więcej niż określony próg.
Pasmo 20% zmniejszyło roczny obrót nominałem z 1,180× do 402× — o 66% — i kosztowało 0.05 Sharpe’a. Przetestowałem to już na 8 sygnałach i za każdym razem wzorzec jest podobny: pasma od 15% do 25% pozwalają zachować większość korzyści z kontroli ryzyka przy obrocie mniejszym o 2/3, a każde poniżej 10% oznacza płacenie prowizji za kosmetyczną precyzję w wielkości, którą i tak szacujesz na podstawie 20-dniowego okna. Nie da się rebalansować do 3 miejsc po przecinku, opierając się na liczbie, której błąd standardowy wynosi 15%.
W lutym mieliśmy przebieg, w którym raport agenta przypisał poprawie filtra wejścia wzrost Sharpe’a o 0.22. Różnica w kodzie sprowadzała się do 1 wiersza w module sizingu. Filtr się nie zmienił. Teraz każę umieszczać na początku raportu hash konfiguracji sizingu, bo atrybucja wymaga dyscypliny, a modele równie chętnie snują uporządkowane opowieści jak wszyscy inni.
Jak paper trading wpływa na regułę sizingu
Właśnie tutaj różnica między backtestem a paper tradingiem jest największa i wynika głównie z arytmetyki. Sizing reagujący na zmienność powoduje, że wielkość pozycji waha się w badanej próbie 4–8-krotnie. Oba końce tego zakresu napotykają ograniczenia giełdy, których backtest nie modelował.
Po stronie małych pozycji: krok ilości i minimalny nominał. Kontrakt perpetual ETHUSDT ma krok ilości 0.001 i minimum 5 USD. Jeśli wielkość pozycji w okresie niskiej zmienności wynosi 0.0004 ETH, backtest ją utrzymuje, a paper trading nie utrzymuje żadnej pozycji. Brzmi to jak przypadek brzegowy, dopóki nie uświadomisz sobie, że reguła targetowania zmienności generuje najmniejsze pozycje na najspokojniejszych rynkach, czyli przy sygnale trendowym często właśnie tam, gdzie pojawiają się dobre wejścia. Po stronie dużych pozycji: limity pozycji, progi depozytu i fakt, że pozycja 6× wymaga dyscypliny przy depozycie izolowanym — a nie testowałeś modelu likwidacji.
Wykryliśmy przypadek, w którym krzywa kapitału paper tradingu przez 6 tygodni trzymała się krzywej backtestu z różnicą do 3%, po czym mocno się rozjechały. Przyczyną było zaokrąglanie: obcinanie przez `int()` zamiast zaokrąglania do kroku w funkcji obliczającej wielkość zlecenia, zastosowane do pozycji o średniej wielkości 1.4 kroku. Backtest ustalał wielkość w przestrzeni ciągłej, a moduł sizingu działający na żywo gubił 20-30% zamierzonej pozycji przy każdej małej transakcji. Bez wymyślnych modeli realizacji zleceń i bez opowieści o opóźnieniach. Samo obcinanie.
Gdzie krytycy mają rację
3 zastrzeżenia są trafne i nie chcę przedstawiać argumentu z pominięciem ich.
Po pierwsze i najważniejsze: sizing rozdziela przewagę, ale nie potrafi jej stworzyć. Jeśli oczekiwana stopa zwrotu brutto sygnału po uwzględnieniu realistycznych prowizji i fundingu jest równa zeru lub niższa, każda reguła z tej tabeli przynosi straty — te bardziej wyszukane robią to tylko przy ładniejszym profilu zmienności. Wybrałem sygnał o niewielkiej, lecz dodatniej przewadze netto w tym okresie. Uruchom te same 6 reguł na sygnale z wynikiem netto −1.2 bps na transakcję, a ranking się utrzyma, ale kapitał końcowy dla każdego wariantu będzie niższy od początkowego. Sizing jest mnożnikiem czegoś. To coś nadal jest potrzebne.
Po drugie, targetowanie zmienności ma rzeczywisty i dobrze udokumentowany słaby punkt: zmniejsza dźwignię przy dnie gwałtownej wyprzedaży, a zwiększa ją po odbiciu. Przy ostrym ruchu w kształcie V stały nominał wygrywa, czasem zdecydowanie. Na akcjach w marcu 2020 i podczas krachu na rynku krypto w sierpniu 2024 sizing reagujący na zmienność radził sobie słabo w fazie odbicia. Czteroletni okres dla ETH akurat zawierał więcej długich, zmiennych trendów niż ruchów w kształcie V, co działa na korzyść wariantów odwrotnie proporcjonalnych do zmienności. Inny okres zmieni część kolejności. Gdybym zaczął od tabeli z 2020 roku, mój argument byłby słabszy.
Po trzecie, regułę sizingu można przeuczyć tak samo jak każdy inny element. W mojej tabeli zdradza to połowa Kelly’ego oparta na estymacjach kroczących: wygląda zaawansowanie i ma uzasadnienie teoretyczne, ale dała drugie największe obsunięcie, bo krocząca estymata średniej zaszumionej serii stóp zwrotu jest bezwartościowa, a Kelly jest na nią brutalnie wrażliwy. Każda reguła sizingu, której dane wejściowe obejmują szacowaną oczekiwaną stopę zwrotu, dziedziczy błąd tej estymaty i go wzmacnia. Reguły korzystające wyłącznie z estymaty wariancji zachowują się znacznie lepiej, bo wariancja to jedyny moment, który da się rzeczywiście oszacować na podstawie 4 lat danych godzinowych.
Najważniejsza lekcja: gdy wynik backtestu Cię zaskoczy, zanim zaczniesz szukać sprytnych rozwiązań w sygnale, sprawdź moduł sizingu. A gdy raportujesz Sharpe’a, pokaż obok niego przebieg dźwigni i rozliczenie kosztów, bo wynik tak mocno zależny od decyzji o sizingu wcale nie jest cechą samego sygnału.
← Wszystkie wpisy
