Backtesting.py / First Run

Backtesting.py 首次运行:SmaCross 双均线示例教程

安装完成后,用官方 README 的 SmaCross 双均线交叉示例跑通第一个回测。它用内置的 GOOG 数据,无需额外准备数据即可看到结果。

示例:SmaCross数据:内置 GOOG输出:stats + 交互图
安装pip install backtesting
定义 SmaCross继承 Strategy
bt.run()执行回测
bt.plot()交互图
基于 Backtesting.py 官方 README 快速开始的首次运行流程示意。
Quickstart

完整快速开始代码

以下为官方 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()
Steps

分步说明

把上面的代码拆成四步理解。

  1. 导入模块

    backtesting 导入 Backtest、Strategy,从 backtesting.lib 导入 crossover,从 backtesting.test 导入示例指标 SMA 与数据 GOOG。

  2. 定义策略

    继承 Strategy,在 init 计算 10/20 日 SMA,在 next 用 crossover 判断金叉买、死叉卖。

  3. 运行回测

    Backtest(GOOG, SmaCross, cash, commission) 创建引擎,调用 run() 返回统计结果。

  4. 查看结果

    stats 是 Series,含收益/回撤/胜率等;plot() 打开交互式图表。

Results

回测结果字段对照

run() 返回的 stats 是 pandas Series,常见字段如下。

字段含义
Equity Final [$]期末权益
Equity Peak [$]峰值权益
Return [%]总收益率
Max. Drawdown [%]最大回撤
Sharpe Ratio夏普比率
# Trades / Win Rate [%]交易次数 / 胜率
说明:字段名称以实际 run() 返回为准;以上为常见统计维度,用于评估而非收益保证。
Plot

绘图与结果保存

plot() 基于 bokeh 输出交互式图表,可缩放查看价格、买卖点与权益曲线。

交互式图表

价格走势 + 买卖标记 + 权益曲线,可鼠标缩放、悬停查看。

保存为 HTML

通过 bokeh 输出到独立 HTML 文件,便于分享与归档。

stats 二次分析

stats 是 Series,可转 DataFrame 后导出 CSV 或接入 pandas 进一步分析。

Pitfalls

回测陷阱与验证

跑通示例只是第一步,正式回测前需规避以下常见陷阱。

陷阱说明规避
前瞻偏差用未来数据做当前决策trade_on_close 前确认成交时点假设;默认下一 bar 成交
过拟合参数过度优化贴合历史用样本外数据验证,控制参数搜索范围
忽略佣金/滑点低估交易成本设置合理的 commission,必要时加入滑点假设
单一标的结论外推把单标的结论当普遍规律多标的、多区间交叉验证
合规:回测结果仅代表历史表现,不构成收益保证或投资建议。
FAQ

首次运行常见问题

为什么用内置数据 GOOG?

GOOG 是 backtesting.test 提供的内置示例 OHLCV 数据,便于无需联网/自备数据即可跑通示例。

plot() 打不开图表?

确认 bokeh >= 3.0.0 已安装;plot() 会输出交互式 HTML,可在浏览器打开。

stats 里的收益率可信吗?

它是历史回测的统计结果,受数据、佣金与成交假设影响,不构成收益保证。

能直接换自己的股票数据吗?

可以。把 GOOG 换成你自己的 OHLCV DataFrame(Open/High/Low/Close/Volume 列),详见数据页。

下一步

跑通 SmaCross 后,学习策略开发与参数优化,或准备自己的 OHLCV 数据接入回测。