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