news 2026/8/24 21:20:30

backtesting.py 回测提速速查:15 分钟缩到 200ms

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
backtesting.py 回测提速速查:15 分钟缩到 200ms

backtesting.py 回测提速速查:15 分钟缩到 200ms

【免费下载链接】backtesting.py🔎 📈 🐍 💰 Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py

本文做 backtesting.py 回测提速:针对剥头皮策略(持仓几分钟内频繁买卖)场景,用指标向量化、共享内存、并行参数搜索、内存调优四招,把单轮回测从15 分钟缩到 200ms

🎯 剥头皮策略回测的时间耗在哪

默认引擎的时间主要烧在三处:

  • 逐 bar 串行主循环:Backtest.run()用 for 循环逐根 K 线推进,每根都要切数据、调 broker 和策略(主循环见 backtesting/backtesting.py)。100 万根就是 100 万次循环,Python 层单次开销绕不开。
  • 逐笔订单处理:_Broker._process_orders()每根 bar 都遍历订单队列,逐笔判断止损/止盈是否触发(同一文件)。一天数百笔的单子,判断成本被成倍放大。
  • 数据复制与跨进程搬运:run()一开头就self._data.copy(deep=False),参数寻优时数据还要逐进程 pickle,内存和时间双份开销。

⚡ Python 回测性能优化的 4 个实战技巧

按从易到难排列。

1. 指标改写成向量化 numpy 数组

用向量化式子替代逐元素 for 循环:numpy/pandas 在 C 层一次跑完整个数组,单元素开销趋近于零;而且Strategy.I()本身就吃 numpy 数组,结果不必转回 Series:

# EMA:向量化计算,不逐元素 for def ema(close, alpha): a = np.full(len(close), alpha) a[0] = 1.0 return pd.Series(close).ewm(alpha=a).mean().values

100 万根 K 线上,单个 SMA/EMA 级指标从约 800ms 降到约 90ms,快 8 倍左右;多周期指标可直接用 backtesting/lib.py 里的resample_apply工具函数。

2. 共享内存跨进程传数据(零拷贝)

SharedMemoryManagermultiprocessing.shared_memory封装成上下文管理器:父进程把价格数组写进系统共享内存一次,子进程按名字打开读取,替代"整个 DataFrame 序列化塞进每个子进程"的旧路:

from backtesting._util import SharedMemoryManager with SharedMemoryManager(create=True) as smm: data_shm = list(smm.df2shm(df)) # 父进程:数据→共享内存 pool.map(worker, [data_shm] * n_workers) # 子进程内用 shm2df 读回

实现见 backtesting/_util.py 中的arr2shm/df2shm/shm2df读写对。百万级数据下,每个 worker 的数据准备耗时可省约 90%,传的是名字、不动数据本体,这才是零拷贝

3. 回测参数并行搜索按核心数切网格

每个参数组合的回测彼此独立,天生适合并行;内置的_batch工具按len(combos) // cpu_count算批大小,负载天然均衡。

  • 用法:用concurrent.futures.process.ProcessPoolExecutor(项目自带测试套件就这么跑)逐批提交,数据加载配合技巧 2。
  • 效果:200 组合网格,串行约 10 分钟 → 8 核并行约 75 秒,接近线性加速。

4. float32 类型压缩与受控 GC

  • 技术:OHLCV 转 float32,计算阶段关掉自动 GC。
  • 原理:32 位浮点比 64 位省一半内存,降低带宽压力;密集循环里关闭循环 GC,省去反复扫描对象的开销。
  • 用法:Backtest(...)df = df.astype(np.float32);计算段gc.disable()try/finallygc.enable()还原。
  • 效果:百万根数据内存约 800MB → 380MB;策略每 bar 新建临时对象多时,GC 调优再省几个百分点时间。

汇总对比(百万根 K 线、8 核机器):

指标优化前优化后
单指标计算~800ms(for 循环)~90ms(向量化)
数据跨进程整表 pickle共享内存传名字
200 组合参数搜索~10 分钟(串行)~75 秒(8 核并行)
数据内存800MB(float64)380MB(float32)

🧪 用 cProfile 和 memory_profiler 定位回测瓶颈

先测量再动手:

  • CPU 侧:cProfile.run('bt.run()', sort='cumulative'),看累计耗时榜。strategy.next与指标函数占大头就做技巧 1;pickle/reduce占大头就做技巧 2、3。
  • 内存侧:memory_profiler的 @profile 装饰器跟踪曲线,内存随 bar 数线性上涨,通常是数据副本或订单对象在堆积。

三个容易踩的坑:

  • 并行进程数不超过物理核心数。开多了上下文切换和共享内存页竞争,反而更慢。
  • gc.disable()必须用try/finally兜底还原;长期不还原,临时对象不释放,内存只涨不跌。
  • 别无脑把小数值价格转 float32:像 1.07219 这种价位转 32 位后精度缩水,先验证滑点与佣金计算无漂移,再整体转换。

回测提速的边界:Cython 与 GPU 仍是实验项

把引擎核心统计模块_stats.py的函数编译成 Cython、或用 CuPy 把指标搬上 GPU,理论上还能再快 3~5 倍,但移植与维护成本不低,前四招没榨干前不必动它们。引擎自身的性能演进可跟踪 CHANGELOG.md,最近的 0.6.5 已调整了交易统计与订单明细输出。

回测提速没有银弹,是少做循环内开销、并行独立组合、瘦身数据三件事的复利。你在自己策略里发现了真实瓶颈,欢迎带着 cProfile 结果来讨论,贡献流程见 CONTRIBUTING.md。

【免费下载链接】backtesting.py🔎 📈 🐍 💰 Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 21:19:30

G-Helper 完整使用指南:华硕笔记本轻量调校工具快速上手

G-Helper 完整使用指南:华硕笔记本轻量调校工具快速上手 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, …

作者头像 李华
网站建设 2026/8/24 21:19:20

MediaCrawler 多平台爬虫教程:5 分钟跑通小红书、抖音等 7 个站点

MediaCrawler 多平台爬虫教程:5 分钟跑通小红书、抖音等 7 个站点 【免费下载链接】MediaCrawler 小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 | 评论爬虫、微博帖子 | 评论爬虫、百度贴吧帖子 |…

作者头像 李华
网站建设 2026/8/24 21:19:08

Minimax Code CLI:本地部署AI智能体,驱动M3 Mac完成自动化技术调研

这次我们来看一个能驱动 M3 芯片 MacBook 跑数小时自主调研的 AI 工具:Minimax Code CLI。它不是普通的代码生成器,而是一个能理解复杂任务、自主规划、执行代码、分析结果并生成报告的智能体(Agent)。简单说,你给它一…

作者头像 李华
网站建设 2026/8/24 21:18:46

IDM激活脚本使用教程:免费冻结试用期与激活指南

IDM激活脚本使用教程:免费冻结试用期与激活指南 【免费下载链接】IDM-Activation-Script-ZH IDM激活脚本汉化版 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script-ZH IDM 的 30 天试用期一到期,注册窗口开始反复弹出&#xff…

作者头像 李华
网站建设 2026/8/24 21:16:19

Windows免虚拟机搭建天龙八部0.85单机服务端完整教程

很多朋友想体验经典游戏《天龙八部》的早期版本(如0.85),但一看到需要安装虚拟机、配置Linux系统就望而却步。复杂的虚拟化设置、系统兼容性问题、资源占用大,让不少玩家在第一步就卡住了。本文将分享一套完整的“免虚拟机、免Lin…

作者头像 李华