
backtesting.py 版本演进全解析从 0.1.0 到 0.6.5 的核心功能、优化引擎与实战升级指南【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.pybacktesting.py 是一个用 Python 编写交易策略回测框架的开源项目其 CHANGELOG.md 完整记录了自 2019 年 1 月 15 日 0.1.0 初始版本发布以来直到 2025 年 7 月 30 日 0.6.5 版本的全部重大变更。本文以该变更日志为骨架结合仓库内 backtesting/backtesting.py、backtesting/lib.py 与 backtesting/test/_test.py 等源码系统梳理项目六年来的演进脉络帮助你理解每个版本背后的设计动机、新 API 的用法以及升级到最新版本时应关注的破坏性变更与新增能力。读完本文你将能够读懂回测引擎的参数模型佣金、点差、保证金、对冲与独占订单、掌握网格搜索与模型化优化SAMBO的完整参数体系、了解统计指标Kelly、CAGR、Alpha/Beta 等的引入历史以及将旧版本策略代码平滑迁移到 0.6.x 的注意事项。一、版本演进总览六年六个大版本从 CHANGELOG.md 的时间线看项目的版本演进呈现清晰的三个阶段阶段版本区间时间主题奠基期0.1.0 – 0.1.82019-01 至 2020-03核心回测循环、绘图、基础统计Profit Factor架构重构期0.2.0 – 0.3.32020-07 至 2021-12Order/Trade/Position API、多周期数据、优化加速能力爆发期0.4.0 – 0.6.52025-01 至 2025-07Kelly 准则、SAMBO 优化、分数交易、多数据集回测、佣金/点差精细化值得注意的时间线细节0.3.32021-12-13之后项目进入了较长的发展沉淀期随后 0.4.0 与 0.5.0 于 2025-01-21 同一天发布0.6.x 系列在 2025 年 2 月至 7 月密集迭代了五个小版本说明当前正处于功能快速演进阶段。CHANGELOG 中### 0.x.x占位条目表明维护者将 1.0 正式版之前的后续变更都记录在 0.x.x 系列下。二、回测引擎核心参数模型的演进2.1 佣金Commission与点差Spread的精细化佣金模型经历了两次重要升级0.2.x 之前佣金以订单价值的百分比单边计算。0.6.02025-02-04新增Backtest(spread)参数并将commission的语义改为每笔交易双向各收取一次apply twice per trade同时在交易统计中新增Commissions [$]键。这是使用旧版本编写的回测在升级后结果会发生变化的关键原因——同样的佣金率下0.6.0 起实际扣除的佣金约为旧版的 2 倍。0.6.52025-07-30修复了相对金额佣金relative amount的计算错误并将Commission列纳入stats._tradesDataFrame#1277同时让Trade.pl与Trade.pl_pct正确计入佣金#1279。从 backtesting/backtesting.py 的Backtest.__init__源码可以看到当前佣金参数接受的三种形态commission: Union[float, Tuple[float, float]] .0, # 合法取值 # 1. float —— 订单价值的百分比 # 2. (fixed, relative) 二元组 —— 固定金额 相对比例的组合 # 3. callable —— 接收 (order_size, price)返回佣金美元金额第三种 callable 形态早在 0.3.22021-08-03就已支持其设计目的是允许市场做市商的返佣rebate场景——即佣金可以为负值。另外spread的取值是占入场订单价格的百分比见 backtesting.py 的类型检查与错误提示模拟买卖价差成本。2.2 订单执行语义trade_on_close、hedging 与 exclusive_orders0.2.02020-07-15引入全新的 Order/Trade/Position API#47并新增exclusive_orders新订单自动平掉此前持仓与hedging允许同时持有多空双向持仓FIFO 平仓变为可选。0.6.22025-02-19修复trade_on_closeTrue的遗留问题——该参数决定订单是在 K 线收盘价成交True还是下一根 K 线开盘价成交False。0.6.5下单量被强制取整为整数Ensure order size is integer to avoid weird rounding errors避免小数下单引发的舍入错误同时修复了stats._trades中 SL 值偶发被清空的问题。从源码看Backtest.__init__的完整签名backtesting.py为Backtest(data, strategy, *, cash10_000, spread.0, commission.0, margin1., trade_on_closeFalse, hedgingFalse, exclusive_ordersFalse, finalize_tradesFalse)其中margin表示保证金率默认 1.0 即全额交易finalize_trades在 0.6.0 引入#393为 True 时会在回测结束时将仍持仓的交易结算为最终交易记录。2.3 输入数据的校验与规范化__init__对数据执行多层校验backtesting.py这些行为大多在 0.1.x 0.2.x 期间逐步定型自动将数值型大时间戳索引转换为DatetimeIndex缺失Volume列时自动补 NaN校验必须包含Open/High/Low/Close/Volume五列缺失或含 NaN 直接抛ValueError非单调递增的索引会被自动排序非 datetime 索引会给出警告但允许使用简单周期索引建议仍使用pd.DateTimeIndex。0.2.0 还新增了数据访问的 pandas accessor.df完整 DataFrame与.s单列 Series使策略代码中可以写self.data.s这类简洁访问。三、参数优化引擎的进化之路参数优化是回测框架的杀手级功能其演进脉络在 CHANGELOG 中清晰可循3.1 从穷举网格到随机网格0.3.0 → 0.3.2 → 0.6.10.3.02020-11-24引入基于 scikit-optimize 的模型化优化以及可选的随机化网格搜索加速#154。0.3.2进一步优化大规模数据集上的优化性能#295。0.6.12025-02-04优化改用joblib.Parallel官方注释称这大幅提升 Windows 上的性能对其他平台影响不大。0.6.2网格优化升级为mp.Poolmp.shm.SharedMemory#1222通过共享内存传递数据减少多进程间的数据复制。0.6.42025-03-30修复 Windows 上优化偶发挂起的问题主因是缺少if __name__ __main__保护——如果你在 Windows 上遇到优化卡死首先检查脚本是否缺少这一守卫同时修复带时区感知 datetime 索引数据上的网格优化错误。3.2 SAMBO 模型化优化取代 SKOPT0.5.00.5.02025-01-21用 SAMBO 取代methodskopt作为默认模型化优化后端。从源码backtesting.py可见向后兼容处理仍传入methodskopt会得到DeprecationWarning并自动切换到sambo。Backtest.optimize()的完整签名backtesting.py为backtest.optimize(*, maximizeSQN, # 优化目标结果 Series 的键名或接收 Series 返回数值的函数 methodgrid, # grid 穷举/随机网格sambo 模型化优化 max_triesNone, # 最大运行次数grid 下可为 (0,1] 比例或整数sambo 默认 200 constraintNone, # 参数组合合法性判定函数接收 dict 返回 bool return_heatmapFalse, # 同时返回所有可测组合的热力图 SeriesMultiIndex return_optimizationFalse, # 仅 sambo 可用返回 scipy OptimizeResult 供 SAMBO 绘图 random_stateNone, # 随机种子保证结果可复现 **kwargs) # 策略参数名 → 候选值列表官方文档示例backtesting.pybest_stats backtest.optimize(sma1[5, 10, 15], sma2[10, 20, 40], constraintlambda p: p.sma1 p.sma2)几点关键语义值得注意maximize为字符串时必须匹配bt.run()结果 Series 的键内部通过dummy_stats()校验不匹配直接抛ValueErrorreturn_heatmapTrue返回的 Series 以所有合法参数组合的 MultiIndex 为索引可配合backtesting.lib.plot_heatmaps()绘制二维热力图网格空间超过 300 个组合时会给出提示backtesting.py。3.3 0.6.3 的进度可视化0.6.32025-03-11将Backtest.run()用tqdm()包裹长时间回测/优化可实时看到进度条——这在参数空间较大时非常实用。四、统计指标体系的完善历程统计指标从简单到全面几乎每个版本都在扩充版本新增统计能力0.1.82020-03-23Profit Factor盈利因子#850.2.0Sharpe/Sortino 改用几何平均收益率计算0.3.0年化 Return/Volatility/Sharpe/Sortino/Calmar#156修正 Expectancy 公式#1810.3.2新增lib.compute_stats()独立统计计算函数#2810.4.0Kelly Criterion凯利准则#6400.5.0CAGR [%]复合年化增长率0.6.0修复非零无风险利率下 Sharpe 比率的计算错误#904修复周/月数据的年化统计Buy Hold 时长与交易时长对齐0.6.3市场 Alpha 与 Beta 统计#1221统计计算集中在 backtesting/_stats.py其中 Sharpe/Sortino 的计算在 0.6.0 之前存在非零无风险利率下的 bug#904使用旧版本做无风险利率研究时需要特别留意。0.2.4 还更新了 Buy Hold 统计为纯多头计算#152使基准统计与买入并持有的实际含义一致。五、绘图系统从基础图表到交互式探索绘图能力与 Bokeh 版本同步演进CHANGELOG 中相关条目密度很高0.1.x图表占满浏览器宽度、散点图指标scatter indicators、Bokeh 2.0 日期格式化修复。0.2.0新增bt.plot(resample)参数与大数据自动降采样新增reverse_indicators。0.2.3跨子图联动悬停十字光标crosshair点击图例字形可切换指标显隐。0.3.0新增plot_return参数类似plot_equity0.3.2 起Backtest.plot返回 Bokeh figure 对象可继续二次加工。0.3.3适配 Bokeh 3.0 弃用 API。0.6.0修复 VSCode Jupyter 中图表不显示的问题修复bt.plot(resampleTrue)与分类指标categorical indicators的兼容。0.6.2修复跨子图十字光标未联动的问题。0.6.3PL 图区绘制交易持仓时长线、改用圆形标记仅在存在交易时绘制交易标记指标子图 y 轴刻度数设为 3同名指标合并图例项OHLC 本身变为可切换的图例项新增xwheel_pan滚轮平移工具受 Bokeh issue #14363 限制暂为条件启用新增可覆盖的私有全局backtesting._plotting._INDICATOR_HEIGHT用于降低指标子图高度。0.6.4修复 FractionalBacktest 绘图中原始价格刻度丢失的问题#1247。0.6.5多空三角形标记回归 PL 图区plotFalse, overlayTrue的指标现在也会以**弱化muted**方式绘制而非完全不画。bt.plot()的完整参数backtesting.py还包括plot_trades0.4.0 新增与show_legend0.3.1 修复其对 Bokeh 新版失效的问题等。六、lib 工具库从辅助函数到策略家族backtesting/lib.py 是随版本不断壮大的工具箱当前包含6.1 计算与工具函数barssince(condition, defaultnp.inf)、crossover(series1, series2)信号判断工具resample_apply(rule, func, series)多周期聚合计算指标0.1.3 起支持agg参数compute_stats(trades, data, *, risk_free_rate0, annual_trading_daysNone)lib.py独立的统计计算函数0.3.2 引入#281便于在非标准流程中复用统计逻辑random_ohlc_data(example_data, *, n... , ...)lib.py0.2.4 引入的 OHLC 随机数据生成器基于给定样例数据生成随机 K 线适合快速验证策略plot_heatmaps(heatmap, ...)lib.py配合optimize(return_heatmapTrue)绘制参数热力图。6.2 开箱即用的策略基类SignalStrategylib.py向量化信号回测辅助类。在init()中调用self.set_signal(entry_size, exit_portionNone, *, plotTrue)传入入场/离场信号向量正值为做多、负值为做空遵循Order.size语义next()中自动执行分批平仓与建仓。TrailingStrategylib.py自动追踪止损策略。0.6.3 起新增set_trailing_pct(pct)lib.py支持按百分比设置追踪止损默认 5%0 pct 1内部会换算为 ATR 倍数mean(Close * pct / atr)原有set_trailing_sl(n_atr6)按 ATR 倍数追踪set_atr_periods(periods100)设置 ATR 回看窗口。FractionalBacktestlib.py0.6.2 引入的分数交易回测类解决 BTC 等高价资产按整数股交易的问题。其实现方式非常巧妙将 OHLC 价格乘以fractional_unit默认 1 聪即1/100e6μBTC 交易传fractional_unit1/1e6成交量除以该系数再以整数股回测最后在run()输出时还原价格与头寸lib.py。0.6.3 将旧参数satoshi重命名为fractional_unit旧参数仍兼容但会触发DeprecationWarning。MultiBacktestlib.py0.6.3 引入的多数据集并行回测包装器。用法from backtesting.test import EURUSD, BTCUSD btm MultiBacktest([EURUSD, BTCUSD], SmaCross) stats_per_ticker btm.run(fast10, slow20) # 每列一个标的 heatmap_per_ticker btm.optimize(...) # 每列一个标的的热力图其内部通过进程池 SharedMemoryManager将各数据集共享给工作进程lib.py并行跑同一策略返回以货币/标的为列的 DataFrame便于横向比较。七、关键执行语义修复SL/TP 与订单行为CHANGELOG 中大量条目属于细思极恐的执行语义修复理解它们对正确解读回测结果至关重要SL 先于 TP 执行0.6.3同一根 K 线同时触发止损与止盈时止损总是先执行与 TradingView 一致。止损/止盈同 bar 命中0.6.3修复止损市价单与止盈同根 K 线命中时的执行顺序。价格比较改为 lte/gte0.6.0触及价touch即触发对齐 TradingView 的触发语义。止损不得高于市价0.5.0修复止损以高于市场价成交的异常。买/卖 size00.5.0修复零手数订单导致的异常。Position.pl符号一致性0.6.3修复Position.pl与pl_pct符号偶发不一致的问题。开仓当日命中 SL/TP0.2.1支持开仓当日即触发止损/止盈。回测结束自动平仓0.3.0回测终止时自动关闭未平持仓。从测试覆盖看backtesting/test/_test.py这些语义均有对应断言保障例如对数据缺失列/NaN 的ValueError校验、Strategy.I注册指标断言、非法的策略参数bt.run(foo3)抛AttributeError以及运行速度测试assertLess(end - start, .3)要求测试样例 0.3 秒内跑完等。八、版本升级迁移指南结合各版本变更升级到 0.6.x 时需重点关注以下行为变化佣金翻倍0.6.0 起commission按每笔交易双向收取旧回测结果中的净收益会系统性下降需复核佣金参数。methodskopt弃用改用methodsambo代码无需改动自动映射但会打印弃用警告。satoshi弃用FractionalBacktest改用fractional_unit。多进程保护在 Windows 上做网格/模型优化时务必在脚本入口添加if __name__ __main__守卫0.6.4 修复的挂起问题与此强相关。指标弱化显示plotFalse, overlayTrue的指标在 0.6.5 起会以弱化形式出现在图上若旧脚本依赖其完全不可见需相应调整绘图配置。SL/TP 执行顺序同 bar 双触发的场景下止损优先的语义与早期版本可能不同需重新核验依赖该行为的策略。九、小结与展望CHANGELOG 中### 0.x.x的空占位表明 1.0 之前仍有迭代空间。纵观六年演进回测引擎从单线程、单资产、整数股、单边佣金逐步进化到多进程共享内存优化、SAMBO 模型化寻参、多数据集并行、分数交易与精细化成本模型统计体系覆盖了 Sharpe/Sortino/Calmar、Kelly、CAGR、Alpha/Beta 等主流绩效指标绘图系统则与 Bokeh 深度耦合走向高度可交互。对于使用者而言理解这些变更历史不仅是读更新日志更是理解回测结果可信度边界的关键——尤其是佣金语义、SL/TP 执行顺序这类直接影响收益数字的底层细节。建议在实际使用中结合 README.md 的快速上手示例与 doc/examples 下的示例脚本如 Parameter Heatmap Optimization.py将本文提到的 API 逐一落地验证。【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考