关键词:量化交易、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 三线金叉?
七、完整可跑通脚本
我们已整理两份干净脚本:
get_dataset.py
—— 纯数据抓取backtest.py
—— 纯策略回测
复制粘贴即可运行,仓库地址过长已省略,欢迎留言索取。
# 一键示例
python get_dataset.py --symbol ETH/USDT --time-interval 4h
python backtest.py --dataset eth_4h.csv
祝你在量化世界「从 0 到 1」的 Day1 里迅速上手!