单标的策略验证
对单一标的(股票/期货/加密)做均线、RSI 等信号回测。
Backtesting.py / Architecture
Backtesting.py 的架构围绕两个核心类展开:Backtest 负责引擎(现金、佣金、撮合、统计),Strategy 负责策略逻辑(init 计算指标、next 逐 bar 交易)。理解这两个类,就能读懂大多数回测脚本。
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 |
策略类有两个关键方法,理解它们的调用时机是正确回测的前提。
回测开始前调用一次,用于预计算指标。通过 self.I(...) 注册指标(如 SMA、talib 函数),通过 self.data 访问行情。
每个 bar 调用一次,在这里写买卖判断与下单逻辑(self.buy() / self.sell())。
在 next 中用 self.ma1[-1] 取最新指标值,用 crossover() 判断交叉。
通过 self.position 查看持仓、self.equity 查看权益,self.position.close() 平仓。
初始化 Backtest 时可配置现金、佣金与订单撮合规则。
| 参数 | 作用 | 示例 |
|---|---|---|
cash | 初始资金 | cash=10_000 |
commission | 单边佣金费率 | commission=.002 |
exclusive_orders | 是否允许同时存在多个未成交订单 | exclusive_orders=True |
trade_on_close | 是否以收盘价撮合(默认下一根 bar 开盘) | trade_on_close=True |
trade_on_close=True 可改为收盘价撮合,需明确其假设差异。策略内常用属性与方法速查。
| API | 含义 |
|---|---|
self.data.Close | 当前标的收盘价序列 |
self.buy() / self.sell() | 买入 / 卖出 |
self.position | 当前持仓(is_long / is_short) |
self.position.close() | 平掉当前仓位 |
self.equity | 当前权益 |
self.I(func, data, *args) | 注册并计算指标 |
这套「Backtest + Strategy」架构最适合的场景。
对单一标的(股票/期货/加密)做均线、RSI 等信号回测。
用内置优化器对策略参数做网格扫描与热力图分析。
API 简洁,适合快速原型与量化入门教学。
init 在回测开始前调用一次,用于预计算指标;next 每个 bar 调用一次,用于判断信号并下单。
它以逐 bar 迭代的方式运行(next 每 bar 执行),属于轻量级、易读的回测引擎,并非纯向量化框架。
用于在 init 中注册并预计算指标,便于在 next 中用索引访问历史指标值。
可以。策略类与数据解耦,同一策略类可对不同数据或参数复用。