Python do backtestowania forex — backtrader, Pandas, ccxt

Ostrzeżenie · YMYL Ten artykuł ma charakter wyłącznie edukacyjny i nie stanowi rekomendacji inwestycyjnej. Handel na rynku Forex wiąże się z wysokim ryzykiem utraty kapitału — według ESMA 74–89% rachunków detalicznych traci pieniądze.

Andrzej, IT engineer, 5 lat trading XTB. Strategy „London open breakout" wydaje się działać — ale ile naprawdę? MT5 backtester pokazuje 67% WR, ale Andrzej podejrzewa over-fitting. Pisze 200-line Python script: backtrader + Pandas, 7 lat M1 EUR/USD z Dukascopy, walk-forward 6 periods, Monte Carlo 1000 iter z realistic spread. Wynik: 54% WR (nie 67%), Sharpe 0.8 (nie 2.1), max DD 22%. Strategia działa, ale 30% mniej profit niż MT5 sugerował. Andrzej kontynuuje z realistycznymi expectations.

Dlaczego Python

4 zalety vs MQL5 EA:

Python vs MT5 EA backtest
Statistical analysisPython: scipy, statsmodels. MT5: brak Monte Carlo, walk-forward
Data sourcesPython: any (Dukascopy, Polygon). MT5: tylko broker
Speedvectorbt 30s. MT5 ten sam test 10-30 min
Custom strategiesPython: pełna freedom. MT5: MQL5 restrictions
Hybrid approachPython validation + MT5 EA execution

Top 5 libraries 2026

Python forex stack
backtraderDe facto framework. Object-oriented, event-driven
vectorbt20-100× szybszy niż backtrader. Optimization
PandasData manipulation. Time series, resampling
numpyMath foundation, vectorized calculations
MetaTrader5Python wrapper dla MT5 (data + execution)
ta-lib200+ technical indicators

Beginner: zacznij od backtrader + Pandas. Po 2-3 mies. dodaj vectorbt dla parameter optimization.

Data sources

Free:

  • Dukascopy: M1 OHLC od 2003 r., bid/ask. Top free option.
  • Yahoo Finance: daily only, but free.
  • broker MT5: via Python wrapper, free dla holders.
  • HistData.com: M1 historical, donation-based.

Paid:

  • Polygon.io ($30/mies.): institutional grade, nanosecond.
  • Tiingo ($10/mies.): affordable historical M1.
  • TickStory ($25/mies.): tick data dla broker-specific testing.

6-step workflow

  1. Load data Pandas: df = pd.read_csv('eurusd_m1.csv', parse_dates=['datetime'])
  2. Define strategy: backtrader Strategy class z next() method, indicators
  3. Run backtest: cerebro.addstrategy() + cerebro.run()
  4. Analyze metrics: Sharpe, max DD, win rate, profit factor
  5. Walk-forward analysis: train 5 lat, test 1 rok, repeat 6 periods
  6. Monte Carlo: 1000 iterations z randomized trade order — robustness check

Walk-forward analysis

„Walk-forward = train na 5 lat, test na 1 roku, walk forward 1 rok, repeat. 6 periods over 10 lat. Pokazuje czy strategia consistent — czy tylko fluke."

Przykład:

Walk-forward 7 lat data 2018-2024
Period 1Train 2018-2022, test 2023
Period 2Train 2019-2023, test 2024
Period 3-6Continue rolling window
Pass criterionMinimum 4/6 periods profitable
Realistic expectationOut-of-sample 30-50% niżej niż in-sample

Monte Carlo simulation

1000 iterations randomized trade order. Każda iteracja:

  • Shuffle order trades z backtest
  • Calculate equity curve, max DD, final profit
  • Repeat 1000×

Output: distribution wyników. 5th percentile = worst case scenario. 95th = best. Mediana = realistic expectation.

Jeśli 5th percentile pokazuje -30% account, real-life ryzyko jest. 90% chance > 5th percentile, ale 5% chance worse.

4 common biases

  1. Look-ahead bias: używasz future data w decision. Mitigate: shift indicators by 1.
  2. Survivorship: testujesz tylko surviving pairs. Mitigate: include delisted (PLN/USD historycznie).
  3. Overfitting: parameters perfectly tuned do historical. Mitigate: walk-forward mandatory.
  4. Spread/slippage ignoring: assume mid-price execution. Mitigate: include realistic costs (1.5 pip + slippage + commission).

Realistic backtest pokazuje 30-50% mniej profit niż naive. Jeśli backtest > 50% yearly z realistic costs = suspicious, prawdopodobnie bias.

Wnioski

Python = top tool dla forex backtesting. Vs MT5 EA: lepszy dla statistical analysis, custom strategies, speed (vectorbt 20-100×), data flexibility.

Top stack 2026: backtrader (framework), vectorbt (speed), Pandas (data), numpy (math), MetaTrader5 (wrapper), ta-lib (indicators).

Data sources: free (Dukascopy M1, Yahoo daily), paid (Polygon $30/mies., Tiingo $10/mies., TickStory $25/mies.).

6-step workflow: load → define strategy → backtest → metrics → walk-forward → Monte Carlo. Walk-forward 6 periods mandatory. Monte Carlo 1000 iter dla robustness.

4 biases: look-ahead (shift indicators), survivorship (include delisted), overfitting (walk-forward), spread/slippage (include realistic 1.5 pip + commission).

Time investment: 40-80h Python basics + 100-200h backtesting framework. ROI tylko dla traderów z 6+ mies. doświadczeniem chcących quantitative validation.

Hybrid approach: Python dla validation, MT5 EA dla execution. Top quant traders używają obu.

