均线交叉
快慢均线金叉买、死叉卖(如 SmaCross),适合趋势跟随。
策略类继承 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.position(is_long / is_short) |
| 平仓 | self.position.close() |
| 访问行情 | self.data.Close / self.data.Open 等 |
Backtesting.py 指标库无关(BYO),可接入不同指标来源。
| 方式 | 说明 | 示例 |
|---|---|---|
| 内置 lib | backtesting.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) |
self.I() 会缓存指标计算结果,便于在 next 中按索引取值。用内置优化器(基于 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)适合用 Backtesting.py 快速验证的常见策略类型。
快慢均线金叉买、死叉卖(如 SmaCross),适合趋势跟随。
RSI 跌破超卖买、突破超买卖,适合震荡市。
突破 N 日高低点入场,适合动量/突破策略。
开发与验证策略时的检查清单。
| 环节 | 建议 |
|---|---|
| 数据质量 | 确认 OHLCV 数据无缺漏、复权方式一致 |
| 成本假设 | 设置合理的 commission,必要时加滑点 |
| 成交时点 | 确认 trade_on_close 或默认下一 bar 成交的假设 |
| 样本外验证 | 参数优化后用未参与优化的区间验证 |
| 风险指标 | 同时看收益、最大回撤、夏普、胜率,而非只看收益 |
先安装 talib,再在 init 中用 self.I(talib.RSI, self.data.Close, 14) 注册即可。
会。参数网格越大越容易过拟合,应结合样本外验证,控制参数范围。
Backtesting.py 以单标的回测为主,不支持多资产组合;多标的需分别回测或换用其他框架。
默认按下一根 bar 的开盘价成交(避免前瞻偏差);设置 trade_on_close=True 可改为收盘价。