Python do backtestowania forex — backtrader, Pandas, ccxt
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:
Top 5 libraries 2026
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
- Load data Pandas:
df = pd.read_csv('eurusd_m1.csv', parse_dates=['datetime']) - Define strategy: backtrader Strategy class z next() method, indicators
- Run backtest: cerebro.addstrategy() + cerebro.run()
- Analyze metrics: Sharpe, max DD, win rate, profit factor
- Walk-forward analysis: train 5 lat, test 1 rok, repeat 6 periods
- 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:
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
- Look-ahead bias: używasz future data w decision. Mitigate: shift indicators by 1.
- Survivorship: testujesz tylko surviving pairs. Mitigate: include delisted (PLN/USD historycznie).
- Overfitting: parameters perfectly tuned do historical. Mitigate: walk-forward mandatory.
- 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.
Źródła i bibliografia
-
backtrader Python algorithmic trading library · oryginalny project Daniel Rodriguez www.backtrader.com ↗
-
Polygon.io Forex data API · institutional-grade data polygon.io ↗
-
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.