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


import optuna
from backtrader_engine import Task, Engine
def 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_score
if __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量化投资的星辰大海