用 AI 跑出一条漂亮曲线,不等于 AI 有效
- 说得出「AI 让试错成本趋近于零」为什么会系统性地抬高「好看但无效」的概率,而不是笼统地说一句「回测不可信」
- 指得出 AI 参与之后,「你一共试了多少次」这个分母藏进了哪三个你看不见的地方
- 用四个固定动作把分母重新记回账上:开工前写死判定标准、给对话编号记账、跑变体离散度自测、把 AI 从发明家换成质检员
你花了一个晚上跟 AI 来回聊。你说了句「帮我想个能吃住震荡行情的规则」,它给了三种思路;你挑了一种让它写成代码,跑出来一般;你说「加个成交量的过滤条件试试」,它改了;你说「止损再紧一点」,它又改了;中间它自己主动建议换了两次指标组合。四十来轮之后,屏幕上是一条挺像样的曲线。
你截图发群里,配文「AI 是真好用」。
群里有个人只回了一句话:你今晚一共试了多少个版本?
你愣了一下。你答不上来。不是记不清具体数字,是你从头到尾就没在数——因为每一轮都只是「再改一点点」,感觉像是在打磨同一个东西,不像是在换新的东西。
这一节要讲的就是这个答不上来的数字。它不是一个统计洁癖问题,它决定了你屏幕上那条曲线到底值不值钱。
生活层:一台每秒试一万次的开锁机
先把股票放一边。
你面前有一把四位数密码锁。你决定硬试。手动拨轮,一次试一个,一分钟试五六个,试到手指发酸。假设你试了三个小时,锁开了。这时候你心里很清楚一件事:我不是猜中的,我是穷举穷到的。 你不会觉得自己对这把锁有什么洞察,也不会觉得自己能靠这个本事去开下一把锁。
现在换个场景。有人给了你一台机器,插上去,每秒能试一万组。你按下按钮,三秒钟,锁开了。
问题来了:这三秒钟,说明你懂这把锁吗?
当然不说明。锁的难度一点没变,你的理解一点没增加,唯一变的是「试的速度」。可是从体验上,这两件事天差地别——穷举三小时的人绝不会误以为自己有天赋,按了三秒按钮的人却很容易产生一种错觉:这么快就成了,说明这方法对路。
关键就在这儿:当试错的过程被压缩到你感觉不到的程度,你就会把「试出来的」误当成「想出来的」。
再补一句更扎心的。手动试三小时的你,至少知道自己试了大约一千组。按按钮三秒的你,连自己试了多少组都不知道——机器没告诉你,你也没问。而「试了多少组」这个数字,恰恰是判断结果值不值钱的唯一线索。
投资层:这件事对你的决策意味着什么
把上面那把锁换成历史行情,把开锁换成「找一条好看的资金曲线」,故事一模一样。
先说清楚一件事:这不是 AI 带来的新问题。 「在同一份历史上反复试探,试的次数越多,越容易撞出一条好看但无效的规律」,这件事有名字,叫数据窥探,本站 数据窥探 那篇已经把它的原理、以及「分母根本数不清」这个要害讲透了。参数寻优这个动作如何自动生产噪音,过拟合 那篇也拆过一轮。
AI 没有发明这个问题。AI 做的事情只有一件:把它的量级往上抬了好几个数量级。 但量级变化到了某个程度,性质就变了——这就是本节要补的那半边。
对你的决策来说,具体后果有三条。
第一条,分母从「懒得记」变成了「无从记」。 从前你手动改参数,一晚上改十几次,虽然没写下来,但你心里大致有数。现在一个晚上四十轮对话,每轮里 AI 可能已经替你横向比较过好几种写法、悄悄换掉了一个你没注意的默认值。你连「一轮算几次尝试」都定义不了。
第二条,你的信心涨得比证据快。 曲线越跑越漂亮,对话越聊越顺,你会不自觉地把「过程很顺畅」当成「思路很正确」。可这两件事之间没有任何因果关系——顺畅只说明工具好用。
第三条,也是最贵的一条:你手里最珍贵的那份「没见过的数据」,正在被你以极快的速度烧掉。 样本内与样本外 那篇讲过一条反直觉的纪律:样本外只能用一次,看过一眼它就不再干净了。人工调参时代,你一个月才舍得动它一次;跟 AI 聊天时,你可能一个晚上就把它翻出来看了六遍,每一遍之后又回去改了改。改完再看,它已经不是样本外了。
机制层:AI 从四条路加剧了既有的偏差
下面四条是本节的正题。它们各自对应一种早就存在的回测偏差,说的都是同一件事——AI 参与之后,这条偏差原本的防线为什么失效了。
一、试错成本掉到接近于零,搜索空间被撑爆
先看看工程界是怎么对待「试了多少次」的。
在开源交易框架 freqtrade 里,参数寻优这个功能有一个明确的计数单位叫 epoch,一次 epoch 就是「用一组参数完整跑一遍回测」。你可以在命令行里直接指定要跑多少个 epoch,跑完之后每一个 epoch 的成绩都在结果列表里躺着,可以事后逐条翻。它的文档里还有两句话很值得琢磨:一句是经验上跑到某个量级之后,再多跑收益就不大了;另一句更直白——换一个随机种子重跑几遍,大概率会得到不一样的「最优结果」(随机种子就是决定「从哪几组参数开始试」的那个初始随机数,文档里可以显式指定,用来复现同一次搜索)。
第二句话请读三遍。这是这套工具的官方文档在告诉你:它选出来的冠军,有相当一部分是随机性的产物。 换个起点,冠军就换人了。
还有一处细节:这个框架把可搜索的小数参数限制到了三位小数,文档给的理由是——比这更精细的取值通常只会带来过拟合的结果。主动把搜索空间阉割掉一截,就是为了防止你试得太细。
现在对照你跟 AI 的那个晚上。参数寻优再猛,它至少还被关在同一个策略骨架里——变的只是几个数字。而 AI 帮你做的事情,是换骨架:换指标、换逻辑、换持有周期、换品种池、换整套思路。这是完全不同量级的搜索空间,而且没有任何一个计数器在数它。
二、分母不只在你手上,还有三份藏在你看不见的地方
这一条是本节最想让你记住的。
第一份藏在对话记录里。 参数寻优工具被设计成记账:多少个 epoch、每个 epoch 什么成绩、用了哪个随机种子,全都落在盘上。聊天窗口被设计成流畅:你只会保存最后那版能跑的代码,中间被否掉的三十几个想法随着窗口关闭一起蒸发。一个记账,一个不记账,这不是谁好谁坏,是产品形态不同——但后果全部由你承担。
第二份藏在别人的历史里。 你问 AI「有哪些常用的选股因子」,它报给你的那几个,为什么是那几个?因为公开文本里它们被写得最多。而它们之所以被写得最多,很大程度上是因为——它们在过去某段历史上表现好过,所以被反复讨论、反复写进教材和文章。
请把这句话捋清楚:你以为你在做第一次尝试,其实你拿到的是一份已经被几万人筛选过的冠军名单。 那几万次失败的尝试没有出现在语料里,也不会出现在 AI 的回答里。你的分母,有一大块在别人手上,而你连它的存在都不知道。
第三份藏在训练语料的时间范围里。 这一条我要把话说得谨慎些:下面是从「这类模型学的是公开文本」这个已知前提推出来的机制推断,不是我跑实验测出来的结论。
假设你让 AI 帮你设计一套规则,然后拿某一段已经过去很久的历史行情来检验它。问题在于,那段历史后来发生了什么,早就被无数复盘文章、总结帖子、教科书案例写过一遍了,而这些文字大概率就在它读过的东西里。于是它给你的建议,天然带着一股后见之明的味道——它不是在预判,它是在复述那段历史的标准答案。
你再拿这段历史去验它的建议,等于拿答案去验答案。这在回测里有个正经名字叫 前视偏差,就是「算的时候用到了当时还不存在的信息」。只不过它平时通过代码里的一行错误潜进来,这次是通过一段看起来很有道理的自然语言建议潜进来的。后者你根本没法用查代码的办法查出来。
三、样本外只能用一次,而对话是有记忆的
这一条很短,但它是所有纪律里最容易破功的一条。
正经流程是:把历史切两段,前一段随便折腾,后一段封存起来,等你觉得想法成熟了,只拆封一次,成绩如何就是如何。
现在看看跟 AI 协作时实际会发生什么。你把想法调好了,拿样本外一测,不理想。你顺手把这个结果告诉了它:「在 2019 到 2021 这段表现很差,帮我看看为什么。」
就这一句话,样本外没了。
因为它接下来给你的所有建议,都会绕着「让 2019 到 2021 好看起来」这个目标转。你再去测那段,测出来的成绩已经不干净了——你等于把答案抄给了出题人,然后让他重新出一道题。
人工时代这条纪律也会破,但破得慢,因为你脑子里的记忆是模糊的、会衰减的。对话不衰减。 你说过的每一句关于样本外的话,都完整地留在上下文里,持续影响后面每一轮的输出。
坑:把样本外的具体结果说给 AI 听,然后继续让它改进方案。 怎么避:定一条硬规矩——样本外的成绩不进对话框。想改进就回到样本内去改,改完了如果还想再测一次样本外,就必须承认「这已经是第二次拆封了,它的说服力比第一次低得多」,并且把这个次数明明白白记下来。
四、AI 写的回测代码,肉眼审不出未来函数
最后一条是工程层面的。
freqtrade 文档里有一句关于未来函数的话,意思大致是:这类偏差有时候极其容易被无意引入,却非常难被发现。所以那个框架干脆提供了一个专门的检测命令——而且这个命令的做法很有意思,它压根不去读你的策略代码,而是通过反复改变喂给策略的数据范围、再对比指标值和买卖点有没有跟着变,来把这个毛病逼出来。
为什么不读代码?因为读代码这条路走不通。逻辑绕两层,肉眼就看不出哪一步偷偷用到了后面的数据。
现在把这个放到 AI 场景里。你自己一行行敲出来的代码,逻辑好歹在你脑子里过了一遍;AI 生成的代码,你多半只是从上到下扫了一眼,觉得「看着挺对」。
而「看着挺对」,恰恰是这类模型最擅长制造的东西。
所以结论很硬:AI 写的回测代码,必须过机器检测,不能只过肉眼。 如果你用的工具没有这类检测能力,那至少手动做一件事——把数据的结束时间往前砍掉一段再跑一遍,看看已经过去那部分的指标值和买卖点有没有变。变了,就有问题。
那到底该怎么办:四个把分母拿回来的动作
不用戒掉 AI。要做的是把它抹掉的那个计数器,人工装回去。
动作一:开工之前,先把判定标准写死。
在你敲下第一句提问之前,先在一张纸上(或者一个不会被 AI 读到的文件里)写四行:
- 我要验的假设是什么,用一句话说清;
- 什么样的结果算通过,什么样的算不通过,写具体的门槛;
- 我允许自己试多少次,写一个上限数字;
- 我的样本外是哪一段,从哪天到哪天。
写完再开始。这四行的作用不是约束 AI,是约束你自己——当判定标准写在动手之前,你就没法在看到结果之后偷偷把标准挪一挪。
动作二:给对话编号记账。
准备一个最简单的表,四列就够:编号、这一轮改了什么、样本内成绩、我当时觉得为什么该这么改。每问一轮记一行。
这件事无聊到你一定会想跳过。但它是整套方法的核心:记账的唯一目的,就是让你在最后看到那条漂亮曲线时,同时看到「37」这个数字。 一条从 37 次尝试里挑出来的最佳曲线,和一条第一次跑就长这样的曲线,是完全不同的两样东西——即使它们看起来一模一样。
动作三:跑一次变体离散度自测。
这个动作能把「你选的是规律还是噪音」直接摆到眼前,做法是:让 AI 就同一个想法生成十几个近亲变体(改改周期、改改阈值、换个类似的指标),然后全部跑一遍,全部保留成绩,不许只看最好的那个。
然后看两个数:最好的那个成绩,和这一堆成绩的中位数。
- 如果最好的那个远远甩开中位数,那说明这个成绩高度依赖某几个具体取值——换句话说,你选中的很可能是这段历史里的偶然,而不是一条稳健的规律。
- 如果这一堆变体的成绩都差不多,虽然没那么惊艳,反而更值得继续研究——因为它说明规律不挑参数。
冠军的绝对成绩没有意义,冠军和全体的差距才有意义。 这也是前面那句「换个随机种子冠军就换人」的实操版。
动作四:把 AI 从发明家换成质检员。
前三个动作都是防守。这一个是把它用对地方。
让 AI 生成策略,它给你的是「像样的东西」,而像样正是你最难识别的陷阱。反过来用——把你已经做出来的东西丢给它,让它扮演一个刻薄的审稿人:这套逻辑里哪一步可能用到了未来信息?这个结论换一段行情还成立吗?我这个样本外的划分方式有什么问题?它这时候产出的是问题清单,而问题清单错了你一眼能看出来,结论错了你看不出来。
这套角色分工怎么固化成流程,AI 在投研里该扮演什么角色 讲得更细;本卷里还有一节专门列它真正擅长的那几件事,可以配着看。至于回测和实盘之间还有哪些跟 AI 无关的机制差异,回测好看实盘亏,差的到底是哪三件事 是正主。
特别提醒一类东西:市面上打着「AI 智能选股」「大模型策略」旗号、直接展示一条漂亮历史曲线来招揽用户的服务。按本节的框架去问它一个问题就够了——这条曲线是从多少个方案里挑出来的? 答不上来、或者顾左右而言他的,这条曲线就没有说服力。本站所有内容只讲原理与方法,不推荐任何标的,不构成投资建议,也不保证任何收益,完整边界见 免责声明。
小结
- 试错成本趋近于零之后,「找到一条好看的历史曲线」从不容易变成了几乎必然。锁的难度没变,变的只是试的速度——而试的速度恰恰是判断结果值不值钱的唯一线索。
- 数据窥探不是 AI 带来的新问题,AI 只是把它的量级抬高了好几个数量级。参数寻优还被关在同一个骨架里,AI 帮你换的是整副骨架。
- 分母有三份藏在你看不见的地方:蒸发在对话记录里的那三十几个被否想法;AI 的建议本身就是别人筛选过的冠军名单;训练语料覆盖了你要回测的那段历史,建议里带着后见之明。
- 样本外只能用一次,而对话是有记忆的。把样本外的成绩说给它听,这份数据当场作废。
- AI 写的回测代码,「看着挺对」正是它最擅长制造的东西,必须过机器检测不能只过肉眼;最土的办法是把数据末尾砍掉一段重跑,看已经过去那部分的信号有没有变。
- 四个动作把分母拿回来:开工前写死判定标准、给每轮对话编号记账、跑变体离散度自测(看冠军和中位数的差距而不是冠军的绝对值)、把 AI 从发明家换成质检员。
一句话总结:机器帮你试得快,不等于你想得对;那条曲线好不好看,取决于你为了挑出它扔掉了多少条——而这个数,只有你自己能记。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。