Przejdź do treści
Moduł 2 z 2
  1. Python dla Tradera - Od Backtestu do Raportu
  2. Automatyzacja i Boty - Kiedy Ma Sens
  3. Walk-Forward i Monte Carlo - Koniec Iluzji
Algo Systematic Lekcja 07

Walk-Forward i Monte Carlo - Koniec Iluzji

To jest lekcja która oddziela prototyp od systemu gotowego do forward testu. Do tej pory testowałeś na jednym podziale IS/OOS. Rynek jednak się zmienia - reżim 2020, 2022, 2024 to trzy różne rynki. Walk-Forward odpowiada na pytanie: czy Twój system przetrwałby kolejne...

Ilustracja do lekcji: Walk-Forward i Monte Carlo - Koniec Iluzji
7 / 7
Autor
Zordon Intelligence Sp. z o.o.
Aktualizacja
Czas czytania
7 min
Źródła
2

Wstęp

To jest lekcja która oddziela prototyp od systemu gotowego do forward testu. Do tej pory testowałeś na jednym podziale IS/OOS. Rynek jednak się zmienia - reżim 2020, 2022, 2024 to trzy różne rynki. Walk-Forward odpowiada na pytanie: czy Twój system przetrwałby kolejne optymalizacje i reżimy gdybyś handlował nim na żywo ostatnie 3 lata? Monte Carlo odpowiada: jaki jest rozkład możliwych ścieżek tego samego edge przy losowej kolejności transakcji i błędach wykonania?

Bez tych dwóch testów każdy backtest jest zdjęciem, nie filmem. Z Walk-Forward i Monte Carlo dostajesz film z rozkładem scenariuszy, a nie jedną cukierkową krzywą.

Walk-Forward - symulacja życia tradera

Idea: dzielisz historię na okna. W każdym oknie optymalizujesz na IS (np. 6 miesięcy) i testujesz na OOS (np. 2 miesiące) które idzie chronologicznie PO IS. Potem przesuwasz okno o 2 miesiące do przodu i powtarzasz. Na końcu łączysz wszystkie OOS w jeden equity curve Walk-Forward.

Definicje:
Anchored Walk-Forward: IS rośnie (0-6m, 0-8m, 0-10m), OOS stałe 2m po IS
Rolling Walk-Forward: IS stałe 6m przesuwne, OOS 2m po IS (lepsze dla detekcji degradacji)

KursTradera standard: Rolling 70/30 lub 6m/2m dla H1/D1
Algorytm Walk-Forward Rolling:

Dane: 2020-01-01 do 2024-12-31 (5 lat H1)
Okno IS = 12 miesięcy, OOS = 3 miesiące, step = 3 miesiące

Iteracja 1: IS 2020-01 do 2020-12, optymalizuj ATR_mult, test OOS 2021-01 do 2021-03
Iteracja 2: IS 2020-04 do 2021-03, OOS 2021-04 do 2021-06
...
Iteracja N: IS 2023-10 do 2024-09, OOS 2024-10 do 2024-12

OOS equity = concat wszystkich OOS trades
Porównujesz IS PF vs OOS PF
Metryka Walk-ForwardInterpretacja
WF Efficiency = PF_OOS / PF_IS>0.6 dobry, 0.4-0.6 przeciętny, <0.4 overfit
% OOS zyskownych okien>60% stabilny, <50% losowy
Degradacja EV w czasieCzy EV OOS maleje w ostatnich oknach? Jeśli tak -> edge się kończy
MaxDD WF OOSRealny drawdown jakiego możesz się spodziewać, większy niż IS
Kod Python - szkielet Walk-Forward:

import pandas as pd

def walk_forward(df, is_months=12, oos_months=3):
    results = []
    start = df["timestamp"].min()
    end = df["timestamp"].max()

    current = start + pd.DateOffset(months=is_months)
    while current + pd.DateOffset(months=oos_months) ≤ end:
        is_start = current - pd.DateOffset(months=is_months)
        is_end = current
        oos_start = current
        oos_end = current + pd.DateOffset(months=oos_months)

        is_data = df[(df["timestamp"]>=is_start) & (df["timestamp"]&lt;is_end)]
        oos_data = df[(df["timestamp"]>=oos_start) & (df["timestamp"]&lt;oos_end)]

        best_param = optimize(is_data) 
        oos_trades = backtest(oos_data, best_param)

        results.append(oos_trades)
        current += pd.DateOffset(months=oos_months)

    wf_trades = pd.concat(results)
    return wf_trades

