交互式图表
价格走势 + 买卖标记 + 权益曲线,可鼠标缩放、悬停查看。
以下为官方 README 的 SmaCross 双均线交叉示例(示意,2026-09 核验)。
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA, GOOG
class SmaCross(Strategy):
def init(self):
price = self.data.Close
self.ma1 = self.I(SMA, price, 10)
self.ma2 = self.I(SMA, price, 20)
def next(self):
if crossover(self.ma1, self.ma2):
self.buy()
elif crossover(self.ma2, self.ma1):
self.sell()
bt = Backtest(GOOG, SmaCross, cash=10_000, commission=.002, exclusive_orders=True)
stats = bt.run()
print(stats)
bt.plot()把上面的代码拆成四步理解。
从 backtesting 导入 Backtest、Strategy,从 backtesting.lib 导入 crossover,从 backtesting.test 导入示例指标 SMA 与数据 GOOG。
继承 Strategy,在 init 计算 10/20 日 SMA,在 next 用 crossover 判断金叉买、死叉卖。
用 Backtest(GOOG, SmaCross, cash, commission) 创建引擎,调用 run() 返回统计结果。
stats 是 Series,含收益/回撤/胜率等;plot() 打开交互式图表。
run() 返回的 stats 是 pandas Series,常见字段如下。
| 字段 | 含义 |
|---|---|
Equity Final [$] | 期末权益 |
Equity Peak [$] | 峰值权益 |
Return [%] | 总收益率 |
Max. Drawdown [%] | 最大回撤 |
Sharpe Ratio | 夏普比率 |
# Trades / Win Rate [%] | 交易次数 / 胜率 |
plot() 基于 bokeh 输出交互式图表,可缩放查看价格、买卖点与权益曲线。
价格走势 + 买卖标记 + 权益曲线,可鼠标缩放、悬停查看。
通过 bokeh 输出到独立 HTML 文件,便于分享与归档。
stats 是 Series,可转 DataFrame 后导出 CSV 或接入 pandas 进一步分析。
跑通示例只是第一步,正式回测前需规避以下常见陷阱。
| 陷阱 | 说明 | 规避 |
|---|---|---|
| 前瞻偏差 | 用未来数据做当前决策 | 用 trade_on_close 前确认成交时点假设;默认下一 bar 成交 |
| 过拟合 | 参数过度优化贴合历史 | 用样本外数据验证,控制参数搜索范围 |
| 忽略佣金/滑点 | 低估交易成本 | 设置合理的 commission,必要时加入滑点假设 |
| 单一标的结论外推 | 把单标的结论当普遍规律 | 多标的、多区间交叉验证 |
GOOG 是 backtesting.test 提供的内置示例 OHLCV 数据,便于无需联网/自备数据即可跑通示例。
确认 bokeh >= 3.0.0 已安装;plot() 会输出交互式 HTML,可在浏览器打开。
它是历史回测的统计结果,受数据、佣金与成交假设影响,不构成收益保证。
可以。把 GOOG 换成你自己的 OHLCV DataFrame(Open/High/Low/Close/Volume 列),详见数据页。