Saltar al contenido

Lección 11 de 20 · Lectura y práctica

Descargar binance_btcusdt_1h.csv para Backtrader

Respuesta rápida: descargar binance_btcusdt_1h.csv: Para probar Backtrader con velas de Binance, usá un CSV OHLCV con columnas datetime,open,high,low,close,volume. Descargá el archivo de práctica binance_btcusdt_1h.csv, guardalo.

Del concepto a la práctica

Taller de esta lección

Antes de cargar un CSV en un backtester, valida su contrato de datos: nombres de columnas, orden temporal, separador, zona horaria declarada y unidades. Un archivo pequeño de práctica sirve para comprobar el formato, pero no demuestra que una estrategia sea válida.

Ejemplo resuelto

Usa tres filas locales con columnas datetime,open,high,low,close,volume: 2026-01-01T00:00:00Z, 100, 101, 99, 100, 5; 2026-01-01T01:00:00Z, 100, 102, 100, 101, 4; 2026-01-01T02:00:00Z, 101, 103, 100, 102, 6. Todas las fechas están en UTC y las filas son ficticias, no una descarga de mercado. La segunda fila cumple low <= open <= high y low <= close <= high.

Pruébalo

  1. Lee el CSV como texto y comprueba las seis columnas.

  2. Convierte precios y volumen a número.

  3. Verifica fechas ascendentes y valores OHLC coherentes.

  4. Rechaza filas incompletas antes del backtest.

Comprueba tu resultado

Error frecuente: desplazar índices porque el cargador espera otra columna. Corrección: documenta el mapeo explícito de cada campo.

Ejercicio: cambia el máximo de la segunda fila a 99. Resultado esperado: la validación falla porque el cierre 101 queda fuera del intervalo de la vela.

Prueba cronológica de una estrategia con datos históricos, costes y riesgo antes de validarla en otro periodo.
CursaloMapa de práctica
Probar una estrategia sin dinero real

Una simulación utiliza datos históricos y debe incluir comisiones y deslizamiento. Separar el periodo de desarrollo del de validación reduce el ajuste al pasado. Examina pérdidas y caídas además del resultado; una prueba histórica no garantiza ganancias futuras.

Ver la infografía en tamaño completo ↗
Respuesta rápida: descargar binance_btcusdt_1h.csv: Para probar Backtrader con velas de Binance, usá un CSV OHLCV con columnas datetime,open,high,low,close,volume. Descargá el archivo de práctica binance_btcusdt_1h.csv, guardalo en data/binance_btcusdt_1h.csv y cargalo con bt.feeds.GenericCSVData.

Descargar binance_btcusdt_1h.csv

Si buscás "binance_btcusdt_1h.csv", esta lección incluye un archivo CSV listo para descargar y usar en Backtrader. El archivo de práctica contiene 24 velas BTCUSDT de 1 hora tomadas del endpoint público de Binance el 2026-05-19. Sirve para validar formato, instalación y ejecución de Backtrader antes de trabajar con históricos más grandes.

Descargar binance_btcusdt_1h.csv

Archivo: binance_btcusdt_1h.csv
Columnas: datetime, open, high, low, close, volume
Uso: Backtrader GenericCSVData
Intervalo: BTCUSDT 1h
datetime,open,high,low,close,volume
2026-05-18T04:00:00Z,76924.66000000,77069.77000000,76772.01000000,77038.49000000,354.48166000
2026-05-18T05:00:00Z,77038.49000000,77080.93000000,76884.33000000,76931.40000000,586.83852000

Columnas que espera Backtrader

ColumnaÍndiceUso en Backtrader
datetime0Fecha y hora de apertura de la vela.
open1Precio de apertura.
high2Máximo de la vela.
low3Mínimo de la vela.
close4Precio de cierre.
volume5Volumen operado.

El CSV no incluye openinterest. Por eso se configura openinterest=-1.

Instalar Backtrader y preparar carpetas

python -m venv .venv
source .venv/bin/activate
pip install backtrader pandas matplotlib
mkdir -p data
# colocá el archivo descargado en:
# data/binance_btcusdt_1h.csv

Si estás en Windows, activá el entorno con .venv\Scripts\activate. La estructura mínima del proyecto queda así:

trading-backtest/
  data/
    binance_btcusdt_1h.csv
  backtest_btcusdt.py

Validar el CSV antes del backtest

Antes de abrir Backtrader, comprobá que el archivo tiene columnas, fechas y tipos numéricos correctos:

import pandas as pd

df = pd.read_csv("data/binance_btcusdt_1h.csv")
print(df.head())
print(df.dtypes)

required = ["datetime", "open", "high", "low", "close", "volume"]
missing = [column for column in required if column not in df.columns]
if missing:
    raise ValueError(f"Faltan columnas: {missing}")

