Python

Backtest simple: cruce de medias moviles

Backtest vectorizado de una estrategia SMA 20/50 sobre velas H1: posicion desplazada una barra (sin look-ahead), equity curve, winrate y drawdown maximo.

Requisitos

Python 3.9+, pandas

Python
import pandas as pd

px = pd.read_csv("eurusd_h1.csv", parse_dates=["time"], index_col="time")["close"]
rapide, lente = px.rolling(20).mean(), px.rolling(50).mean()
position = (rapide > lente).astype(int).shift(1).fillna(0)   # exécuté à la barre suivante
rendements = px.pct_change().fillna(0) * position

equity = (1 + rendements).cumprod()
drawdown = (equity / equity.cummax() - 1).min()
trades = position.diff().abs().sum() / 2
barres_actives = rendements[position == 1]

print("Backtest SMA 20/50 — EURUSD H1")
print(f"  période       : {px.index[0]:%Y-%m-%d} → {px.index[-1]:%Y-%m-%d}")
print(f"  trades        : {trades:.0f}")
print(f"  perf totale   : {equity.iloc[-1] - 1:+.2%}")
print(f"  barres gagnantes : {(barres_actives > 0).mean():.1%}")
print(f"  max drawdown  : {drawdown:.2%}")
print("  verdict       : " + ("à approfondir" if equity.iloc[-1] > 1 else "à écarter"))

Resultado

Backtest SMA 20/50 — EURUSD H1
  période       : 2024-01-02 → 2026-06-05
  trades        : 187
  perf totale   : +14.62%
  barres gagnantes : 51.8%
  max drawdown  : -7.34%
  verdict       : à approfondir
BacktestTradingpandasSMADrawdown

Snippets relacionados

Volver al Data Lab