量化武器库|轻量级之选 - backtesting.py 的简洁与交互之美

B站影视 内地电影 2025-10-10 20:45 1

摘要:我们已经学习了功能强大的 Backtrader 和性能卓越的 vectorbt。但 Backtrader 配置稍显复杂,而 vectorbt 的向量化思维又有些“反直觉”。有没有一款回测框架,既能像 Backtrader 一样使用事件驱动的直观逻辑,又能像写普

《量化武器库》系列专门聚焦那些能极大提升我们量化研究和实盘效率的工具,打造一个覆盖数据、回测、分析到实战的全流程工具箱。

大家好,我是木泽!

我们已经学习了功能强大的 Backtrader 和性能卓越的 vectorbt。但 Backtrader 配置稍显复杂,而 vectorbt 的向量化思维又有些“反直觉”。有没有一款回测框架,既能像 Backtrader 一样使用事件驱动的直观逻辑,又能像写普通 Python 函数一样简洁,还能生成漂亮的可交互图表?

答案是肯定的!今天,我们就来学习回测框架中的一股“清流”——backtesting.py。它以极致的简洁、易用和出色的可视化为核心卖点,非常适合快速验证策略想法和教学演示。

(创作不易,感谢关注支持↑↑↑)

backtesting.py 的设计理念是将复杂性降到最低。你只需要关心两个核心组件:

Strategy 类: 和 Backtrader 类似,你需要定义一个策略类,包含 `init` 和 `next` 方法。Backtest 对象: 这是一个总管对象,你把数据和策略类“喂”给它,它就能帮你完成运行、优化和绘图的所有工作。

安装:

pip install backtesting

你将看到,用 backtesting.py 实现一个完整的双均线回测是多么的简洁。

from backtesting import Backtest, Strategyfrom backtesting.lib import crossoverfrom backtesting.test import SMA, GOOG# 1. 定义策略class SmaCross(Strategy): n1 = 10 n2 = 20 def init(self): # self.I 是一个便捷的函数,用于将任何函数包装成指标 self.sma1 = self.I(SMA, self.data.Close, self.n1) self.sma2 = self.I(SMA, self.data.Close, self.n2) def next(self): if crossover(self.sma1, self.sma2): self.buy elif crossover(self.sma2, self.sma1): self.sell# 2. 准备数据和运行回测# 注意:它需要一个特定格式的DataFrame,列名必须是 'Open', 'High', 'Low', 'Close'bt = Backtest(GOOG, SmaCross, cash=10000, commission=.002)stats = bt.run# 3. 查看结果和绘图print(stats)bt.plot

代码之美:

整个流程一气呵成,非常符合 Python 的直觉。`self.I` 函数和 `crossover` 辅助函数的设计,让指标的定义和信号的生成都变得极其简单。最棒的是,`bt.plot` 会生成一个漂亮的、可在浏览器中交互的 HTML 图表!

backtesting.py 的参数优化功能也同样简单直观。

stats = bt.optimize( n1=range(5, 30, 5), n2=range(10, 70, 5), constraint=lambda p: p.n1

简洁的代价:

backtesting.py 为了追求极致的简洁,在功能和灵活性上做了一些妥协。它不像 Backtrader 那样支持那么多种订单类型和复杂的 Broker 逻辑,也不支持多品种组合回测。它更适合用于单品种、中低频策略的快速原型开发和验证。

今天,我们学习了一款小而美的回测框架——backtesting.py。它证明了回测不一定非要复杂和繁琐。如果你是一个追求代码简洁、喜欢漂亮图表、并且主要做单品种策略的研究者,那么它绝对是你武器库中一件称手的“轻快佩剑”。

体验一下它的交互图表!
运行 `bt.plot` 后,在生成的网页图表中,尝试用鼠标悬停在交易点上,看看会显示什么信息?

来源:木泽的量化笔记

相关推荐