15年122倍,年化43.58%,回撤才20%,Optuna机器学习多目标调参backtrader,附python代码
·
原创内容第1025篇,专注AGI+,AI量化投资、个人成长与财富自由。
今天咱们继续策略优化:年化提升至35.31%,回撤30%,卡玛比1.17,通过趋势评分、动量及成交量变化的复合因子,附python代码
使用optuna机器学习调参来优化策略表现。
在Backtrader中使用Optuna进行多参数优化,可以更高效地找到最佳参数组合。


import optunafrom backtrader_engine import Task, Enginedef objective(trial):# 建议参数范围P1 = trial.suggest_int('P1',10, 32, step=1)P2 = trial.suggest_int('P2', 10, 32, step=1)P3 = trial.suggest_int('P3', 10, 32, step=1)P4 = trial.suggest_int('P4', 10, 32, step=1)t = Task()t.name = '多资产轮动-趋势评分'# 排序t.period = 'RunDaily't.weight = 'WeighEqually'# 添加风险控制t.order_by_signal = f'trend_score(close,{P1})+roc(close,{P2})*0.03+ma(volume,{P3})/ma(volume,{P4})*0.1't.symbols = ['518880.SH', # 黄金ETF'513100.SH', # 纳指100'159915.SZ', # 创业板'510300.SH', # 沪深300# 新增# '512690.SH', # 酒ETF - 消费轮动# '515000.SH', # 科技ETF - 科技主线# '512880.SH', # 券商ETF - 市场情绪# '510500.SH', # 中证500 - 中盘成长# '159980.SZ', # 有色ETF - 周期品]t.benchmark = '510300.SH'e = Engine(path='quotes')# t.order_by_signal = 'trend_score(close,$P)'.replace('$P', str(p))strategy_results = e.run(t)[0]# 获取分析结果sharpe_ratio = strategy_results.analyzers.sharpe.get_analysis()drawdown = strategy_results.analyzers.drawdown.get_analysis()returns = strategy_results.analyzers.returns.get_analysis()# 计算目标值(综合考量夏普比率和回撤)sharpe_value = sharpe_ratio.get('sharperatio', 0)max_drawdown = drawdown.get('max', {'drawdown': 100}).get('drawdown', 100)# 避免除零错误if max_drawdown == 0:max_drawdown = 0.1# 综合评分:夏普比率越高越好,回撤越小越好composite_score = sharpe_value * (1 - max_drawdown / 100)# 设置试验属性以便后续分析trial.set_user_attr('final_value', e.cerebro.broker.getvalue())trial.set_user_attr('max_drawdown', max_drawdown)trial.set_user_attr('sharpe_ratio', sharpe_value)return composite_scoreif __name__ == '__main__':# 创建研究study = optuna.create_study(direction='maximize', # 最大化综合评分sampler=optuna.samplers.TPESampler(seed=42))# 开始优化study.optimize(objective, n_trials=100)# 输出最佳结果print("\n=== 优化结果 ===")print(f'最佳试验: {study.best_trial.number}')print(f'最佳参数:')for key, value in study.best_trial.params.items():print(f' {key}: {value}')print(f'最佳目标值: {study.best_trial.value:.4f}')print(f'最终资产: {study.best_trial.user_attrs["final_value"]:.2f}')print(f'夏普比率: {study.best_trial.user_attrs["sharpe_ratio"]:.4f}')print(f'最大回撤: {study.best_trial.user_attrs["max_drawdown"]:.2f}%')
如果需要同时优化多个目标(如同时最大化收益和最小化回撤),可以使用Optuna的多目标优化功能:
# 多目标优化示例def multi_objective(trial):# ... 参数定义和回测代码与前面相同 ...return final_value, -max_drawdown # 同时返回多个目标# 创建多目标研究study = optuna.create_study(directions=['maximize', 'minimize'] # 最大化最终价值,最小化回撤)
参数优化技巧
-
动态参数范围:根据参数关系调整搜索空间
-
早停机制:使用Optuna的剪枝功能避免无效试验
-
并行优化:利用
n_jobs参数加速优化过程
注意事项
-
过拟合风险:避免在过多参数上进行过度优化
-
前视偏差:确保优化数据与验证数据分离
-
交易成本:在回测中考虑佣金和滑点的影响
这个框架可以灵活地扩展到更复杂的策略和更多的参数。你可以根据需要调整目标函数、参数范围以及评估指标,以获得符合你风险偏好的最佳参数组合。
每天“不管”一点点,每天就变强一天天。
代码和数据下载:AI量化实验室——2025量化投资的星辰大海
更多推荐


所有评论(0)