df["datetime"] = pd.to_datetime(df["datetime"], utc=True)
for column in ["open", "high", "low", "close", "volume"]:
    df[column] = pd.to_numeric(df[column])

print(df[required].tail())

Este chequeo evita errores silenciosos: fechas como texto mal interpretado, columnas desordenadas, separadores incorrectos o valores vacíos.

Cargar binance_btcusdt_1h.csv con GenericCSVData

Backtrader lee el archivo con GenericCSVData. La parte importante es mapear cada columna a su índice real:

import backtrader as bt

data = bt.feeds.GenericCSVData(
    dataname="data/binance_btcusdt_1h.csv",
    dtformat="%Y-%m-%dT%H:%M:%SZ",
    datetime=0,
    open=1,
    high=2,
    low=3,
    close=4,
    volume=5,
    openinterest=-1,
)

cerebro = bt.Cerebro()
cerebro.adddata(data, name="BTCUSDT-1h")

Backtest completo con cruce de medias

Este ejemplo es intencionalmente simple. No es recomendación financiera: es una prueba técnica para confirmar que el entorno, el CSV y el motor de backtesting funcionan.

import backtrader as bt


class MovingAverageCross(bt.Strategy):
    params = (("fast", 6), ("slow", 12))

    def __init__(self):
        self.fast_ma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.fast)
        self.slow_ma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.slow)
        self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)

    def next(self):
        if not self.position and self.crossover > 0:
            self.buy(size=0.01)
        elif self.position and self.crossover < 0:
            self.close()


data = bt.feeds.GenericCSVData(
    dataname="data/binance_btcusdt_1h.csv",
    dtformat="%Y-%m-%dT%H:%M:%SZ",
    datetime=0,
    open=1,
    high=2,
    low=3,
    close=4,
    volume=5,
    openinterest=-1,
)

cerebro = bt.Cerebro()
cerebro.addstrategy(MovingAverageCross)
cerebro.adddata(data, name="BTCUSDT-1h")
cerebro.broker.setcash(10000)
cerebro.broker.setcommission(commission=0.001)

print(f"Capital inicial: {cerebro.broker.getvalue():.2f}")
cerebro.run()
print(f"Capital final: {cerebro.broker.getvalue():.2f}")

Generar tu propio CSV desde Binance

Binance expone velas con GET /api/v3/klines. Para BTCUSDT de 1 hora usás symbol=BTCUSDT, interval=1h y convertís open time, open, high, low, close y volume al formato que usa esta lección.

import csv
import requests
from datetime import datetime, timezone

url = "https://api.binance.com/api/v3/klines"
params = {"symbol": "BTCUSDT", "interval": "1h", "limit": 100}
rows = requests.get(url, params=params, timeout=20).json()

with open("data/binance_btcusdt_1h.csv", "w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["datetime", "open", "high", "low", "close", "volume"])
    for row in rows:
        open_time = datetime.fromtimestamp(row[0] / 1000, tz=timezone.utc)
        writer.writerow([
            open_time.strftime("%Y-%m-%dT%H:%M:%SZ"),
            row[1],
            row[2],
            row[3],
            row[4],
            row[5],
        ])

Referencias oficiales: Binance Kline/Candlestick data y Backtrader Data Feeds.

Errores comunes con binance_btcusdt_1h.csv

ErrorCausa probableSolución
time data does not match formatEl formato de fecha no coincide con dtformat.Usá %Y-%m-%dT%H:%M:%SZ para fechas ISO con Z.
Backtest sin operacionesMuy pocas velas para los períodos de medias.Bajá fast/slow o descargá más velas.
Valores absurdosColumnas mal mapeadas.Confirmá índices: datetime 0, open 1, high 2, low 3, close 4, volume 5.
Resultados demasiado buenosComisiones, slippage o look-ahead bias ignorados.Agregá comisión realista y no uses datos futuros en next().

Checklist para un backtest presentable

  • El dataset tiene fuente, fecha de descarga, símbolo, intervalo y columnas documentadas.
  • El script corre desde cero con instrucciones de instalación claras.
  • La estrategia no usa datos futuros.
  • El backtest incluye comisión y capital inicial explícitos.
  • El README explica límites: muestra corta, sin recomendación financiera y sin garantía de rendimiento real.

Convertirlo en portfolio laboral

Para que esta práctica sirva en una entrevista o propuesta freelance, subí un repositorio con el CSV de muestra, el script de Backtrader, un README y una captura de salida. Después agregá una versión que descargue datos recientes desde Binance y compare dos estrategias simples.

Este tipo de proyecto conecta con rutas de empleos tech en data, automatización y finanzas, y también con servicios que podés ofrecer en el marketplace de profesionales: limpieza de datos, backtesting básico, dashboards de riesgo o automatizaciones Python.

Sigue con Desarrollo de Bots de Trading Algorítmico con Python y Binance API

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.