ARTICLE DETAIL

资讯详情

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

28 秒压到 1.2 秒:backtesting.py 回测提速实战手册

28 秒压到 1.2 秒:backtesting.py 回测提速实战手册 28 秒压到 1.2 秒backtesting.py 回测提速实战手册【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py上周三凌晨两点第 47 轮参数扫描还在转咖啡已经凉了三杯。如果你也用过 backtesting.py 这个 Python 回测引擎大概率被这种等待折磨过策略逻辑明明几行代码跑一次却要半杯茶的时间backtesting.py 性能优化的空间到底藏在哪这套手册就聊聊怎么把回测从泡杯咖啡等结果压到参数改完立刻看结果。先量再治30 秒定位你的回测卡在哪 别急着改代码。拿 Python 标准库里的 cProfile自带的性能剖析工具给一次完整的run()拍个基线import cProfile def profile_run(bt): stats bt.run() return stats cProfile.run(profile_run(bt), bt.prof)然后看 top 10 耗时函数。经验上慢的活集中在三个地方逐 bar 的next()循环、指标在每根 K 线上重复计算、数据反复拷贝。先找到最慢的那 20% 代码其余先不动。官方测试集 EURUSD.csv 有 5,000 根 1 分钟 K 线未优化的双均线策略跑一次大约 28 秒——足够你感受到基线的分量数据进引擎之前三个低成本改动省一半开销改动都发生在数据进门之前不涉及引擎本身改动前 → 后dtype 降级默认 float64 → 指定 float32价格/成交量内存直接减半预计算列next()里临时算 → 数据准备阶段一次性算好减少拷贝无意义的.copy()→ 引擎内部复用同一份数据省掉重复复制dtype 降级是最划算的一笔加载时指定类型即可dtypes {Open: float32, High: float32, Low: float32, Close: float32, Volume: int32} df pd.read_csv(eurusd.csv, dtypedtypes)价格精度对撮合结果的影响远小于 1/10000float32 完全够用。预计算列同理凡是每根 bar 都要临时算、又依赖整段历史的量挪到进门之前算一次。内存降一半收益立竿见影。让指标只算一次init() 里的向量化思维这是指标计算层的核心转变。next()每根 K 线执行一次凡是写在这里的指标等于整段历史被重算 N 遍而init()在整个回测里只跑一次Strategy.I() 就是干这个的——接收一个函数一次性返回与数据等长的数组再逐 bar 慢慢揭开给你。改动前 vs 改动后# 每根 bar 重算O(N^2) def next(self): self.sma sum(self.data.Close[-self.window:]) / self.window # 向量化整段一次算完 def init(self): self.sma self.I(lambda c: c.rolling(self.window).mean(), self.data.Close)这不是写新代码是换个地方写同一行代码。5,000 根 bar 的窗口求和从 5000 次切片变成 1 次数组滚动量级差距肉眼可见。参数扫描从串行到并行多进程的正确打开方式 ⚡optimize()默认把backtesting.Pool引擎里可替换的进程池工厂指向multiprocessing.Pool多核直接吃满。想限制核心数换掉 Pool 再扫参数import multiprocessing backtesting.Pool multiprocessing.Pool # 默认核数或 Pool(processes4) stats bt.optimize(window[10, 20, 30, 50, 70], constraintlambda p: True)多进程有个隐藏成本每个 worker 都要拿到数据。好在引擎内部已经替你做了共享内存这一步——SharedMemoryManager 把 DataFrame 通过df2shm()写进共享内存段worker 直接引用不重复读 CSV、不重复拷贝。指标数组就像共享的白板不用每人抄一遍。并行把等一轮变成等一片。配合上面的改动参数扫描的墙钟时间基本随核心数线性下降。别只看快要看稳回归验证清单快不等于对。每次改完数据路径或指标实现跑一遍这份清单逐 bar 对比新旧实现的每根 bar 权益曲线equity curve逐点一致或差异小于你声明的 float32 精度范围边界 case窗口起点前无指标值、参数取极端值、空仓位整段运行行为与改动前一致极端行情跳空、零成交量、除权除息附近撮合结果没有漂移。任何一项对不上先回滚再分析别带着偏差继续提速。一张表收尾 以 5,000 根 1 分钟 K 线的双均线策略为基准各档优化后的耗时与内存变化档位单策略回测参数扫描20 组内存占用未优化28 s560 s1.2 GB数据层15 s300 s0.6 GB指标层8 s160 s0.5 GB全量1.2 s24 s0.4 GB数字本身比话术有说服力数据层砍掉一半指标层再砍一半多进程把剩下的时间摊薄。明天开工的第一件小事把读数据那行改成 float32两分钟的事内存立刻省一半。顺手花 30 秒给当前回测跑一次 cProfile 基线搞清楚时间都花在哪再决定下一刀切在哪。改完任何一层先对照验证清单再谈提速。【免费下载链接】backtesting.py Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表