尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

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(deepFalse)参数寻优时数据还要逐进程 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(alphaa).mean().values100 万根 K 线上单个 SMA/EMA 级指标从约 800ms 降到约 90ms快 8 倍左右多周期指标可直接用 backtesting/lib.py 里的resample_apply工具函数。2. 共享内存跨进程传数据零拷贝SharedMemoryManager把multiprocessing.shared_memory封装成上下文管理器父进程把价格数组写进系统共享内存一次子进程按名字打开读取替代整个 DataFrame 序列化塞进每个子进程的旧路from backtesting._util import SharedMemoryManager with SharedMemoryManager(createTrue) 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/finally里gc.enable()还原。效果百万根数据内存约 800MB → 380MB策略每 bar 新建临时对象多时GC 调优再省几个百分点时间。汇总对比百万根 K 线、8 核机器指标优化前优化后单指标计算~800msfor 循环~90ms向量化数据跨进程整表 pickle共享内存传名字200 组合参数搜索~10 分钟串行~75 秒8 核并行数据内存800MBfloat64380MBfloat32 用 cProfile 和 memory_profiler 定位回测瓶颈先测量再动手CPU 侧cProfile.run(bt.run(), sortcumulative)看累计耗时榜。strategy.next与指标函数占大头就做技巧 1pickle/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),仅供参考
返回列表