Jeśli nie masz kodu optimize - ręcznie testuj 3 wartości parametru, wybieraj stabilny środek, nie top 1.

Monte Carlo - losowość której nie kontrolujesz

Masz 200 transakcji z EV 0.2R. Ale kolejność ma znaczenie. 10 strat pod rząd na początku to inny ból niż 10 strat rozłożonych. Monte Carlo tasuje kolejność i symuluje tysiące ścieżek.

3 rodzaje Monte Carlo dla tradera

1. Reshuffle (najprostsze, musisz mieć): Tasujesz R-multiples bez zmiany wartości. Pokazuje wpływ kolejności.

2. Randomization z rozkładem (lepsze): Losujesz R z tego samego rozkładu (mean, std, win rate). Pokazuje wpływ zmienności rozkładu.

3. Monte Carlo z błędem wykonania (zaawansowane): Do każdej transakcji dodajesz losowy błąd: slippage ±0.05R, poślizg na SL, 5% szansy na missed trade. Pokazuje kruchość.

import numpy as np

def monte_carlo_reshuffle(trades_df, n_sim=5000):
    R = trades_df["R_net"].values
    sim_equities = []
    sim_maxdd = []

    for _ in range(n_sim):
        shuffled = np.random.permutation(R)
        equity = np.cumsum(shuffled)
        peak = np.maximum.accumulate(equity)
        dd = equity - peak
        sim_equities.append(equity[-1])
        sim_maxdd.append(dd.min())

    return (
        "final_equity_p5": np.percentile(sim_equities, 5),
        "final_equity_median": np.median(sim_equities),
        "final_equity_p95": np.percentile(sim_equities, 95),
        "maxdd_median": np.median(sim_maxdd),
        "maxdd_p95": np.percentile(sim_maxdd, 95),
        "prob_profit": np.mean(np.array(sim_equities) > 0)
    )
Wynik Monte CarloDecyzja
prob_profit <70% po kosztachSystem zbyt ryzykowny na automat
final_equity_p5 < -20R5% scenariuszy kończy tragicznie - zmniejsz ryzyko o połowę
maxdd_p95 = -25R a Ty ryzykujesz 1%Przygotuj się na 25% obsunięcie kapitału

Łączenie Walk-Forward + Monte Carlo = raport końcowy

Finalny raport systemu który nadaje się do forward testu:

1. Backtest IS/OOS prosty - EV, PF, SQN
2. Walk-Forward Rolling 12m/3m - WF Efficiency, % zyskownych OOS okien, Equity WF OOS
3. Monte Carlo 5000 reshuffle na WF OOS trades - 5/50/95 percentyle equity i MaxDD, prob_profit
4. Testy niszczące z Lekcji 3: opóźnienie 1 bar, koszty x2, random entry
5. Decyzja: TAK / NIE do forward z limitem ryzyka
Przykład decyzji w raporcie:

System: BTC H1 Pullback Trend v03
WF Efficiency: 0.62 (IS PF 1.6 -> OOS PF 0.99? Nie, 1.6*0.62=0.99 za nisko) -> poprawka: IS PF 1.8 -> OOS 1.26 = 0.7 good
% zyskownych OOS okien: 68%
Monte Carlo prob_profit: 82%
Monte Carlo MaxDD p95: -18R
Werdykt: Do forward z ryzykiem 0.5% per trade, Daily Stop -3R, MaxDD stop -15R, rekalibracja co 3 miesiące

Kiedy plan mówi nie handluj

  1. Gdy WF Efficiency <0.4: System jest przeoptymalizowany. Wraca do deski kreślarskiej, nie na rynek.
  2. Gdy Monte Carlo prob_profit <65% po kosztach x2: Masz 1/3 szans na stratę w długim terminie mimo dodatniego EV. To nie jest edge do automatyzacji.
  3. Gdy equity WF OOS jest płaskie a equity IS rośnie: Klasyczny overfit - IS piękny, OOS zero. Stop.
  4. Gdy nie masz min 5 okien OOS w Walk-Forward: Za mało by ocenić stabilność. Potrzebujesz min 2 lat danych H1 aby zrobić 6 okien 12m/3m.
  5. Gdy nie policzyłeś MaxDD p95 z Monte Carlo i nie masz na to planu: Nie wiesz jakie jest 5% najgorszych scenariuszy. Rynek właśnie ten scenariusz dostarczy w pierwszym miesiącu.

