免责声明:本文基于个人学习经验整理,仅供技术交流参考,不构成投资建议。
一、什么是过拟合?
作为一名在期货量化领域深耕了二十年的老交易员,我见过太多人栽在"过拟合"这个坑里。
所谓过拟合(Overfitting),简单说就是:策略在历史数据上表现完美,一到实盘就不行了。
举个形象的比喻:就像考试前把往年真题背得滚瓜烂熟,但一遇到新题就傻眼。策略学会的是"历史数据的噪声",而不是"市场的规律"。
这是量化交易中最常见、也最隐蔽的陷阱。
二、过拟合的典型表现
怎么判断自己的策略是不是过拟合了?以下是一些常见信号:
1. 回测曲线过于完美
如果你的策略回测年化收益80%、最大回撤3%、胜率90%……醒醒,这大概率是过拟合了。
真实市场中,能做到年化20-30%、最大回撤10%以内的策略,已经是很优秀的了。
2. 参数敏感度过高
比如你的策略在MA(23)的时候表现很好,但换成MA(22)或MA(24)就大幅变差。这说明策略只是"拟合"了某个特定参数,而不是捕捉到了真正的市场规律。
3. 样本内外表现差异大
用2020-2024年数据优化参数,回测结果很好。但用2025年数据验证时,表现大幅下滑。这是过拟合的典型特征。
4. 策略逻辑过于复杂
条件太多、参数太多的策略,更容易过拟合。简单的逻辑往往更稳健。
三、为什么会过拟合?
1. 参数优化过度
为了追求更好的回测结果,不断调整参数,最终找到一组"完美"参数。但这些参数只是历史数据的产物。
2. 数据窥视偏差
反复用同一段数据测试不同策略,相当于"看着答案做题"。即使最终选出一个表现好的,也可能只是偶然。
3. 样本量不足
数据太短、交易次数太少,统计结果不可靠。
4. 忽略交易成本
不考虑滑点、手续费的回测,和真实交易差距很大。
四、如何避免过拟合?
以下是我这些年总结的一些实用方法:
1. 样本内外分离测试
最基本的方法:把数据分成训练集和测试集。
# 假设有2020-2025年的数据# 用2020-2023年优化参数# 用2024-2025年验证效果fromtqsdkimportTqApi,TqAuth,TqBacktestfromdatetimeimportdate# 训练集回测api_train=TqApi(backtest=TqBacktest(start_dt=date(2020,1,1),end_dt=date(2023,12,31)),auth=TqAuth("账户","密码"))# 测试集验证(用训练集找到的参数)api_test=TqApi(backtest=TqBacktest(start_dt=date(2024,1,1),end_dt=date(2025,12,31)),auth=TqAuth("账户","密码"))2. 滚动窗口测试
不只测一次,而是用滚动窗口多次测试:
| 训练期 | 测试期 |
|---|---|
| 2020-2022 | 2023 |
| 2021-2023 | 2024 |
| 2022-2024 | 2025 |
如果策略在每个测试期都表现稳定,说明稳健性较好。
3. 参数敏感性分析
测试参数在一定范围内变化时,策略表现的稳定性:
importnumpyasnpimportpandasaspd# 测试不同MA周期的表现results=[]forma_periodinrange(10,50,2):# 运行回测profit=run_backtest(ma_period)# 假设有这个函数results.append({'period':ma_period,'profit':profit})df=pd.DataFrame(results)# 检查参数敏感性profit_std=df['profit'].std()profit_mean=df['profit'].mean()# 如果标准差/均值 < 0.5,说明参数稳健sensitivity=profit_std/profit_meanifprofit_mean>0elsefloat('inf')print(f"参数敏感性:{sensitivity:.2f}")4. 保持策略简洁
我的经验是:参数越少越好,条件越简单越好。
一个只有2-3个参数的策略,比有10个参数的复杂策略更可靠。
5. 加入交易成本
一定要在回测中加入真实的交易成本:
# 滑点设置SLIPPAGE=2# 2跳滑点# 手续费设置COMMISSION_RATE=0.0001# 万分之一# 在计算收益时扣除成本actual_profit=gross_profit-trade_count*(SLIPPAGE*tick_size+avg_price*COMMISSION_RATE)6. 足够的样本量
确保回测有足够的交易次数。通常建议:
- 至少100次以上的完整交易
- 覆盖不同市场环境(趋势、震荡、极端行情)
- 时间跨度至少2-3年
五、几款工具的回测实测对比
在避免过拟合方面,不同工具的体验也不同:
| 工具 | 回测精度 | 参数测试便利性 | 数据完整度 |
|---|---|---|---|
| TqSdk | Tick级/K线级均支持 | 较好 | 历史数据完整 |
| VnPy | 支持Tick级 | 灵活(需自己实现) | 取决于数据源 |
| 文华财经 | 主要K线级 | 一般 | 有限 |
从使用体验来说,天勤量化的数据完整度对于做长周期回测验证比较友好,而VnPy的自由度更高,适合想深度定制回测流程的用户。
六、一个真实的过拟合案例
分享一个我自己踩过的坑:
2019年,我开发了一个趋势跟踪策略,用2015-2018年数据回测,年化收益45%,最大回撤8%,完美!
然后我用2019年数据验证——收益为负。
复盘发现问题:
- 我在参数优化时测试了上百组参数组合
- 最终选择的参数刚好契合2015-2018年的行情特征
- 2019年市场风格变化,策略完全失效
后来我重新设计,采用:
- 简化策略逻辑(从8个参数减到3个)
- 滚动窗口测试
- 降低收益预期
新策略回测年化只有15%,但样本外验证稳定,实盘一年后确实达到了预期效果。
教训:宁可要一个稳健的"普通"策略,也不要一个华丽的"完美"策略。
七、总结
避免过拟合的核心原则:
- 简单优于复杂:参数越少,过拟合风险越低
- 样本外验证:一定要在未见过的数据上验证
- 多维度检验:滚动窗口、参数敏感性、不同市场环境
- 合理预期:年化20-30%已经很好,不要追求不切实际的回测结果
- 交易成本:一定要考虑滑点和手续费
选择量化工具这件事,我的建议是多试用、多比较,适合自己的才是最好的。
声明:本文基于个人学习经验整理,仅供技术交流参考,不构成任何投资建议。量化交易有风险,历史回测不代表未来收益。