参数调优基础:参数空间定义、参数类型与调优目标函数

好,咱们今天聊聊参数调优最基础的东西。说实话,很多人一上来就搞什么网格搜索、贝叶斯优化,结果连参数空间都没定义清楚——这就像你连地图都没有,就开始找宝藏,能找着才怪。

我个人习惯,做任何策略调优之前,先花半小时把这三个问题想明白:参数从哪来?参数长啥样?怎么才算好? 这就是我们今天要讲的:参数空间定义、参数类型、调优目标函数。

参数调优基础 参数空间定义 范围 / 边界 / 步长 参数类型 连续 / 离散 / 条件 调优目标函数 夏普 / 回撤 / 收益 三者缺一不可,顺序不能乱

一、参数空间定义——你的搜索边界在哪?

参数空间,说白了就是你要搜索的所有参数取值的集合。我见过最离谱的事,有人把移动平均线参数设成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次就找到了差不多的解。
  • 坑二:目标函数过拟合。调优时收益率特别高,一换样本外数据就崩了。这是因为目标函数太「聪明」,把噪声也学进去了。解决办法:用交叉验证,或者加一个惩罚项。
  • 坑三:忽略参数相关性。比如均线快线和慢线,如果快线比慢线还长,那逻辑就反了。我习惯在参数空间定义时就加上约束条件。

总结一下今天的核心

  1. 参数空间要合理,别太大也别太小
  2. 参数类型要分清,连续、离散、条件各不同
  3. 目标函数要实用,别贪多,2-3个指标足矣

记住:调优不是炫技,是找到那个「在真实市场中也能赚钱」的参数组合。

专注资料整理