Błędy które kosztują najwięcej

  1. Walk-Forward Anchored z IS rosnącym w nieskończoność. Stary reżim 2020 wpływa na decyzję 2024. Rolling jest lepszy dla detekcji zmian.
  2. Monte Carlo tylko 100 symulacji. Za mało by policzyć 5% ogon. Minimum 1000, lepiej 5000. 100 to szum.
  3. Ignorowanie klastrowania strat. Reshuffle zakłada niezależność transakcji. W realu straty klastrują się w high vol. Dodaj test blokowy: tasuj bloki 10 transakcji, nie pojedyncze.
  4. Optymalizacja w WF po PF zamiast po stabilności. Wybierasz top PF z IS który ma największą wariancję. Wybieraj parametr o medianie PF wśród top 30%, nie top 1.
  5. Brak rekalibracji. Zrobisz WF raz i handlujesz rok. WF to proces: co 3 miesiące re-optymalizuj na rolling IS i sprawdź czy parametry stabilne.

Ćwiczenie mierzalne

Cel: Zbudować raport Walk-Forward + Monte Carlo dla systemu z lekcji 5.

Zadanie 3h:

  1. Weź dane 3 lata H1 (BTC lub inny płynny rynek). Podziel Rolling 12m/3m.
  2. Dla każdego IS przetestuj 3 wartości parametru (np. ATR SL 1.0, 1.5, 2.0) i wybierz tę z najwyższym PF ale stabilnym (nie najniższa i nie najwyższa).
  3. Zbuduj equity WF OOS - sklej wszystkie OOS trades w jeden DataFrame.
  4. Policz:
WF_Efficiency = PF_WF_OOS / PF_IS_avg
%_okien_zysk = count(PF_OOS_okno >1) / N_okien
Monte Carlo 2000 symulacji na WF OOS: prob_profit, final_eq p5/median/p95, MaxDD p95
  1. Wypełnij tabelę końcową:
MetrykaWartośćPróg KursTraderaPASS?
WF Efficiency>0.6
% okien >0>60%
MC prob_profit>70%
MC MaxDD p95<20R
PF po kosztach x2>1.2

Jeśli 4/5 PASS -> system do forward demo z małym ryzykiem. Jeśli <3 PASS -> brak edge.

Sprawdź się

  1. Czym różni się Rolling Walk-Forward od Anchored i który lepiej wykrywa degradację edge?
  2. Co to jest WF Efficiency i jaki próg uważamy za minimalny?
  3. Dlaczego potrzebujesz min 1000 symulacji Monte Carlo a nie 100?
  4. Wyjaśnij różnicę między Monte Carlo reshuffle a randomization z rozkładem.
  5. Masz WF Efficiency 0.35, MC prob_profit 60%, MaxDD p95 -30R. Czy to system do handlu? Co robisz?

Częste pytania

Ile okien Walk-Forward potrzebuję minimum? Min 5-6 okien aby policzyć % zyskownych. Dla H1 3 lata = 9 okien 12m/3m z krokiem 3m. Dla D1 potrzebujesz 5-7 lat. Mniej okien = brak statystyki.

Czy Walk-Forward gwarantuje zysk w przyszłości? Nie. To najlepsza symulacja życia tradera jaką mamy, ale przyszłość może być innym reżimem niż przeszłość. Dlatego dodajesz Monte Carlo i daily stop i rekalibrację.

Czy mogę zrobić Walk-Forward w Excelu? Tak dla 3-4 okien ręcznie kopiując dane. Dla 10+ okien Python jest 20x szybszy. W Excelu zrobisz proof-of-concept, w Pythonie produkcję.

Co jeśli Monte Carlo pokazuje 10% szansy na ruinę? Zmniejsz ryzyko per trade o 50% i policz ponownie. Ruin = MaxDD > Twój max tolerowany. Jeśli nadal >5%, system jest zbyt ryzykowny lub ryzyko za duże. Zmniejsz pozycję, nie ignoruj MC.

