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 欠拟合:如何平衡?
你可能会问:那到底怎么选?
嗯,这里有个经典的「偏差-方差权衡」理论。我尽量用大白话解释:
- 欠拟合:偏差高,方差低。策略太简单,抓不住规律。
- 过拟合:偏差低,方差高。策略太复杂,记住了噪声。
- 理想状态:偏差和方差都适中,策略既能抓住规律,又能忽略噪声。
我画了一张图,帮你理解这个关系:
从这张图可以看出:
- 模型太简单(左边),偏差高,抓不住规律
- 模型太复杂(右边),方差高,记住了噪声
- 中间那个「最佳复杂度」的点,才是我们想要的
我的经验:在实际项目中,我通常先用一组「常识参数」做基准,比如均线用20/60日。然后在这个基础上,做小范围的参数扫描,观察收益曲线的变化。如果参数稍微一改,收益就大幅波动,那大概率是过拟合了。
2.5 如何判断是否过拟合?
我分享几个实战中常用的方法:
- 样本外测试:把数据分成两段,前70%做优化,后30%做验证。如果样本外收益大幅下降,说明过拟合。
- 参数敏感性分析:微调参数,看收益变化。如果收益剧烈波动,说明过拟合。
- 蒙特卡洛模拟:随机打乱交易顺序,看策略是否还能赚钱。如果还能赚钱,说明策略有真实规律。
- 多品种测试:把策略放到不同品种上测试。如果只在某个品种上有效,可能是过拟合。
我个人最常用的是「参数敏感性分析」。举个例子:
# 参数敏感性分析示例
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