风险提示:本文仅为技术与投研思路科普,不构成任何投资建议。股市有风险,投资需谨慎。AI模型仅作为数据分析辅助工具,无法保证投资收益,历史回测不代表未来表现,任何策略在实盘中都可能亏损,请独立审慎决策。
前言
昨天我教大家用Python跑通了一套AI量化选股回测框架。今天必须泼一盆冷水:
同样是用AI做选股,有人越做越稳,有人却越做越亏。
我观察下来,90%的新手亏钱,不是代码写得不好,而是掉进了下面这3个致命坑。今天我把它们一个个拆开,让你少走三年弯路。
坑一:过拟合 —— 你把AI调成了"历史考试满分,实战全部翻车"
什么是过拟合?
就是你为了让策略在历史数据上表现漂亮,反复调整参数,直到它在过去的行情里"百战百胜"。
听起来很爽,对吧?但问题来了:
你优化的不是"赚钱能力",而是"背答案的能力"。
历史数据就那么几套走势,AI把答案都背下来了。一旦遇到没见过的行情,立刻原形毕露。
怎么判断自己过拟合了?
问自己三个问题:
- 参数是不是为了某个特定时间段调出来的?
- 换一个时间段,策略还赚钱吗?
- 稍微改一下参数,收益是不是剧烈变化?
如果"是",恭喜你,你的策略基本是废的。
正确做法:
- 把数据分成训练段和样本外验证段,训练段调参,样本外段检验
- 参数宁少勿多,规则越简单越不容易过拟合
- 用蒙特卡洛/随机扰动测试策略稳健性
坑二:未来函数 —— 你的回测收益是"作弊"出来的
什么是未来函数?
简单说:你在回测里,用了"当时根本还没发生"的数据去决策。
举个例子:
- 用"当天的收盘价"来选股,却在当天开盘就买入
- 用"当天的涨跌幅"排序,却在盘前就"预测"了谁涨
这些数据在现实里你当天根本拿不到,但回测里却"开天眼"了。结果就是——回测年化翻倍,实盘亏成狗。
怎么排查?
自查你的代码里有没有这几种"穿越":
- 用到了未来的收盘价、未来的均线、未来的涨跌幅
- 用了"T日收盘才知道"的数据,却在T日开盘交易
- 股票池里混入了当天刚上市/当天退市的标的
正确做法:
- 选股只用T-1日及之前的数据,T日开盘再交易
- 数据获取时做shift(1)偏移,杜绝未来信息泄漏
- 实在不确定,就把回测收益打个对折再看
坑三:幸存者偏差 —— 你看到的全是"活下来的赢家"
什么是幸存者偏差?
回测时,很多人的股票池只包含"现在还活着的股票",却忽略了那些退市、ST、暴跌的股票。
想象一下:
- 你统计"过去5年买了这组股票平均赚多少"
- 但里面全是今天还在的牛股
- 那些早已退市归零的,被悄悄过滤掉了
结果你的回测收益虚高得离谱,因为样本本身就偏了。
正确做法:
- 股票池必须包含历史所有股票,包括已退市的
- 用点阵图全样本回测,而不是只看当下存续标的
- 多看看"最差情况":最大回撤、单只暴雷对组合的影响
为什么这3个坑特别容易骗人?
因为它们都有一个共同特点:回测数据不会说谎,但你的"数据口径"在说谎。
AI只是忠实地按照你给的规则和历史去算,问题从来出在你给的规则本身带着bug。
所以真正的高手,不是代码写得炫,而是知道哪些数据能用、哪些不能用。
给你一套防坑自查清单
写策略前,对着这份清单打勾:
| 检查项 | 是否已处理 |
|---|---|
| 参数是否只在特定时间段调过 | ☐ |
| 是否做了样本外验证 | ☐ |
| 是否使用了未来数据(shift偏移) | ☐ |
| 股票池是否包含已退市标的 | ☐ |
| 是否考虑了手续费、滑点、涨跌停 | ☐ |
| 是否看过最大回撤和最差年份 | ☐ |
每一项都确认通过,你的策略才真正"能打"。
结尾互动
你自己踩过这几个坑吗?评论区聊聊你的回测翻车经历,下一期我教你怎么把策略做得更稳健、更接近实盘。
风险提示:本文为技术科普内容,不构成任何投资建议。量化策略存在失效与亏损风险,股市有风险,入市需谨慎。