2. 参数优化概述:为什么需要参数优化,过拟合与欠拟合的概念

2.1 为什么需要参数优化?

做量化交易的朋友,一定都遇到过这种情况:

你写了一个趋势策略,比如双均线金叉死叉。嗯,代码跑通了,回测曲线也挺漂亮。但问题来了——均线参数用5日和20日,还是用10日和60日?

我刚开始做策略开发时,就吃过这个亏。当时我手动调了几组参数,选了一组回测收益最高的,直接上了实盘。结果呢?三个月后亏得我怀疑人生。

说白了,参数优化就是帮你在海量参数组合中,找到那个「既不过于激进,也不过于保守」的平衡点

我个人习惯把参数优化比作「调吉他弦」:

  • 弦太松,声音发闷(策略反应迟钝)
  • 弦太紧,容易断(策略过度敏感,频繁交易)
  • 只有调到合适的张力,才能弹出好听的旋律

你想想看,一个趋势策略通常包含这些参数:

  • 均线周期:比如5日、10日、20日、60日
  • 突破阈值:比如价格突破均线多少百分比才开仓
  • 止损比例:比如亏损2%还是5%止损
  • 持仓周期:比如持有3天还是10天

这些参数组合起来,可能有几千甚至几万种。不优化,你怎么知道哪组最好?

核心观点:参数优化的目标不是找到「历史回测收益最高」的那组参数,而是找到「未来实盘表现最稳健」的那组参数。

2.2 过拟合:你被历史数据骗了

过拟合,是量化交易里最常见的坑。没有之一。

什么叫过拟合?就是你的策略在历史数据上表现完美,但一到实盘就崩

我记得有一次,我帮一个朋友优化他的策略。他给我看回测结果——年化收益80%,最大回撤只有5%。我当时就觉得不对劲。仔细一看,他把参数调到了极致,几乎完美拟合了过去三年的每一波行情。

结果呢?实盘一个月,亏了15%。

为什么会这样?因为市场是有噪声的。过拟合的策略,本质上是在「学习噪声」,而不是「学习规律」。

我总结过拟合的几个典型特征:

  • 参数过于精细:比如均线周期用17日而不是20日
  • 回测曲线太完美:几乎每个波段都吃到了
  • 样本外测试崩盘:换一段历史数据,收益大幅下降

避坑指南:我曾经见过有人把参数优化到「回测年化收益200%」,结果实盘三个月亏光本金。记住,回测收益越高,越要警惕过拟合。

2.3 欠拟合:你的策略太「钝」了

欠拟合,是另一个极端。

说白了,欠拟合就是你的策略太迟钝,连历史数据里的明显规律都没抓住

举个例子:你用200日均线和500日均线做金叉死叉。嗯,这两个参数确实不容易过拟合,但问题是——一年可能都出不了几次信号。行情涨了半年,你的均线才金叉;行情跌了半年,你的均线才死叉。

这种策略,回测收益可能很低,甚至跑不赢大盘。

欠拟合的典型特征:

  • 交易频率极低:一年可能只有几次交易
  • 回测收益平庸:甚至不如买入持有
  • 参数过于粗糙:比如只用整数倍的大周期

我个人习惯,判断一个策略是否欠拟合,就看它能不能抓住市场的主要趋势。如果连2015年的大牛市、2018年的大熊市都没抓住,那这个策略基本是废的。

2.4 过拟合 vs 欠拟合:如何平衡?

你可能会问:那到底怎么选?

嗯,这里有个经典的「偏差-方差权衡」理论。我尽量用大白话解释:

  • 欠拟合:偏差高,方差低。策略太简单,抓不住规律。
  • 过拟合:偏差低,方差高。策略太复杂,记住了噪声。
  • 理想状态:偏差和方差都适中,策略既能抓住规律,又能忽略噪声。

我画了一张图,帮你理解这个关系:

过拟合 vs 欠拟合:偏差-方差权衡 模型复杂度 → 误差 → 偏差(欠拟合) 方差(过拟合) 总误差 最佳复杂度 欠拟合区域 过拟合区域 策略太简单 策略太复杂

从这张图可以看出:

  • 模型太简单(左边),偏差高,抓不住规律
  • 模型太复杂(右边),方差高,记住了噪声
  • 中间那个「最佳复杂度」的点,才是我们想要的

我的经验:在实际项目中,我通常先用一组「常识参数」做基准,比如均线用20/60日。然后在这个基础上,做小范围的参数扫描,观察收益曲线的变化。如果参数稍微一改,收益就大幅波动,那大概率是过拟合了。

2.5 如何判断是否过拟合?

我分享几个实战中常用的方法:

  1. 样本外测试:把数据分成两段,前70%做优化,后30%做验证。如果样本外收益大幅下降,说明过拟合。
  2. 参数敏感性分析:微调参数,看收益变化。如果收益剧烈波动,说明过拟合。
  3. 蒙特卡洛模拟:随机打乱交易顺序,看策略是否还能赚钱。如果还能赚钱,说明策略有真实规律。
  4. 多品种测试:把策略放到不同品种上测试。如果只在某个品种上有效,可能是过拟合。

我个人最常用的是「参数敏感性分析」。举个例子:

# 参数敏感性分析示例
def sensitivity_analysis(strategy, param_range):
    results = []
    for param in param_range:
        ret = backtest(strategy, param)
        results.append(ret)
    
    # 计算收益的波动率
    volatility = np.std(results)
    if volatility > 0.15:  # 波动率超过15%,警惕过拟合
        print("⚠️ 参数敏感度过高,可能存在过拟合")
    else:
        print("✅ 参数敏感度在合理范围内")

注意:不要只看回测收益。我见过太多人,看到回测收益高就兴奋,结果忽略了过拟合的风险。记住,回测是手段,不是目的

2.6 小结

这一章我们聊了:

  • 为什么需要参数优化:因为不优化,你就是在瞎蒙
  • 过拟合:策略记住了噪声,实盘必亏
  • 欠拟合:策略太迟钝,抓不住机会
  • 如何平衡:找到偏差和方差的平衡点

下一章,我们会深入讲解具体的参数优化方法。嗯,到时候我会分享一些我踩过的坑,以及怎么用代码实现稳健的参数优化。


公众号:蓝海资料掘金营,微信deep3321