如何测试数字集合所有组合取最高值 优化交易指标参数及神经网络权重
前提说明
- 我已将BUY/SELL Pine Script指标转换为Python代码;
- 该指标包含大量按神经网络结构排布的输入参数;
- 我已准备好用于该指标回测的历史数据。
需求说明
- 需自动调整输入参数和神经网络权重,以获取最高净利润;
- 回测框架已开发完成,仅需一套可按需自动优化输入参数集的算法,实现测试所有数字组合以得到最高结果的目标。
优化算法实现方案
可根据你的参数规模选择对应的实现方案:
小参数规模(参数数量≤5)
直接用暴力遍历法即可覆盖所有参数组合,实现逻辑最简单,结果100%可复现:
import itertools # 按实际需求定义每个参数的取值范围 param_ranges = { "indicator_param1": [i for i in range(1, 20)], "indicator_param2": [0.1, 0.2, 0.3, 0.4, 0.5], "nn_weight1": [-0.8, -0.4, 0, 0.4, 0.8] # 补充其余所有指标参数、神经网络权重的取值范围 } best_profit = -float("inf") best_params = None # 遍历所有参数组合 for params_group in itertools.product(*param_ranges.values()): current_params = dict(zip(param_ranges.keys(), params_group)) # 调用你已开发完成的回测接口,传入参数返回净利润 current_profit = your_backtest_func(current_params) if current_profit > best_profit: best_profit = current_profit best_params = current_params print(f"最优净利润:{best_profit} \n最优参数组:{best_params}")
中等参数规模(参数数量5~20)
暴力遍历算力成本过高,使用贝叶斯优化方案,可在有限迭代次数内逼近全局最优解,适配连续型的神经网络权重优化场景:
from bayes_opt import BayesianOptimization # 定义回测评估函数,输入为所有待优化参数,返回净利润 def evaluate(indicator_param1, indicator_param2, nn_weight1, nn_weight2): # 离散型指标参数手动转成整数 indicator_param1 = int(indicator_param1) params = { "indicator_param1": indicator_param1, "indicator_param2": indicator_param2, "nn_weights": [nn_weight1, nn_weight2] # 补充所有参数的映射逻辑 } return your_backtest_func(params) # 定义每个参数的取值上下限 pbounds = { "indicator_param1": (1, 20), "indicator_param2": (0.1, 0.5), "nn_weight1": (-1, 1), "nn_weight2": (-1, 1) # 补充所有参数的取值范围 } optimizer = BayesianOptimization( f=evaluate, pbounds=pbounds, random_state=1, ) # 迭代100次寻优,可根据你的算力情况调整迭代次数 optimizer.maximize(init_points=20, n_iter=80) print(f"最优净利润:{optimizer.max['target']} \n最优参数组:{optimizer.max['params']}")
大参数规模(参数数量≥20)
使用遗传算法适配混合参数类型,同时兼顾全局寻优能力和算力效率,是高维神经网络权重+指标参数混合优化的首选方案。
注意事项
- 所有参数范围的边界要合理,避免无意义的参数组合浪费算力
- 可以添加过拟合校验,回测时拆分训练集和验证集,只保留在验证集上也能拿到高收益的参数组合,避免参数过拟合历史数据
- 单次回测耗时较长的话,可以引入多进程并行计算,大幅提升优化效率
内容的提问来源于stack exchange,提问作者Zac Vaughn
相关产品推荐
相关产品推荐

