入门 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 全面拆解

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

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

有问题,欢迎留言。

相关推荐
知忆_IS2 分钟前
【问题解决】从Anaconda环境迁移到miniforge并在IDEA中完成环境配置
python·conda·intellij-idea·miniforge
菜鸟谢11 分钟前
MQTT.Net
后端
excel12 分钟前
Node.js + TensorFlow.js(GPU 加速)完整安装指南(Windows 本地编译版)
前端·后端
zzc92117 分钟前
Pycharm选好的env有包,但是IDE环境显示无包
ide·python·pycharm·异常·import·
东阳马生架构33 分钟前
Dubbo源码—9.Consumer端的主要模块下
后端
蒋星熠33 分钟前
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
android·大数据·开发语言·c++·python·mysql·系统架构
databook36 分钟前
VS Code 中把「自己部署的 Coder 模型」变成 AI 编程助手
后端·openai·ai编程
用户61204149221336 分钟前
C语言做的停车场车牌识别系统
c语言·后端·图像识别
Victor3561 小时前
MySQL(197)如何监控MySQL?
后端
骇客野人1 小时前
java实用工具类
java·开发语言·python