binance_btcusdt_1h.csv: descargar CSV BTCUSDT

Lectura
24 min~4 min lectura
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.

Respuesta directa

¿Dónde descargar y cómo usar binance_btcusdt_1h.csv en Backtrader?

Descargá binance_btcusdt_1h.csv desde /datasets/binance_btcusdt_1h.csv o generalo desde las klines de Binance para BTCUSDT con interval=1h. El CSV público trae 24 velas, datetime ISO UTC con T y Z, y columnas open, high, low, close y volume. En Backtrader cargalo con GenericCSVData mapeando datetime=0, open=1, high=2, low=3, close=4, volume=5 y openinterest=-1.

curl -L https://cursalo.com/datasets/binance_btcusdt_1h.csv -o binance_btcusdt_1h.csv
head -n 3 binance_btcusdt_1h.csv

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

Descargar, validar y cargar binance_btcusdt_1h.csv

Descarga el CSV publico, confirma que tiene encabezado, 24 velas y columnas en el orden correcto, y recien despues mapea cada campo en GenericCSVData. Este paso evita errores silenciosos en estrategias de trading.

Datos de entrada

URL: https://cursalo.com/datasets/binance_btcusdt_1h.csv
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

Resultado esperado

df.shape devuelve 24 filas y 6 columnas
headers=True ignora el encabezado del CSV
datetime=0 convierte la primera columna en tiempo
open/high/low/close mapean las velas OHLC
volume=5 usa volumen BTCUSDT de 1 hora
openinterest=-1 ignora una columna que el CSV no trae

Solución correcta

curl -L https://cursalo.com/datasets/binance_btcusdt_1h.csv -o binance_btcusdt_1h.csv
python - <<'PY'
import pandas as pd
df = pd.read_csv('binance_btcusdt_1h.csv')
print(df.shape)
print(df.columns.tolist())
PY

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

Errores comunes

  • - Usar dtformat='%Y-%m-%d %H:%M:%S' cuando el CSV trae T y Z.
  • - Olvidar headers=True y hacer que Backtrader intente leer datetime como una fecha.
  • - Cambiar el orden de columnas sin actualizar datetime, open, high, low, close y volume.
  • - Correr el backtest sin revisar que el CSV tenga encabezado y datos OHLCV reales.
  • - Mezclar datos spot BTCUSDT con una estrategia pensada para futuros, fees o apalancamiento.
Descarga directa

Descargar binance_btcusdt_1h.csv

Usa el archivo publico con 24 velas BTCUSDT 1h para practicar descarga, validacion de columnas OHLCV, GenericCSVData y un primer backtest reproducible.

URL: /datasets/binance_btcusdt_1h.csv Filas: 24 velas + encabezado Columnas: datetime, open, high, low, close, volume
Descargar CSV
De lección a portfolio

Convertí esta lección en evidencia para Data Analyst.

Sumá un mini caso con datos, una conclusión de negocio y una captura del resultado. Eso pesa más que decir que viste la herramienta.

Paso 1

Publicá una consulta, dashboard o notebook con una conclusión clara.

Paso 2

Agregá contexto: problema, dato usado, decisión recomendada y limitación.

Paso 3

Guardá el enlace en tu CV, LinkedIn o portfolio antes de postular.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión