Backtesting.py / Architecture

Backtesting.py 架构:Backtest 与 Strategy 核心组件与生命周期

Backtesting.py 的架构围绕两个核心类展开:Backtest 负责引擎(现金、佣金、撮合、统计),Strategy 负责策略逻辑(init 计算指标、next 逐 bar 交易)。理解这两个类,就能读懂大多数回测脚本。

Backtest:回测引擎Strategy:策略基类lib:组合式工具
Backtest引擎 · 统计 · 撮合
Strategy.init()计算指标
Strategy.next()逐 bar 交易
backtesting.libcrossover/SMA 工具
Backtesting.py 组件架构示意(基于官方 README,非官方架构图)。
Components

核心组件对照

Backtesting.py 的模块划分与各自职责。

模块职责关键入口
backtesting.Backtest回测引擎:现金、佣金、订单撮合、运行与统计Backtest(data, strategy, cash, commission)
backtesting.Strategy策略基类:init 计算指标、next 写交易逻辑class SmaCross(Strategy)
backtesting.lib组合式工具:crossover、SMA 等辅助函数from backtesting.lib import crossover
backtesting.test内置示例数据与指标from backtesting.test import SMA, GOOG
Lifecycle

Strategy 生命周期:init 与 next

策略类有两个关键方法,理解它们的调用时机是正确回测的前提。

  1. init(self)

    回测开始前调用一次,用于预计算指标。通过 self.I(...) 注册指标(如 SMA、talib 函数),通过 self.data 访问行情。

  2. next(self)

    每个 bar 调用一次,在这里写买卖判断与下单逻辑(self.buy() / self.sell())。

  3. 指标访问

    在 next 中用 self.ma1[-1] 取最新指标值,用 crossover() 判断交叉。

  4. 仓位与权益

    通过 self.position 查看持仓、self.equity 查看权益,self.position.close() 平仓。

Backtest Engine

Backtest 引擎关键参数

初始化 Backtest 时可配置现金、佣金与订单撮合规则。

参数作用示例
cash初始资金cash=10_000
commission单边佣金费率commission=.002
exclusive_orders是否允许同时存在多个未成交订单exclusive_orders=True
trade_on_close是否以收盘价撮合(默认下一根 bar 开盘)trade_on_close=True
注意:默认以「下一根 bar」成交(避免前瞻偏差),trade_on_close=True 可改为收盘价撮合,需明确其假设差异。
Key API

关键 API 清单

策略内常用属性与方法速查。

API含义
self.data.Close当前标的收盘价序列
self.buy() / self.sell()买入 / 卖出
self.position当前持仓(is_long / is_short
self.position.close()平掉当前仓位
self.equity当前权益
self.I(func, data, *args)注册并计算指标
Scenarios

架构适用场景与选型

这套「Backtest + Strategy」架构最适合的场景。

单标的策略验证

对单一标的(股票/期货/加密)做均线、RSI 等信号回测。

参数调优

用内置优化器对策略参数做网格扫描与热力图分析。

教学与原型

API 简洁,适合快速原型与量化入门教学。

边界:Backtesting.py 不支持多资产组合与分数股交易,更适合单资产/CTA 类策略验证;详见功能页。
FAQ

架构常见问题

init 和 next 有什么区别?

init 在回测开始前调用一次,用于预计算指标;next 每个 bar 调用一次,用于判断信号并下单。

Backtesting.py 是事件驱动还是向量化?

它以逐 bar 迭代的方式运行(next 每 bar 执行),属于轻量级、易读的回测引擎,并非纯向量化框架。

self.I() 有什么用?

用于在 init 中注册并预计算指标,便于在 next 中用索引访问历史指标值。

Backtest 和 Strategy 能分离复用吗?

可以。策略类与数据解耦,同一策略类可对不同数据或参数复用。

下一步

理解架构后,看首次运行示例把 Backtest + Strategy 串起来,或直接看策略开发与优化。