优化风险提示
1)避免过度优化;2)保持参数简单;3)关注样本外表现;4)定期更新参数;5)避免数据挖掘偏差。
项目二:期货CTA策略
参数优化是提升策略表现的重要手段,但需避免过拟合。本节介绍科学的参数优化方法。
def grid_search(param_grid):
"""
网格搜索
"""
results = []
# 遍历所有参数组合
for params in ParameterGrid(param_grid):
result = backtest(params)
results.append({'params': params, 'score': result['sharpe']})
# 找到最优参数
best = max(results, key=lambda x: x['score'])
return best['params'], results
def random_search(param_dist, n_iter=100):
"""
随机搜索
"""
results = []
for _ in range(n_iter):
params = {k: random.choice(v) for k, v in param_dist.items()}
result = backtest(params)
results.append({'params': params, 'score': result['sharpe']})
best = max(results, key=lambda x: x['score'])
return best['params'], results
from hyperopt import fmin, tpe, hp
def bayesian_optimization(param_space, max_evals=100):
"""
贝叶斯优化
"""
def objective(params):
result = backtest(params)
return -result['sharpe']
best = fmin(objective, param_space,
algo=tpe.suggest, max_evals=max_evals)
return best
| 检测方法 | 指标 | 判断标准 |
|---|---|---|
| 样本外衰减 | 样本外夏普/样本内夏普 | < 0.5 |
| 参数敏感性 | 参数变化对绩效的影响 | 过于敏感 |
| 交易次数 | 年均交易次数 | > 1000次/年 |
| 拟合优度 | R方 | > 0.9 |
def parameter_stability_test(params, train_period, test_period, n_tests=10):
"""
参数稳定性测试
"""
results = []
for i in range(n_tests):
train_start = train_period[0] + i * timedelta(days=30)
train_end = train_period[1] + i * timedelta(days=30)
test_start = test_period[0] + i * timedelta(days=30)
test_end = test_period[1] + i * timedelta(days=30)
# 样本内优化
train_result = backtest(params, train_start, train_end)
# 样本外测试
test_result = backtest(params, test_start, test_end)
results.append({
'train_sharpe': train_result['sharpe'],
'test_sharpe': test_result['sharpe'],
'decay': test_result['sharpe'] / train_result['sharpe']
})
return pd.DataFrame(results)
1)避免过度优化;2)保持参数简单;3)关注样本外表现;4)定期更新参数;5)避免数据挖掘偏差。