参数调优基础:参数空间定义、参数类型与调优目标函数
好,咱们今天聊聊参数调优最基础的东西。说实话,很多人一上来就搞什么网格搜索、贝叶斯优化,结果连参数空间都没定义清楚——这就像你连地图都没有,就开始找宝藏,能找着才怪。
我个人习惯,做任何策略调优之前,先花半小时把这三个问题想明白:参数从哪来?参数长啥样?怎么才算好? 这就是我们今天要讲的:参数空间定义、参数类型、调优目标函数。
一、参数空间定义——你的搜索边界在哪?
参数空间,说白了就是你要搜索的所有参数取值的集合。我见过最离谱的事,有人把移动平均线参数设成1到500,步长1——结果跑了三天三夜,最后发现最优参数就在20到60之间。白白浪费了时间。
定义参数空间时,我一般遵循三个原则:
- 原则一:基于逻辑定范围。比如均线周期,短期均线一般5到50,长期均线20到200。你设个5000,那还叫短期吗?
- 原则二:考虑计算成本。参数空间越大,搜索时间越长。网格搜索的话,参数个数每增加一个,计算量可能翻倍。
- 原则三:留有余地。别把边界卡太死,万一最优解就在边界上呢?我习惯把边界外扩10%-20%。
举个例子:一个双均线策略,参数空间可以这样定义:
- 短期均线:5 ~ 50,步长5
- 长期均线:20 ~ 200,步长10
- 止损比例:0.01 ~ 0.05,步长0.005
这样总共只有 10 × 19 × 9 = 1710 种组合,网格搜索完全扛得住。
二、参数类型——连续、离散还是条件?
参数类型这事儿,很多人觉得简单——不就是整数和小数吗?其实没那么简单。我把它分成三类:
1. 连续参数
连续参数就是可以在某个区间内取任意值的参数。比如止损比例0.02、0.025、0.031...理论上可以无限细分。
坑在哪? 连续参数如果用网格搜索,步长选不好就麻烦了。步长太大,可能错过最优解;步长太小,计算量爆炸。我曾经为了一个连续参数跑了整整一周,结果发现最优解就在步长中间——气得我直接换了贝叶斯优化。
2. 离散参数
离散参数只能取有限个值。比如均线周期只能是整数,再比如策略的入场信号类型(金叉、死叉、背离)只能选一个。
离散参数相对好处理,枚举就行。但要注意:离散参数的取值要有意义。比如均线周期设成7、13、21这种,比设成8、14、22更有技术含义——因为7、13、21是斐波那契数列里的数,很多交易者会关注。
3. 条件参数
这个容易被忽略。条件参数的意思是:某个参数只有在另一个参数取特定值时才有意义。
举个例子:策略里有个开关参数 use_trailing_stop,取值为 True 或 False。如果为 True,才需要 trailing_stop_pct 这个参数。如果为 False,这个参数根本不存在。
处理方式:在代码里加个判断,或者用嵌套参数空间。我习惯用字典结构来组织:
param_space = {
'use_trailing_stop': [True, False],
'trailing_stop_pct': {
'condition': 'use_trailing_stop == True',
'values': [0.01, 0.02, 0.03, 0.05]
}
}
三、调优目标函数——到底什么算「好」?
这是最核心的问题。你调了半天参数,总得有个标准吧?但很多人只盯着收益率看,这是大忌。
我见过一个案例:有人把参数调得收益率翻了三倍,结果最大回撤从10%飙到了45%。这策略你敢实盘吗?反正我不敢。
常用的目标函数有这么几种:
| 目标函数 | 公式/说明 | 适用场景 |
|---|---|---|
| 夏普比率 | (策略收益 - 无风险利率) / 波动率 | 追求风险调整后收益 |
| 卡玛比率 | 年化收益 / 最大回撤 | 对回撤敏感的策略 |
| 总收益率 | 期末净值 / 期初净值 - 1 | 只看结果,不关心过程 |
| 胜率 | 盈利交易次数 / 总交易次数 | 高频策略或短线策略 |
| 盈亏比 | 平均盈利 / 平均亏损 | 趋势跟踪策略 |
我个人最常用的是夏普比率和卡玛比率的组合。为什么?因为单看夏普,可能忽略极端回撤;单看卡玛,又可能过于保守。我一般这样写目标函数:
def objective_function(results):
sharpe = results['sharpe_ratio']
calmar = results['annual_return'] / results['max_drawdown']
# 两者加权,夏普权重0.6,卡玛权重0.4
score = 0.6 * sharpe + 0.4 * calmar
return score
注意:目标函数不能太复杂。我见过有人把七八个指标揉在一起,结果调出来的参数在每一个指标上都不突出——这叫「样样通,样样松」。建议最多用2-3个指标组合。
四、实战中的避坑指南
说了这么多,最后分享几个我踩过的坑:
- 坑一:参数空间太大。我曾经把参数空间设成100万种组合,结果网格搜索跑了三天还没跑完。后来改用随机搜索,只跑了5000次就找到了差不多的解。
- 坑二:目标函数过拟合。调优时收益率特别高,一换样本外数据就崩了。这是因为目标函数太「聪明」,把噪声也学进去了。解决办法:用交叉验证,或者加一个惩罚项。
- 坑三:忽略参数相关性。比如均线快线和慢线,如果快线比慢线还长,那逻辑就反了。我习惯在参数空间定义时就加上约束条件。
总结一下今天的核心:
- 参数空间要合理,别太大也别太小
- 参数类型要分清,连续、离散、条件各不同
- 目标函数要实用,别贪多,2-3个指标足矣
记住:调优不是炫技,是找到那个「在真实市场中也能赚钱」的参数组合。