EN
Artykuły / 9.2 Walidacja
Walidacjaszkic

Monte Carlo transakcji - jak sprawdzić drawdown bota

14.11.20264 min czytania

W skrócie: backtest to jedna z wielu możliwych kolejności tych samych transakcji. Gdy ją przetasuję, zysk końcowy zostaje taki sam, ale drawdown i seria strat zmieniają się mocno. Dlatego z backtestu biorę nie jeden drawdown, tylko jego rozkład, i dobieram ryzyko tak, żeby gorszy wariant (np. 95. percentyl) mieścił się w limicie konta.

Dlaczego jeden backtest nie wystarcza

Test pokazuje, co by się stało, gdyby przyszłość ułożyła transakcje dokładnie tak jak przeszłość. Nie ułoży. Strategia ma pewną skuteczność i pewien stosunek zysku do straty, a kolejność wygranych i strat jest w dużej części przypadkowa. Ten sam bot z tymi samymi 200 transakcjami mógłby mieć krzywą gładką albo taką, która w połowie spada o kilkanaście ryzyk. Jeśli limit dzienny lub całkowity konta prop liczy się od szczytu, ta kolejność decyduje, czy konto przeżyje.

Jak to działa

Metoda jest prosta. Biorę listę zamkniętych transakcji z backtestu, każdą wyrażam w jednostkach ryzyka (R: strata = -1 R, wygrana = +2 R itd.). Potem:

  1. Tasuję kolejność (bez zwracania, ta sama lista, inny porządek).
  2. Liczę krzywą kapitału i jej największy spadek od szczytu oraz najdłuższą serię strat.
  3. Powtarzam kilka tysięcy razy i patrzę na rozkład, nie na pojedynczy wynik.

Zysk końcowy we wszystkich próbach jest identyczny, bo suma się nie zmienia. Zmienia się tylko droga do niego. Jest też wariant z losowaniem ze zwracaniem (bootstrap), który zakłada, że przyszłość może mieć trochę inną mieszankę wygranych i strat niż test. Jest ostrożniejszy, ale zależy od tego, jak wiernie lista transakcji odzwierciedla strategię.

Przykład liczbowy

Dane przykładowe, nie z mojego bota: 200 transakcji, 80 wygranych po +2 R i 120 strat po -1 R. Skuteczność 40%, suma +40 R, średnio +0,2 R na transakcję. Przetasowałem 10 000 razy (skrypt w repo, ziarno stałe).

Percentyl Największy drawdown Najdłuższa seria strat
5. 8 R 6
50. (mediana) 12 R 9
95. 19 R 13
99. 24 R 16

Najlepsza próba miała 5 R, najgorsza 36 R. Szansa, że drawdown sięgnie co najmniej 10 R, to 84%, co najmniej 15 R - 26%, co najmniej 20 R - 4,5%. To ten sam bot i te same transakcje. Gdybym patrzył tylko na jedną kolejność, mógłbym trafić na 8 R albo na 24 R i wyciągnąć z tego zupełnie inne wnioski.

Jak z tego dobrać ryzyko

Odwracam pytanie: ile miejsca mam na drawdown? Przy limicie całkowitym 10% salda i ryzyku 0,5% salda na transakcję jedno R to 0,5% salda, więc limit mieści 20 R. Z przykładu wynika, że spadek do 20 R zdarza się w 4,5% przetasowań, a przy ryzyku 1% (limit = 10 R) już w 84%. Jeśli akceptuję szansę przekroczenia około 5%, dobieram ryzyko tak, żeby 95. percentyl drawdownu mieścił się w limicie, z zapasem na to, że przyszłość będzie gorsza od testu. Dodatkowo patrzę na samą serię strat: 13 strat z rzędu w 95. percentylu to coś, co trzeba umieć znieść psychicznie, nie tylko rachunkowo (więcej w artykule o seriach strat).

Czego Monte Carlo nie pokaże

  • Nie naprawia złej strategii. Jeśli przewaga w backteście to dopasowanie do przeszłości, rozkład będzie ładny i fałszywy (patrz pułapka najlepszego wiersza).
  • Zakłada niezależność transakcji. Serie na tym samym reżimie rynku (trend, wysoka zmienność) są w praktyce skorelowane, więc prawdziwe serie bywają dłuższe niż w tasowaniu.
  • Nie uwzględnia zmiany kosztów, spreadu ani ślizgu w przyszłości.
  • Pokazuje drawdown zamkniętych transakcji. Pływający spadek w trakcie pozycji (MAE) jest głębszy, a limity prop liczą często kapitał, nie saldo.

Checklista

  • Lista transakcji pochodzi z testu z kosztami i spreadem zbliżonymi do realnych.
  • Wyniki przeliczone na R, a nie w walucie (ryzyko mogło się zmieniać w czasie).
  • Co najmniej kilka tysięcy tasowań i stałe ziarno, żeby wynik dało się powtórzyć.
  • Patrzę na 95. i 99. percentyl drawdownu i serii strat, nie na średnią.
  • Ryzyko dobrane tak, żeby 95. percentyl mieścił się w limicie konta z zapasem.
  • Dla konta prop sprawdzony też limit dzienny, nie tylko całkowity.

Powiązane

Źródła

Brak źródeł zewnętrznych - rachunek własny na danych przykładowych (skrypt tools/artykuly/monte_carlo_shuffle_table.py).

Ostrzeżenie: artykuł ma charakter edukacyjny i nie jest poradą inwestycyjną. Liczby z przykładu są syntetyczne i nie opisują żadnego realnego bota. Handel na rynkach finansowych wiąże się z ryzykiem utraty kapitału.

Dalej w rozdziale

199

In-sample i out-of-sample: jak podzielić historię na strojenie i kontrolę

Parametry dobieram na starszej części historii, a młodszą zostawiam nietkniętą jako kontrolę. Pokazuję podział 14 + 6 miesięcy, zasady i co robić, gdy danych jest mało.