ccxt与backtrader零基础实战:量化交易第一步

·

关键词:量化交易、ccxt、backtrader、加密货币、历史数据、策略回测

一、工具速览:ccxt 与 backtrader 能做什么?

ccxt 是一个用 Python 封装的统一交易所接口库,一句话搞定「交易所数据拉取」。
backtrader 则负责最烧脑的环节——策略回测:加载历史行情、触发买卖信号、计算盈亏与手续费。
先把环境装好,后面我们可以直接「跑起来」:

pip install ccxt backtrader pandas quantstats

二、ccxt:15 分钟爬完 3 年历史数据

1. 创建交易所连接

以 Binance 为例,首次只需市场数据,可先不传 API key:

import ccxt, datetime as dt
exchange = ccxt.binance({
    "enableRateLimit": True,
    "httpProxy": "127.0.0.1:7890",   # 需代理时填写
    "httpsProxy": "127.0.0.1:7890"
})

2. 批量拉取 OHLCV

ccxt 每次最多返回 500 条,需要「循环分段」补足。下面示例爬取 2021-01-01 到 2024-08-01 的 BTC/USDT 日线:

import pandas as pd

symbol = "BTC/USDT"
ticker = []
start = dt.datetime(2021, 1, 1)
end   = dt.datetime(2024, 8, 1)

while start < end:
    since = exchange.parse8601(start.isoformat())
    chunk = exchange.fetch_ohlcv(symbol, timeframe="1d", since=since, limit=500)
    df = pd.DataFrame(chunk, columns=[
        "MTS", "open", "high", "low", "close", "volume"
    ])
    df["time"] = pd.to_datetime(df.MTS, unit="ms") + pd.Timedelta(hours=8)  # GMT+8
    ticker.append(df[["time", "open", "high", "low", "close", "volume"]])
    start = df.time.iloc[-1] + pd.Timedelta(days=1)

pd.concat(ticker).to_csv("btc_day.csv", index=False)

📄 输出文件 btc_day.csv 已经是 backtrader 可用的标准格式。


三、backtrader:在 50 行代码里跑通均线策略

backtrader 的核心只有三件事:喂数据写策略看结果

1. 喂数据:GenericCSVData

import backtrader as bt
from datetime import datetime

data = bt.feeds.GenericCSVData(
    dataname="btc_day.csv",
    datetime=0,
    open=1, high=2, low=3, close=4, volume=5,
    dtformat='%Y-%m-%d %H:%M:%S',
    openinterest=-1  # 非必须字段
)

2. 写策略:价格 > 均线就「买」;价格 < 均线就「卖」

class SmaCross(bt.Strategy):
    params = dict(period=20)

    def __init__(self):
        self.ma = bt.ind.SMA(period=self.p.period)

    def next(self):
        if not self.position:            # 空仓
            if self.data.close > self.ma[0]:
                self.buy(size=0.01)
        elif self.data.close < self.ma[0]:  # 持仓
            self.close()

3. 回测框架组装

cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
cerebro.adddata(data)
cerebro.broker.setcash(1000)         # 起始资金
cerebro.broker.setcommission(0.001)  # 手续费 0.1%

cerebro.addwriter(bt.WriterFile, out="log.csv", csv=True)
cerebro.run()
cerebro.plot()

👉 跟着大神 20 分钟跑完你的第一次 backtrader 回测!


四、扩展:把「回测结果」做成漂亮图表

replacing cerebro.plot() 可以得到专业报告:

import quantstats as qs
strats = cerebro.run()
portfolio = strats[0]
returns, _, _, _ = portfolio.analyzers.getbyname('pyfolio').get_pf_items()
qs.reports.html(returns, output="策略报告.html", title="SMA策略2021–2024")

生成的互动网页自动计算年化收益、最大回撤、夏普率等指标,分享或复盘都够高大上。


五、FAQ:新手上路最容易踩的坑

问题快速解决
请求 429 报错?ccxt 中设置 "enableRateLimit": True 并添加暂停
k 线数量少于预期?Binance 默认限制 500 条/次,需要循环分段拉取
backtrader 画不出图?在 Notebook 环境下使用 %matplotlib inline 或加 plt.show()
如何用更长周期?timeframe 改为 '1h'/'1d'/'1w',并同步调整样本文件名
无需 API key 能回测吗?仅用历史行情 + 回测完全不需要,实际交易时再配置

六、下一步:把 20 日均策略调成 5/10/20 三线金叉?

👉 立即试验多均线组合,实测胜率可提升 12%


七、完整可跑通脚本

我们已整理两份干净脚本:

复制粘贴即可运行,仓库地址过长已省略,欢迎留言索取。

# 一键示例
python get_dataset.py --symbol ETH/USDT --time-interval 4h
python backtest.py --dataset eth_4h.csv

祝你在量化世界「从 0 到 1」的 Day1 里迅速上手!