Saltar al contenido

Comparativa

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

  1. Instalar Python, pip y la librería (pip install backtesting).
  2. Descargar u obtener OHLCV del par cripto y timeframe.
  3. Limpiar el DataFrame: índice datetime, nombres de columnas, huecos, zonas horarias.
  4. Escribir una clase Strategy con indicadores y lógica de entrada/salida.
  5. Ejecutar el backtest y luego graficar o exportar estadísticas por tu cuenta.

Con Torquant

  1. Abrir la app web. Sin instalación.
  2. Describir la estrategia con palabras sencillas o usar el constructor guiado.
  3. Lanzar el backtest con datos de pares cripto ya integrados.
  4. Revisar curva de capital, drawdown y comparación con buy-and-hold.
  5. 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.”

Código backtesting.py

class SmaCross(Strategy):
    n1, n2 = 8, 20

    def init(self):
        close = self.data.Close
        self.sma1 = self.I(SMA, close, self.n1)
        self.sma2 = self.I(SMA, close, self.n2)

    def next(self):
        if crossover(self.sma1, self.sma2):
            self.buy()
        elif crossover(self.sma2, self.sma1):
            self.sell()

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.

Olvídate de la configuración Python

Describe tu estrategia cripto y ejecuta un backtest con datos integrados. Sin pip install, sin fusionar CSV, sin clase Strategy.