ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

5 个提速点:backtesting.py 回测提速指南(多数不改源码)

5 个提速点:backtesting.py 回测提速指南(多数不改源码) 5 个提速点backtesting.py 回测提速指南多数不改源码【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py你给一个双均线策略设了 200×200 的参数网格点下 optimize进度条半天挪一格风扇先起飞了。问题几乎从不是数据太大——backtesting.py 的耗时大头是逐根 K 线的 Python 循环和指标重复计算。这篇给 5 个提速点多数不用碰引擎源码能把扫一遍参数从分钟级压到秒级。先弄懂它慢在哪三处吃时间的地方这节帮你把感觉慢变成知道慢在哪免得优化错地方。看 backtesting/backtesting.py 的主循环时间基本花在这三处逐根 K 线的循环体。Strategy.next()每根 K 线被调一次里面的下单、撮合、权益更新全是 Python 对象操作。数据越长这条线越贵是绝对大头。指标若逐根重算。如果你把滚动求和/窗口平均写在next()里每根都重扫一遍窗口复杂度变成 O(根数×窗口)而引擎本意是在init()里用self.I()一次性向量化算好。参数寻优串行。自己写for循环遍历参数组合既不并行还会给每个子进程重新 pickle 一份完整 DataFrame。时间花在哪流程示意如下粗体是主耗时段加载 DataFrame └─ _Data 一次性转连续 numpy 数组切片已缓存 └─ Strategy.init() 指标在此向量化算一次 └─ 每根 K 线调 next() ← Python 循环体主耗时 └─ 统计 / 绘图注意第一行引擎的_Data已经把列转成连续数组并缓存切片单根取价走的是快路径所以慢几乎不来自数据访问而来自next()里的 Python 逻辑——这决定了你的优化杠杆在哪。三档提速清单按投入成本排这节按要花多少功夫把提速点分成零成本、低成本、高投入三档从上往下做做到哪档够用就停。零成本档不改源码改调用方式把寻优交给optimize的内置并行。它默认起进程池、按 CPU 核数给参数组合分片并用共享内存把数据传给每个子进程见 backtesting/_util.py 的SharedMemoryManager/df2shm避免逐 worker 重复序列化整份数据。你只要把参数写成列表传进去别自己 for 循环。收缩网格。max_tries传 0~1 的小数只跑网格的一小部分constraint传个谓词函数在开跑前就把非法组合剪掉。两个参数能把 200×200 的网格砍掉一个数量级。下面这段把并行 剪枝 按比例采样一次性用上是零成本档的核心动作stats bt.optimize( fastrange(10, 60, 5), slowrange(60, 200, 10), constraintlambda p: p.fast p.slow, # 开跑前剪枝 max_tries0.3, # 只扫 30% 的网格 methodgrid )同样的网格寻优时间通常降一个数量级被剪掉、被跳过的组合根本不参与计算。低成本档改几行策略代码指标移到init()向量化。用self.I(func, self.data.Close, ...)在init()里一次算好整段历史的指标数组引擎会逐根揭示给你别在next()里每根都sum(窗口)/window。窗口越大、数据越长省得越多。粗粒度先筛、细粒度后验。先用resample把数据聚到 4H/1D 做参数粗筛backtesting/lib.py 里自带OHLCV_AGG聚合规则拿到候选组合后再回到原始细粒度数据确认。典型场景下这是性价比最高的一步——数据量降一个量级寻优自然快一个量级。高投入档动底层或引新依赖换sambo做模型寻优。methodsambo用基于模型的优化替代全网格配max_tries控制预算几十次评估就能逼近网格最优需pip install sambo。网格组合上万时尤其划算。计算密集型统计用 JIT。若你自己写了重的向量化统计函数可对热点加numba的jit(nopythonTrue)。但引擎内建的compute_stats是 Python 实现改它属于改库收益要自己对着重构成本衡量。怎么确认提速是真的基准测试方法 前后对比这节给你一套可复现的测法免得把感觉快了当成真快了。固定三件事同一份数据仓库自带 backtesting/test/EURUSD.csv约 5000 根 1 分钟 K 线同一组参数同一台机器。用time.perf_counter()或cProfile包住前后重复跑 3 次取中位。关键是逐项开优化——先测未优化基线再一次只开一项说不清是哪步起效时也别一次性全开。下表是相对基线的典型区间具体数值随数据量和 CPU 变化非精确实测用来判断量级阶段相对耗时主要来源未优化逐根算指标 串行寻优1.0×基线Python 逐根循环 串行 网格剪枝 / 并行分片零成本~0.1–0.3×少算的组合 并行 指标向量化低成本~0.1×去掉逐根重算 sambo 模型寻优高投入~0.05×评估次数大幅减少在 5000 根 K 线的小样本上从全未优化到全优化通常是**分钟级→秒级甚至亚秒级**的量级差。踩坑记录这些弯我替你绕过了这节是几个容易翻车的地方都是优化时最容易被误判的。⚠️把next()的耗时当成数据问题。引擎里_Data已把列一次性转成连续 numpy 数组并缓存切片单根取价走的是快路径_current_value慢多半是next()里的 Python 逻辑不是你没把列改成float32。一次性把优化全打开再测。测不出是哪一项起效翻车了也定位不到。必须逐项开、逐项记。用小数max_tries时忘了网格已经很大。0.3 在 4 万个组合的网格上仍是 1.2 万次运行先估一下组合总数再定比例。细粒度数据直接上粗筛。resample改变了 K 线结构粗筛出的最优在原始数据上未必最优必须回验再定稿。回测提速的边际收益递减很快先做零成本档的网格剪枝和并行寻优多数场景已经够用真到瓶颈再上指标向量化或 sambo。下一步更值得投入的是数据本身——把特征/标签的预处理也向量化、并重新审视撮合假设而不是继续抠引擎常数。【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表