优化最佳实践
1)先定性分析再定量优化;2)避免过度拟合;3)保持简单原则;4)关注样本外表现;5)定期更新优化结果。
项目一:多因子选股策略
结果分析与优化是提升策略表现的关键步骤。本节将系统分析回测结果,识别问题,并提出优化方案。
def generate_performance_report(results):
"""
生成绩效分析报告
"""
report = {
'收益分析': {},
'风险分析': {},
'交易分析': {},
'因子分析': {}
}
# 收益分析
report['收益分析']['年化收益'] = results['annual_return']
report['收益分析']['累计收益'] = results['cumulative_return']
report['收益分析']['月均收益'] = results['monthly_return_mean']
report['收益分析']['胜率'] = results['win_rate']
# 风险分析
report['风险分析']['夏普比率'] = results['sharpe_ratio']
report['风险分析']['最大回撤'] = results['max_drawdown']
report['风险分析']['波动率'] = results['volatility']
report['风险分析']['VaR'] = results['var_95']
# 交易分析
report['交易分析']['换手率'] = results['turnover_rate']
report['交易分析']['交易次数'] = results['trade_count']
report['交易分析']['平均持仓天数'] = results['avg_holding_period']
report['交易分析']['交易成本占比'] = results['cost_ratio']
# 因子分析
report['因子分析']['IC均值'] = results['ic_mean']
report['因子分析']['IC标准差'] = results['ic_std']
report['因子分析']['信息比率'] = results['information_ratio']
report['因子分析']['因子衰减'] = results['factor_decay']
return report
# 生成报告
report = generate_performance_report(results)
print("========== 绩效分析报告 ==========")
for category, metrics in report.items():
print(f"\n{category}:")
for metric, value in metrics.items():
print(f" {metric}: {value:.2%}" if isinstance(value, float) else f" {metric}: {value}")
from sklearn.model_selection import ParameterGrid
def parameter_optimization():
"""
参数优化
"""
# 定义参数网格
param_grid = {
'lookback': [5, 10, 20, 40],
'top_n': [30, 50, 80, 100],
'rebalance_freq': [5, 10, 20, 40],
'stop_loss': [0.05, 0.10, 0.15],
'max_position': [0.05, 0.10, 0.15]
}
# 遍历参数组合
results = []
for params in ParameterGrid(param_grid):
try:
# 运行回测
backtest_result = run_backtest_with_params(params)
# 记录结果
results.append({
'params': params,
'sharpe_ratio': backtest_result['sharpe_ratio'],
'annual_return': backtest_result['annual_return'],
'max_drawdown': backtest_result['max_drawdown'],
'turnover': backtest_result['turnover_rate']
})
except Exception as e:
print(f"参数组合 {params} 失败: {e}")
continue
# 转换为DataFrame
results_df = pd.DataFrame(results)
# 找到最优参数
results_df['score'] = (
results_df['sharpe_ratio'] * 0.4 +
results_df['annual_return'] * 0.3 -
results_df['max_drawdown'] * 0.2 -
results_df['turnover'] * 0.1
)
best_params = results_df.loc[results_df['score'].idxmax(), 'params']
print("最优参数组合:")
for key, value in best_params.items():
print(f" {key}: {value}")
return best_params, results_df
| 问题 | 优化方案 | 预期效果 |
|---|---|---|
| 收益偏低 | 增加有效因子、优化因子权重 | 提升超额收益2-3% |
| 回撤过大 | 增加止损机制、降低仓位、行业中性 | 降低最大回撤5-8% |
| 换手过高 | 延长调仓周期、增加持仓筛选 | 降低换手率20-30% |
| 样本外衰减 | 样本内样本外训练、增加正则化 | 提升稳健性 |
from scipy.optimize import minimize
def optimize_factor_weights(factor_returns):
"""
因子权重优化
"""
n_factors = len(factor_returns.columns)
# 目标函数:最大化夏普比率
def objective(weights):
portfolio_return = (weights * factor_returns).sum(axis=1)
sharpe = portfolio_return.mean() / portfolio_return.std()
return -sharpe # 最小化负夏普比率
# 约束条件
constraints = ({
'type': 'eq',
'fun': lambda w: np.sum(w) - 1 # 权重和为1
})
# 权重边界
bounds = tuple((0, 1) for _ in range(n_factors))
# 初始权重
initial_weights = np.array([1/n_factors] * n_factors)
# 优化
result = minimize(
objective,
initial_weights,
method='SLSQP',
bounds=bounds,
constraints=constraints
)
optimal_weights = result.x
print("优化后的因子权重:")
for i, factor in enumerate(factor_returns.columns):
print(f" {factor}: {optimal_weights[i]:.2%}")
return optimal_weights
1)先定性分析再定量优化;2)避免过度拟合;3)保持简单原则;4)关注样本外表现;5)定期更新优化结果。