Alternativa a backtesting.py para traders de cripto
backtesting.py es una librería Python excelente si ya trabajas en notebooks y prefieres conectar los datos tú mismo. Torquant es para cuando tienes la idea clara y quieres el backtest, no la puesta en marcha.
Qué simula Torquant de verdad
Torquant admite estrategias cripto direccionales: largo, corto y apalancamiento cuando lo pides. Los precios históricos provienen de velas de mercado spot (p. ej. BTCUSDT, ETHUSDT). Eso basta para probar la mayoría de ideas de tendencia, momentum y reversión a la media en pares cripto.
No es un simulador completo de perpetuos. Las tasas de funding, motores de liquidación y otras mecánicas específicas de perps no están modeladas. Si tu ventaja depende de eso, necesitas otro stack.
Para qué sirve backtesting.py
backtesting.py (de kernc) es una librería open source popular para ejecutar backtests vectorizados en Python. Subclasificas Strategy, implementas init() y next(), le pasas un DataFrame de pandas con velas OHLCV y llamas a Backtest.run(). Es rápida, modificable a mano e ideal cuando ya tienes un entorno Python y datos históricos limpios en disco.
La fricción para muchos traders de cripto está en todo lo que rodea a la librería: instalar Python, bajar velas del exchange, alinear timestamps, rellenar huecos y convertir una idea en código repetitivo antes de ver una curva de capital.
Flujo de trabajo típico
Mismo objetivo: ver si un cruce de SMA en ETH habría funcionado. Dos caminos muy distintos para llegar ahí.
Con backtesting.py
Instalar Python, pip y la librería (pip install backtesting).
Descargar u obtener OHLCV del par cripto y timeframe.
Limpiar el DataFrame: índice datetime, nombres de columnas, huecos, zonas horarias.
Escribir una clase Strategy con indicadores y lógica de entrada/salida.
Ejecutar el backtest y luego graficar o exportar estadísticas por tu cuenta.
Con Torquant
Abrir la app web. Sin instalación.
Describir la estrategia con palabras sencillas o usar el constructor guiado.
Lanzar el backtest con datos de pares cripto ya integrados.
Revisar curva de capital, drawdown y comparación con buy-and-hold.
Refinar la idea y volver a ejecutar en minutos.
Del prompt al código
Un cruce cabe en un ejemplo de código corto. Añade unas reglas más al prompt y el script crece rápido.
Cruce SMA en ETH 4 horas
Prompt de Torquant
“ETH 4h: long when SMA 8 crosses above SMA 20. Exit on cross below.”
Algo más complejo: seguimiento de tendencia diario en ETH
Unas líneas extra en el prompt añaden momentum, una SMA ascendente, una banda RSI, volumen, sizing con ATR y un cooldown de reentrada. En backtesting.py eso se convierte en preparación de CSV, helpers de indicadores, variables de estado, lógica de sizing y un script para ejecutarlo todo.
Prompt de Torquant
“Daily ETH trend follow. Long when 20d momentum is at least +5%, price above SMA 30 rising vs 5 bars ago, RSI(14) 40 to 65, volume at or above 20d avg. Exit on close below SMA 30 or negative 20d momentum. Size with ATR(14) for about 10% equity at risk. One position, 5 bar cooldown after exit.”
Código backtesting.py
import numpy as np
import pandas as pd
from backtesting import Backtest, Strategy
def load_eth_daily_csv(path: str) -> pd.DataFrame:
"""You source OHLCV before Backtest(...) can run."""
df = pd.read_csv(path)
df.columns = [c.strip().title() for c in df.columns]
rename = {"Timestamp": "Date", "Datetime": "Date", "Open_time": "Date"}
df = df.rename(columns={k: v for k, v in rename.items() if k in df.columns})
df["Date"] = pd.to_datetime(df["Date"], utc=True)
df = df.set_index("Date").sort_index()
df = df[["Open", "High", "Low", "Close", "Volume"]].astype(float)
return df[~df.index.duplicated(keep="first")].dropna()
def sma(values, period):
return pd.Series(values).rolling(period).mean()
def rsi(values, period=14):
delta = pd.Series(values).diff()
gain = delta.clip(lower=0).rolling(period).mean()
loss = (-delta.clip(upper=0)).rolling(period).mean()
rs = gain / loss.replace(0, np.nan)
return 100 - (100 / (1 + rs))
def atr(high, low, close, period=14):
h, l, c = map(pd.Series, (high, low, close))
prev_c = c.shift(1)
tr = pd.concat([
h - l,
(h - prev_c).abs(),
(l - prev_c).abs(),
], axis=1).max(axis=1)
return tr.rolling(period).mean()
def momentum_pct(close, period=20):
s = pd.Series(close)
return s / s.shift(period) - 1.0
class EthTrendVolSized(Strategy):
mom_period = 20
ma_period = 30
atr_period = 14
rsi_period = 14
vol_ma_period = 20
mom_entry = 0.05
equity_risk = 0.10
cooldown_bars = 5
def init(self):
c = self.data.Close
h = self.data.High
l = self.data.Low
v = self.data.Volume
self.ma30 = self.I(sma, c, self.ma_period)
self.momentum = self.I(momentum_pct, c, self.mom_period)
self.rsi = self.I(rsi, c, self.rsi_period)
self.atr = self.I(atr, h, l, c, self.atr_period)
self.vol_ma = self.I(sma, v, self.vol_ma_period)
self.bars_since_exit = self.cooldown_bars
def _ma_rising(self):
if len(self.ma30) < 6:
return False
return self.ma30[-1] > self.ma30[-6]
def _atr_position_size(self):
atr_val = float(self.atr[-1])
price = float(self.data.Close[-1])
if not np.isfinite(atr_val) or atr_val <= 0 or price <= 0:
return 0.0
risk_cash = self.equity * self.equity_risk
units = risk_cash / atr_val
fraction = (units * price) / self.equity
return min(max(fraction, 0.0), 0.99)
def next(self):
self.bars_since_exit += 1
warmup = max(self.ma_period, self.mom_period, self.vol_ma_period) + 6
if len(self.data) < warmup:
return
price = float(self.data.Close[-1])
mom = float(self.momentum[-1])
rsi_val = float(self.rsi[-1])
ma = float(self.ma30[-1])
vol_ok = float(self.data.Volume[-1]) >= float(self.vol_ma[-1])
if self.position:
if price < ma or mom < 0:
self.position.close()
self.bars_since_exit = 0
return
if self.bars_since_exit < self.cooldown_bars:
return
entry_ok = (
mom >= self.mom_entry
and price > ma
and self._ma_rising()
and 40 <= rsi_val <= 65
and vol_ok
)
if not entry_ok:
return
size = self._atr_position_size()
if size > 0:
self.buy(size=size)
if __name__ == "__main__":
data = load_eth_daily_csv("eth_usd_daily.csv")
bt = Backtest(
data,
EthTrendVolSized,
cash=100_000,
commission=0.001,
exclusive_orders=True,
trade_on_close=True,
)
stats = bt.run()
print(stats[["Return [%]", "Max. Drawdown [%]", "Sharpe Ratio", "# Trades"]])
bt.plot(open_browser=False)
Las estrategias pueden complicarse mucho más. Incluso este ejemplo intermedio resume el patrón: unas frases en el prompt frente a más de 130 líneas de Python que mantener.
De un vistazo
Característica
Torquant
backtesting.py
Lenguaje
Lenguaje natural o interfaz guiada
Python obligatorio
Instalación y entorno
Ninguna. En el navegador.
Python, pip, virtualenv, dependencias
Datos de precio cripto
Integrados para pares USDT
Tú obtienes y preparas datos CSV/API
Largo, corto, apalancamiento
Sí, cuando los especificas
Sí, en tu código Strategy
Tiempo hasta el primer backtest
Minutos
A menudo horas en la primera configuración
Flexibilidad de estrategia
Patrones comunes de entrada/salida, indicadores, filtros
Lógica Python arbitraria en next()
Código abierto y autoalojado
Producto alojado
Licencia MIT, ejecución local
Salida
Curva de equity, drawdown, vs buy & hold
Estadísticas personalizadas, gráficos con matplotlib / tu código
Ideal para
Traders de cripto que prueban ideas sin código
Desarrolladores que construyen pipelines de backtest en Python
Cuándo Torquant encaja mejor
No buscas convertirte en quant con Python. Quieres saber si tu filtro RSI, tu reversión con Bollinger o tu cruce de medias aguantó en BTC o ETH antes de operarlo en real.
Llegaste buscando alternativa a backtesting.py porque montar el entorno cuesta más que validar una idea rápida.
No tienes OHLCV limpio a mano y no quieres programar una descarga del exchange.
Piensas en reglas («comprar con RSI por debajo de 30») más que en clases y DataFrames.
Quieres probar varias ideas esta semana, no mantener un repo de investigación.
Cuándo backtesting.py encaja mejor
backtesting.py sigue siendo una opción sólida cuando el código es el producto: iteras lógica de ejecución, fills personalizados, reglas a nivel de cartera o conectas backtests a un pipeline automatizado.
Ya trabajas en Jupyter o VS Code y versionas el código de estrategia.
Necesitas lógica de órdenes no estándar, indicadores personalizados o control fino de cada vela.
Haces backtesting de activos no cripto con tus propios datasets.
Quieres una librería gratuita, open source y sin dependencia de un proveedor.
Preguntas frecuentes
¿Es Torquant un reemplazo directo de backtesting.py?
No. Torquant no es una librería Python ni ejecuta tus scripts. Es una app web para describir estrategias cripto con palabras sencillas y backtestear sin entorno local. Si necesitas código Python a medida vela a vela, backtesting.py encaja mejor.
¿Puedo hacer backtesting cripto con backtesting.py?
Sí. Muchos desarrolladores lo hacen. Normalmente exportas velas de un exchange o API a un DataFrame de pandas con columnas Open, High, Low, Close y Volume, y lo pasas a Backtest. Torquant evita esa preparación de datos en pares cripto compatibles.
¿Puedo hacer backtesting de una estrategia perp o apalancada?
Puedes probar lógica larga, corta y apalancada sobre el histórico de pares cripto en Torquant. Los datos de precio son velas de mercado spot, no un feed dedicado de perpetuos. Funding, liquidación y otras mecánicas específicas de perpetuos no se simulan.
¿Cuál es más rápido para una idea puntual?
Para un trader sin configuración Python, Torquant suele ser más rápido: abrir la app, describir la regla, ejecutar. Para un desarrollador con datos en disco y entorno configurado, backtesting.py también puede ser rápido. La diferencia está en la configuración inicial, no en la velocidad de simulación.
Sé Python pero estoy cansado del trabajo de preparación. ¿Tiene sentido?
Sí. Es un motivo habitual para usar Torquant. Puedes volver a backtesting.py cuando una idea pase a estrategia codificada o necesite lógica que Torquant no admite.