Backtesting.py / Strategy

Backtesting.py 策略开发:Strategy 类、指标与参数优化教程

策略开发是回测的核心:继承 Strategy 类、在 init 接入指标、在 next 写买卖逻辑,再用内置优化器做参数网格搜索与热力图分析。

Strategy:策略基类指标:BYO / talib优化:optimize + 热力图
Strategy继承基类
init()接入指标
next()买卖逻辑
optimize()参数优化
Backtesting.py 策略开发与回测流程示意(基于官方 README)。
Write Strategy

编写策略类

策略类继承 Strategy,实现 init 与 next 两个方法。

from backtesting import Strategy
from backtesting.lib import crossover

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()
操作API
买入 / 卖出self.buy() / self.sell()
查看持仓self.positionis_long / is_short
平仓self.position.close()
访问行情self.data.Close / self.data.Open
Indicators

指标接入方式

Backtesting.py 指标库无关(BYO),可接入不同指标来源。

方式说明示例
内置 libbacktesting.lib 提供 SMA 等基础工具self.I(SMA, self.data.Close, 10)
talib接入 TA-Lib 技术指标self.I(talib.RSI, self.data.Close, 14)
pandas 自定义用 pandas/numpy 计算自定义指标self.I(lambda c: c.rolling(20).mean(), self.data.Close)
说明:talib 需另行安装;self.I() 会缓存指标计算结果,便于在 next 中按索引取值。
Optimize

参数优化与热力图

用内置优化器(基于 SAMBO)对策略参数做网格搜索,并用热力图呈现。

# 参数化策略
class SmaCross(Strategy):
    n1 = 10
    n2 = 20
    def init(self):
        self.ma1 = self.I(SMA, self.data.Close, self.n1)
        self.ma2 = self.I(SMA, self.data.Close, self.n2)
    def next(self):
        if crossover(self.ma1, self.ma2):
            self.buy()
        elif crossover(self.ma2, self.ma1):
            self.sell()

stats, heatmap = bt.optimize(
    n1=range(5, 30, 5),
    n2=range(10, 60, 10),
    maximize='Equity Final [$]',
    constraint=lambda p: p.n1 < p.n2)
print(heatmap)
注意:参数优化易过拟合,应结合样本外验证;优化目标是历史回测指标,不构成收益保证。
Patterns

常用策略模式

适合用 Backtesting.py 快速验证的常见策略类型。

均线交叉

快慢均线金叉买、死叉卖(如 SmaCross),适合趋势跟随。

RSI 超买超卖

RSI 跌破超卖买、突破超买卖,适合震荡市。

通道突破

突破 N 日高低点入场,适合动量/突破策略。

Best Practice

策略开发实践建议

开发与验证策略时的检查清单。

环节建议
数据质量确认 OHLCV 数据无缺漏、复权方式一致
成本假设设置合理的 commission,必要时加滑点
成交时点确认 trade_on_close 或默认下一 bar 成交的假设
样本外验证参数优化后用未参与优化的区间验证
风险指标同时看收益、最大回撤、夏普、胜率,而非只看收益
合规:回测结果仅代表历史表现,不构成投资建议。
FAQ

策略开发常见问题

怎么接入 talib 指标?

先安装 talib,再在 init 中用 self.I(talib.RSI, self.data.Close, 14) 注册即可。

optimize 会不会过拟合?

会。参数网格越大越容易过拟合,应结合样本外验证,控制参数范围。

能同时回测多个标的吗?

Backtesting.py 以单标的回测为主,不支持多资产组合;多标的需分别回测或换用其他框架。

buy() 是按什么价格成交?

默认按下一根 bar 的开盘价成交(避免前瞻偏差);设置 trade_on_close=True 可改为收盘价。

下一步

策略写好后,准备自己的 OHLCV 数据接入回测,或了解完整功能特性。