Powiązane: backtest podstawy — start tutaj, Monte Carlo — robustness, MQL5 EA — alternative.

Jarosław Wasiński
O autorze

Jarosław Wasiński

Redaktor naczelny MyBank.pl · Analityk finansowy i rynkowy

Niezależny analityk i praktyk z ponad 20-letnim doświadczeniem w sektorze finansowym. Twórca i redaktor naczelny portalu MyBank.pl, działającego od 2004 roku. Analiza fundamentalna rynków walutowych i makroekonomicznych od 2007 roku.

Źródła i bibliografia

  1. backtrader Python algorithmic trading library · oryginalny project Daniel Rodriguez www.backtrader.com ↗
  2. Polygon.io Forex data API · institutional-grade data polygon.io ↗
  3. Dukascopy Historical Data Feed · free M1 data 2003+ www.dukascopy.com ↗

Najczęstsze pytania

Dlaczego Python zamiast MT5 EA?

4 zalety Python vs MQL5 EA: (1) Statistical analysis: Python ma scipy, statsmodels, sklearn. MT5 ma podstawowe metryki ale brak Monte Carlo, walk-forward analysis, regression testing. (2) Data flexibility: Python loaduje CSV, JSON, API any source (Polygon, Tiingo, Dukascopy, Yahoo). MT5 ograniczony do swojego brokera data. (3) Speed for vectorized: vectorbt + Pandas backtest 10 lat M1 EUR/USD w 30 sekund. MT5 ten sam test = 10-30 min. 20-60× szybszy. (4) Custom strategies: Python = pełna freedom. MT5 EA = MQL5 syntax restrictions. MT5 EA zalety: bezpośrednie execution na live broker (Python wymaga MT5 wrapper lub broker API), simpler dla beginners (drag-and-drop), built-in optimization tester. Decision: jeśli chcesz validate strategy ze statistical rigor (akademickie podejście) → Python. Jeśli chcesz quick test + deploy live → MT5 EA. Top traderzy używają obu — Python dla validation, MT5 dla execution.

Top 5 libraries — co wybrać?

Stack 2026: (1) backtrader (Daniel Rodriguez 2015): de facto standard backtesting framework. Object-oriented (Strategy class), event-driven, supports multi-asset. Active GitHub community 13k stars. Best dla: standard backtesting tasks, learning. (2) vectorbt (Oleg Polakow 2021): vectorized backtesting w numpy/Pandas. 20-100× szybszy niż backtrader. Best dla: parameter optimization (test 10 000 kombinacji w 1 min). (3) Pandas (Wes McKinney 2008): data manipulation. Time series, resampling, indicators (TA-lib integration). Każda Python strategy używa Pandas. (4) numpy: math foundation. Wektoryzacja calculations. (5) MetaTrader5 wrapper: Python library do MT5 (data + execution). Pozwala backtest na rzeczywistych broker quotes + deploy strategy live. Bonus: ta-lib (technical indicators), scipy (statistics), matplotlib (plotting). Recommendation beginner: zacznij od backtrader + Pandas. Po 2-3 mies. dodaj vectorbt dla optimization. MT5 wrapper jeśli chcesz deploy live.

Data sources — free vs paid?

Free sources: (1) Dukascopy: historical CSV M1 od 2003 r. EUR/USD, GBP/USD, all majors. Bid/ask separated. Top free option dla forex. Download via JForex API lub direct CSV. (2) Yahoo Finance: daily OHLC dla forex pairs. Limited (no intraday), ale free. yfinance Python library. (3) broker MT5 (Python wrapper): downloadowalne historical data od broker. Free dla account holders. Paid sources: (1) Polygon.io ($30/mies.): real-time + historical, nanosecond timestamps, all major pairs. Top dla professional. (2) Tiingo ($10/mies.): historical M1, decent quality, affordable. (3) TickStory ($25/mies.): tick data dla MT4/MT5 testing — convertuje na CSV dla Python. (4) HistData.com (free, donation): M1 historical, decent quality. Decision: beginner = Dukascopy free (90% use cases covered). Quant trader z statystyczną analysis = Polygon paid. Day-trader testing M1 strategies = TickStory dla broker-specific quotes. Warning: free data ma luki (weekend gaps, missing minutes). Paid data filled-in (institutional standard).

Common backtest biases — jak unikać?

4 najczęstsze biases które zabijają real-world performance: (1) Look-ahead bias: używasz data która nie była dostępna w momencie decyzji. Np. obliczasz daily close pivot levels w tym samym dniu (real life znasz dopiero next day). Mitigate: shift indicators by 1 period. (2) Survivorship bias: testujesz na pairs które still trade (e.g. EUR/PLN). Pomija pairs które delist (e.g. EEK-EUR, currencies replaced by EUR). Forex less affected niż stocks, ale exotic pairs (PLN/USD historycznie) bias. (3) Overfitting: optimizujesz parameters do historical data — działa idealnie w backtest, traci w live. Mitigate: walk-forward analysis (train 5 lat, test 1 rok, repeat 6×). Out-of-sample test mandatory. (4) Spread/slippage ignoring: backtest assumes mid-price execution. Real spread + slippage 1-5 pip per trade. 100 trades/mies. × 2 pip × 0.1 lot = €200 cost ignored. Mitigate: include realistic spread (0.5-1.5 pip dla majors), slippage model (random 0-2 pip), commission ($3-7/lot). Realistic backtest pokazuje 30-50% mniej profit niż naive. Best practice: jeśli backtest pokazuje >50% rocznie z realistic costs — sus, prawdopodobnie overfitting lub bias.

Pogłębij temat · pełny przewodnik