VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 1
声望: 0

参数优化崩溃了, 大家看看是什么问题
Traceback (most recent call last):
File "D:\ProgramData\anaconda3\lib\threading.py", line 1016, in _bootstrap_inner
self.run()
File "D:\ProgramData\anaconda3\lib\threading.py", line 953, in run
self._target(*self._args, **self._kwargs)
File "D:\ProgramData\anaconda3\lib\site-packages\vnpy_ctabacktester\engine.py", line 326, in run_optimization
self.result_values = engine.run_bf_optimization(
File "D:\ProgramData\anaconda3\lib\site-packages\vnpy_ctastrategy\backtesting.py", line 541, in run_bf_optimization
results: list = run_bf_optimization(
File "C:\code\python\py3.10\vnpy-master\vnpy\trader\optimize.py", line 122, in run_bf_optimization
results: list[tuple] = list(it)
File "D:\ProgramData\anaconda3\lib\site-packages\tqdm\std.py", line 1181, in iter
for obj in iterable:
File "D:\ProgramData\anaconda3\lib\concurrent\futures\process.py", line 570, in _chain_from_iterable_of_lists
for element in iterable:
File "D:\ProgramData\anaconda3\lib\concurrent\futures_base.py", line 621, in result_iterator
yield _result_or_cancel(fs.pop())
File "D:\ProgramData\anaconda3\lib\concurrent\futures_base.py", line 319, in _result_or_cancel
return fut.result(timeout)
File "D:\ProgramData\anaconda3\lib\concurrent\futures_base.py", line 458, in result
return self.get_result()
File "D:\ProgramData\anaconda3\lib\concurrent\futures_base.py", line 403, in
get_result
raise self._exception
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.

Super Moderator
avatar
加入于:
帖子: 101
声望: 10

根据错误日志和知识库内容分析,该崩溃主要由多进程优化任务异常终止导致。以下是关键原因及解决方案:

核心原因

  1. 多进程异常中断
    错误信息BrokenProcessPool表明子进程在执行任务时异常退出,可能原因:

    • 参数空间过大导致内存溢出(暴力穷举的组合数超过系统承载能力)
    • 策略回测函数存在未捕获的异常(如无效参数、数据缺失)
    • 不可序列化对象传递(如包含lambda函数或复杂类实例)
  2. Windows多进程兼容性问题
    Windows下多进程需重新导入模块,若策略或数据路径未正确配置可能导致子进程初始化失败。

解决方案

  1. 优化参数设置

    • 缩小参数范围或增大步进值(如将atr_length从10-40步进1改为步进2)
    • 分阶段优化:先粗调(大步进)再精调(小步进)
  2. 检查策略代码

    • 在策略on_init/on_start中添加异常捕获逻辑
    • 验证数据加载是否完整(如检查self.am数组长度)
  3. 单进程调试
    临时修改max_workers=1强制单进程运行,定位是否为多进程特有问题:

    # 修改回测引擎调用参数
    engine.run_bf_optimization(..., max_workers=1)
    
  4. 序列化检查
    确保优化参数为基本类型(int/float/list),避免传递:

    • 自定义类实例
    • lambda函数
    • 打开的数据库连接等资源
  5. 升级系统资源

    • 使用任务管理器监控内存占用,若接近物理内存上限需升级硬件
    • 在Linux系统运行(多进程效率更高且资源管理更优)

预防措施

  • 使用遗传算法替代暴力穷举(参数空间>1000组合时效率提升10x+)
  • 定期执行git pull更新到最新版本(v3.5.0优化了多进程稳定性)

建议优先尝试方案1和2快速定位问题,若仍无法解决可提供具体参数设置和策略代码片段进一步分析。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】