如何将Backtrader输出的Python列表按第三列值降序排序
Backtrader优化参数结果按资金值降序排序实现方案
实现思路
核心是先收集所有参数组合的回测结果,再以列表第三列(账户资金值)为排序键做降序排列,不需要修改原有回测逻辑,仅补充结果收集、排序的代码即可。
方案1:回测流程内实时收集排序(推荐)
不要在单组参数回测完就直接打印结果,先把每组结果存入全局结果列表,等所有参数组合回测完成后统一排序输出,代码如下:
# 在回测主逻辑初始化位置,定义全局结果存储列表 optimize_result = [] # --- 以下是你原有策略内生成单组参数结果的逻辑 --- val_list = [self.params.sl_maperiod, self.params.ft_maperiod, self.broker.getvalue()] # 把原来的print(val_list)改成追加到结果列表 optimize_result.append(val_list) # --- 所有优化回测任务执行完成后,执行排序 --- # key指定取列表索引为2的元素(即第三列资金值),reverse=True表示降序 sorted_result = sorted(optimize_result, key=lambda item: item[2], reverse=True) # 打印排序后的结果,资金最高的参数组默认在最顶部 for param_group in sorted_result: print(param_group)
用你给出的样例数据测试,排序后第一条结果就是资金最高的参数组:[5, 25, 102084.91550000002],符合预期。
方案2:已生成打印日志的离线排序
如果你已经跑完优化,拿到了控制台打印的所有结果文本,可以直接解析文本后排序,不需要重跑回测,代码如下:
import ast # 可以直接粘贴控制台输出的日志,也可以从保存的日志文件读取内容 raw_log = """ [5, 20, 101416.90550000001] [5, 21, 101717.35600000001] [5, 22, 101942.15999999999] [5, 23, 101938.65450000002] [5, 24, 101785.45050000002] [5, 25, 102084.91550000002] [5, 26, 101634.87550000002] [5, 27, 101835.576] [5, 28, 101889.99200000001] [5, 29, 101906.11300000001] """ result_list = [] # 逐行解析日志内容为Python列表 for line in raw_log.strip().split("\n"): if line.strip(): single_res = ast.literal_eval(line.strip()) result_list.append(single_res) # 同样按第三列资金值降序排序 sorted_result = sorted(result_list, key=lambda item: item[2], reverse=True) for param_group in sorted_result: print(param_group)
注意事项
- 列表索引从0开始计数,第三列资金值对应的索引是2,写排序key的时候不要写错索引
- 排序必须加
reverse=True参数,Python内置sorted默认是升序排列,不加该参数会把资金最低的组合排到最前面 - 如果只需要看Top N的最优参数组合,打印的时候做切片即可,比如
sorted_result[:5]就是取排名前5的参数组 - 要获取全局最优参数,直接取排序后列表的第一个元素
sorted_result[0]即可,三个值依次对应最优Slow_EMA、最优Fast_EMA、对应最终账户资金
内容的提问来源于stack exchange,提问作者Satheesh Kumar
相关产品推荐
相关产品推荐

