大家好,我是花姐。
很多人都听说 Backtrader 是量化回测神器,但一看文档就懵了,怎么全是英文,对于英文差的人来说简直是一个头两个大!
今天这篇文章,我不讲废话,从六个维度彻底拆解 Backtrader:
数据结构 → 资金佣金 → 加载数据 → 构建策略 → 添加指标 → 策略回测
你读完这篇,就能搭好自己的量化回测框架,从"看别人做策略"走到"自己调策略"!
零、先把环境整好!
别急,咱们一步一步来:
第一步,安装 Python。我推荐直接去官网下个最新版就行。装完后,命令行里输:
bash
python --version
能看到版本号就说明搞定了。
接着装 pip(通常 Python 自带了),然后创建一个新文件夹,开干。
我自己平时用的是 VSCode。界面干净、插件好用,最重要的是------能自动补全变量名,这对我这种懒人来说简直是福音。
然后安装我们要用的工具:
bash
pip install backtrader matplotlib pandas
搞定收工。
一、Backtrader 的数据结构特点
Backtrader 是面向对象设计的,一切都以类为核心组件,整体结构分成几个核心模块:
组件 | 说明 |
---|---|
Cerebro |
大脑,控制整个策略执行流程(类似策略引擎) |
Strategy |
自定义交易逻辑的主类 |
DataFeed |
数据输入结构(支持CSV、Pandas、在线) |
Broker |
资金账户管理,包括现金、佣金等 |
Observer |
可视化组件,用于绘图和显示交易过程 |
Indicator |
技术指标模块,如 MA、MACD 等 |
核心逻辑 是把你定义的策略和数据,扔进 Cerebro 这个"大脑"去跑一遍。

这是一套解耦且灵活的设计。你可以随意组合策略、数据、指标,实现复用与扩展。
二、资金管理与佣金设置
回测第一步:搞清楚你"账户"有多少钱、怎么扣手续费。
资金初始化:
python
cerebro.broker.setcash(1000000) # 初始资金100万
设置佣金:
python
cerebro.broker.setcommission(commission=0.001) # 千分之一佣金
你也可以自定义滑点、印花税,甚至构造自己的 Broker 类。
💡Tips:股票策略中,手续费常见是 1‰,有的平台会再加万一印花税(卖出收)。
三、数据加载方式
Backtrader 支持三类数据输入:
类型 | 举例 |
---|---|
在线数据 | Yahoo Finance、Quandl |
本地 CSV 文件 | 股票行情csv格式数据 |
Pandas 数据 | 用 bt.feeds.PandasData 输入 |
想快速了解Backtrader用法的,推荐使用 yfinance
快速抓取数据,回测测试很方便:
python
import yfinance as yf
df = yf.download('AAPL', start='2020-01-01', end='2022-01-01')
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
作为国人,这里推荐用AKShare、baoStock库,或者用花姐之前讲的xtquant+MiniQMT也是非常赞的解决方案。 详情可以参考以下文章: 《MiniQMT+Backtrader:平民股票量化界的"黄金搭档",永远的神!》 mp.weixin.qq.com/s/fi8SuuJ_s...
四、构建策略类
策略必须继承 bt.Strategy
类,实现两个核心方法:
python
class MyStrategy(bt.Strategy):
def __init__(self):
# 初始化指标或状态
self.ma5 = bt.ind.SMA(self.datas[0], period=5)
def next(self):
# 每根K线触发一次,决定是否买卖
if self.ma5[0] > self.ma5[-1]:
self.buy()
常用方法说明:
方法 | 作用 |
---|---|
__init__ |
初始化策略、定义指标 |
next() |
每根K线触发一次判断逻辑 |
buy()/sell() |
发起买卖操作 |
notify_order() |
监听订单状态(成交/拒绝) |
这套框架类似量化平台的"策略执行器"。
五、添加指标:技术派的好帮手
Backtrader 内置了大量指标,包括:
SMA
:Simple Moving AverageEMA
:Exponential MAMACD
、RSI
、ATR
等常见指标
用法超级简单:
python
self.ma5 = bt.ind.SMA(self.datas[0].close, period=5)
self.macd = bt.ind.MACD(self.datas[0].close)
你也可以:
- 用
self.indicators
统一管理指标 - 自定义指标类(继承
bt.Indicator
)
💡 记住:所有指标默认都是"延迟一根"计算的,因为你不能用未来的数据,符合实盘规则。
六、策略回测流程全流程
完整回测流程只有 6 步,贴一套最小可运行模板👇
python
import backtrader as bt
import yfinance as yf
# 1. 策略类
class TestStrategy(bt.Strategy):
def __init__(self):
self.ma5 = bt.ind.SMA(self.datas[0].close, period=5)
self.ma10 = bt.ind.SMA(self.datas[0].close, period=10)
def next(self):
if not self.position:
if self.ma5[0] > self.ma10[0] and self.ma5[-1] <= self.ma10[-1]:
self.buy()
else:
if self.ma5[0] < self.ma10[0] and self.ma5[-1] >= self.ma10[-1]:
self.sell()
# 2. 初始化Cerebro
cerebro = bt.Cerebro()
cerebro.addstrategy(TestStrategy)
# 3. 下载数据
df = yf.download("AAPL", start="2020-01-01", end="2022-01-01")
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
# 4. 设置资金与佣金
cerebro.broker.setcash(1000000)
cerebro.broker.setcommission(commission=0.001)
# 5. 执行回测
print('初始资金: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('回测后资金: %.2f' % cerebro.broker.getvalue())
# 6. 绘图
cerebro.plot()
运行完这套代码,你就真正理解了:
- 指标是怎么加的
- 数据怎么接入
- 策略怎么执行
- 结果怎么评估
小结:Backtrader 的实战价值
Backtrader 好在哪?我总结为三点:
- 结构清晰:OOP 思维,符合策略模块化设计
- 灵活扩展:可自定义指标、手续费、交易逻辑
- 实盘接轨:设计贴近实盘限制,防未来数据穿越
对 Python 熟一点的朋友来说,这是一套半天学会、一天上手、三天上战绩的回测利器
花姐建议
- 👉 用 Backtrader 学回测比盲猜技术指标靠谱多了
- 👉 每个策略都先设 stop-loss,别回测赚,实盘亏
- 👉 别迷信一条线,组合策略更稳健
这就是今天的干货:从框架到底层逻辑,Backtrader 全面拆解。
如果你是量化小白,强烈建议你:
跑一遍,调一遍,动手了你就懂了
有问题,欢迎留言。