入门 Backtrader 必看:用 Python 回测股票策略,真的不难!

大家好,我是花姐。

很多人都听说 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 Average
  • EMA:Exponential MA
  • MACDRSIATR 等常见指标

用法超级简单:

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 好在哪?我总结为三点:

  1. 结构清晰:OOP 思维,符合策略模块化设计
  2. 灵活扩展:可自定义指标、手续费、交易逻辑
  3. 实盘接轨:设计贴近实盘限制,防未来数据穿越

对 Python 熟一点的朋友来说,这是一套半天学会、一天上手、三天上战绩的回测利器


花姐建议

  • 👉 用 Backtrader 学回测比盲猜技术指标靠谱多了
  • 👉 每个策略都先设 stop-loss,别回测赚,实盘亏
  • 👉 别迷信一条线,组合策略更稳健

这就是今天的干货:从框架到底层逻辑,Backtrader 全面拆解

如果你是量化小白,强烈建议你:

跑一遍,调一遍,动手了你就懂了

有问题,欢迎留言。

相关推荐
kobe_OKOK_9 分钟前
Python 链接各种中间件[Mysql\redis\mssql\tdengine]
python
要努力啊啊啊13 分钟前
importlib.import_module() 的用法与实战案例
python·深度学习·目标检测·计算机视觉
企业软文推广26 分钟前
跨境企业破局国际市场:海外媒体发稿如何为品牌声誉赋能?
大数据·人工智能·python
love530love34 分钟前
使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》
开发语言·人工智能·windows·python·机器学习·conda
宝山哥哥1 小时前
python办自动化--读取邮箱中特定的邮件,并下载特定的附件
python·信息可视化·自动化
码事漫谈1 小时前
DDD领域驱动设计C++实现案例:订单管理系统
后端
Cache技术分享1 小时前
139. Java 泛型 - Java 通配符使用准则
前端·后端
_代号0071 小时前
MySQL梳理二:索引
后端·mysql
蜗牛快跑1231 小时前
Trae Solo 模式使用两天,感觉这个 3 美金比上次划算
前端·后端