Kiedy rekalibrować system Walk-Forward na żywo? Co stały okres równy OOS (np. co 3 miesiące jeśli OOS=3m) lub po MaxDD > 1.5* MC p50. Nie rekalibruj po 3 stratach. Rekalibruj po procesie, nie emocji.


Reklama

Najważniejsze wnioski

  • To jest lekcja która oddziela prototyp od systemu gotowego do forward testu. Do tej pory testowałeś na jednym podziale IS/OOS. Rynek jednak się zmienia - reżim 2020, 2022, 2024 to trzy różne rynki. Walk-Forward odpowiada na pytanie: czy Twój system przetrwałby kolejne...

Źródła i dokumenty

Materiał opieramy na dokumentach źródłowych. Wartości zmienne — opłaty, limity, wskaźniki regulacyjne — sprawdź u źródła przed podjęciem decyzji.

  • TradingView — Pine Script reference
  • Python for Finance — Yves Hilpisch

Zastrzeżenie

  • KursTradera.pl to serwis edukacyjny o charakterze informacyjnym. Nie prowadzimy działalności maklerskiej, nie przyjmujemy i nie przekazujemy zleceń, nie zarządzamy portfelem, nie oferujemy instrumentów finansowych i nie świadczymy usług doradztwa inwestycyjnego w rozumieniu ustawy o obrocie instrumentami finansowymi. Materiały opisują mechanizmy rynkowe i proces decyzyjny — nie są instrukcją kupna lub sprzedaży jakiegokolwiek instrumentu.
  • Żadna z publikowanych treści nie stanowi rekomendacji inwestycyjnej, informacji rekomendującej ani rekomendacji w rozumieniu Rozporządzenia Parlamentu Europejskiego i Rady (UE) nr 596/2014 (MAR) oraz aktów wykonawczych. Nie jest też ofertą nabycia lub zbycia instrumentów finansowych ani zaproszeniem do składania ofert. Wszelkie przykłady, wykresy, zrzuty ekranu i liczby mają charakter ilustracyjny i odnoszą się do sytuacji hipotetycznych lub historycznych.
  • Inwestowanie i trading wiążą się z ryzykiem utraty części lub całości zainwestowanego kapitału. Wyniki osiągnięte w przeszłości — w tym wyniki przedstawione w materiałach edukacyjnych, backtestach i przykładach — nie gwarantują wyników przyszłych i nie są ich wiarygodnym wskaźnikiem. Żadna opisana metoda ani strategia nie eliminuje ryzyka. Decyzje inwestycyjne podejmujesz samodzielnie, na własną odpowiedzialność i po zapoznaniu się z aktualnymi dokumentami swojego brokera.
  • Instrumenty z dźwignią (CFD, kontrakty terminowe, opcje, transakcje typu margin) mogą generować straty przewyższające wartość wpłaconych środków — możesz stracić więcej, niż zainwestowałeś, i zostać wezwanym do uzupełnienia depozytu (margin call). W Unii Europejskiej dźwignia dla klientów detalicznych handlujących CFD na głównych parach walutowych jest ograniczona decyzją ESMA (interwencja produktowa w sprawie CFD i opcji binarnych), ale ograniczenie dźwigni nie usuwa ryzyka. Odsetek rachunków detalicznych przynoszących straty różni się między brokerami i zmienia się w czasie — aktualną wartość odczytaj z ostrzeżenia ryzyka u swojego brokera i zapisz razem z datą.
  • Backtesty, symulacje i przykładowe wyniki nie są rzeczywistymi wynikami transakcyjnymi. Powstają w warunkach odtwarzanych z danych historycznych, nie uwzględniają w pełni poślizgu cenowego, płynności, spreadu, prowizji, swapu, wpływu własnych zleceń na rynek ani czynnika psychologicznego — a wszystkie te elementy pogarszają wynik w praktyce. Wyniki historyczne nie chronią przed przyszłymi stratami.

Kto to pisze i jak to sprawdzamy

Materiały pisze i weryfikuje Redakcja Kurs Tradera — zasady opisuje o serwisie: każda liczba ma źródło, a braki pokazujemy jawnie. Błąd merytoryczny zgłosisz przez kontakt — poprawki opisujemy w treści.

Postęp kursu 0 / 7

Postęp zapisujemy wyłącznie w tej przeglądarce (localStorage) — nie ma konta ani kopii na serwerze. Wyczyszczenie danych witryny go usunie. Zarządzaj swoimi danymi