☰
AI因子造假识别与过拟合排查:量化策略验证全流程
2026/11/2 19:58:42 网站建设 项目流程

最近社群里的画风变得很快。以前大家问的是“这个策略回测怎么样”,现在直接变成“我用AI批量生成了几十个因子,回测年化百分之两三百,能不能直接用”。老实说,看到这类问题我第一反应不是兴奋,而是先把放大镜找出来。AI批量生成因子和策略这件事,本质上把“生产端”变成了无限火力,但“质检端”却常常是零。判断AI生成的因子和策略是否造假、是否过拟合,已经不是可选项,而是这个阶段做量化交易的核心生存技能。

我写这个系列到第四十九篇,前面聊过回测框架、交易成本、资金管理,唯独没有专门聊过“怎么审一个AI策略”。今天补上。这篇不打算给你什么花哨的指标公式,而是把我在实际核查AI因子时用的那套流程完整拆开:造假有哪些常见马甲、过拟合怎么在回测里伪装成稳健、拿到一个AI策略后应该按什么顺序检查。零基础也能跟上,但如果你已经写过几年策略,里面的排查思路同样值得过一遍。

1. 为什么AI生成的因子特别容易出问题

AI生成因子的逻辑,本质是在一个巨大的搜索空间里找“统计上显著”的模式。这个能力既是优点,也是麻烦的来源。你得先理解麻烦在哪,才会对接下来要讲的造假和过拟合有切身体感。

1.1 生成成本归零带来的数量幻觉

以前人工挖因子,一个人一个月能认真打磨三五个,每个都反复验证过逻辑。AI挖因子,几分钟给你吐几十上百个,回测结果一个比一个漂亮。很多人拿到手就飘了:这么多策略,总有几个能赚钱吧?

问题恰恰出在这。当你同时测试几百上千个因子时,概率法则就开始跟你开玩笑了。我们做个简单估算:假设某个市场上,一个纯随机噪声因子,在单次回测中有5%的概率看起来“显著有效”(这已经算保守了)。那你测试200个纯噪声因子,预期就会有大约10个因子通过各种显著性检验,回测曲线漂亮得像精心设计的一样。你以为是挖到金矿,其实只是运气在大样本下的必然显现。

这就是所谓的数据挖掘偏误。人工挖因子时样本量小,不小心撞上显著的概率低;AI挖因子时假设检验被重复成百上千次,几乎必然会出现一批“假阳性”。数量幻觉的可怕之处在于,它让你误以为“挖得多=希望大”,实际上挖得越多,需要修正的置信度门槛就越高。

1.2 AI没有交易常识,只有统计相关性

另一个核心问题是,AI模型在生成因子时,脑子里其实没有“交易”这回事。它不知道什么是涨跌停、什么是停牌、什么是集合竞价,也不理解为什么高换手率在实盘里会带来严重的冲击成本。它只知道某个特征序列和历史收益率之间存在相关性。

相关性并不等于因果,更不等于可交易的逻辑。我见过AI生成的因子里有一种:用“个股过去5个交易日中,名称中含某个行业关键词的股票的收益率均值”作为因子。在特定时间段内,它回测时表现极好,因为那段时间该行业正好有题材炒作。但把时间轴拉长,这因子完全不稳定。AI不在乎这些,它只是从数据里挖到了一个短暂成立的相关性。

这引出一个重要结论:AI生成的因子只解决了“找规律”这一步,而“规律是否可交易、为何有效、何时失效”这些问题,AI一概不负责。如果人也不负责,那这个策略就是个没有地基的房子。所以我经常说,拿到AI策略先别急着看曲线,先让它解释这个因子背后的交易逻辑。如果解释不了,大概率是统计噪声或者数据陷阱。

1.3 核查成本远高于生成成本,这是不对等的博弈

AI生成一个策略可能只要30秒,但你完整核查这个策略可能要三天。这个成本不对称,导致很多人偷懒跳过质检。跳过质检最直接的后果,就是把一个隐藏着未来函数或数据泄漏的策略直接推进实盘。

更麻烦的是,AI生成过程本身是黑盒。人可以通过有限次数生成大量策略,但很难从生成过程本身保证质量。这就像你请了一个每小时写100份简历的求职者,简历上的项目经历看起来都很唬人,但每份简历都可能是拼凑和夸大。你雇人之前总要背调一下吧?量化策略比简历更需要背调,因为它用的不是你的钱,是系统的钱。

我个人的态度是:AI生成因子完全可以用来做线索和灵感,但在它通过完整的验证流程之前,都不算“策略”,只算“素材”。下面这些判断方法,就是把素材变成合格策略的质检工序。

2. 造假因子的四种马甲,先学会看病历再看病

“造假”这个词听起来像是故意为之,但实际工作中,绝大多数数据问题不是AI故意骗你,而是它的代码生成逻辑里藏着漏洞。我把常见的造假分为四类:数据泄漏、未来函数、幸存者偏差、伪逻辑因子。这四种问题的本质都是“信息被偷渡了”,只是偷渡方式各不相同。

2.1 数据泄漏:训练集和测试集的边界被污染

数据泄漏是AI因子里最常见的造假形式,没有之一。它的核心特征是:你在训练模型或计算因子时,使用了本不该在那个时间点知道的信息。

最常见的泄漏渠道有三个。第一,特征预处理时用了全样本统计量,比如你先对全部数据做标准化,再切训练集和测试集,那测试集已经被训练集的数据信息污染了,回测结果必然偏乐观。第二,用未来数据生成特征,比如用“下一周收益率”来训练模型,但在特征中也包含了一些未来区间的计算值,等于让模型参考答案写作业。第三,样本重叠,训练期和测试期有交叠,模型“见过”的行情在测试里又出现了一次。

判断数据泄漏有个非常简单的方法:把因子值的时间戳和标签(未来收益率)的时间戳画在一条时间轴上,看因子生效的最晚时点是否早于标签的起点。如果因子在t日已经包含了t+1日的信息,哪怕只有一点点,回测结果都会被系统性抬高。AI生成代码时尤其容易在这类时间对齐操作上犯错,因为它经常把reset_index和shift用得很爽,但没人检查对齐之后错位了多少。

2.2 未来函数:看起来代码没问题,但成交价和信号不同步

未来函数和数据泄漏的差别在于,数据泄漏通常发生在训练和标签层面,未来函数通常发生在交易执行层面。它指的是策略在回测中使用了“当时无法得知”的信息,最典型的就是信号计算和成交价使用了同一根K线的收盘价。

比如一个AI写出的日内策略:用当日收盘价计算信号,然后假设以当日收盘价成交,次日卖出。这在回测软件里看起来很正常,但实盘中你按收盘价成交需要提前下单,等你看到收盘价时下单,成交的已经是下一根K线的价格了。典型的表现就是回测中年化收益很高,但每次成交价都恰好比最优价差一点点。

另一个隐蔽的未来函数是用shift(-1)把未来数据拉回来。AI在写pandas代码时特别喜欢用负向位移,因为这样代码看起来很干净。但没有严格的时间戳校验,shift(-1)很容易就变成“拿明天的数据算今天的信号”。识别方法很简单:在关键信号列上打印几行数据,人工检查t日信号对应的t+1日收益率,如果信号里包含t+1日的任何价格信息,直接判死刑。

2.3 幸存者偏差:股票池本身就是被选过的

幸存者偏差属于“数据层面静悄悄的造假”。AI在生成因子时,如果拿到的股票池只包含今天还在上市交易的股票,那么历史上那些退市的、被ST的股票就从头到尾不在样本里。这意味着模型只学习了“活下来”的股票特征,天然会偏好那些后来大涨的公司。

举例说明。假设你在2015年用AI挖了一个“小市值因子”,只选了当时存活的股票做测试,这个因子回测收益会非常好——因为退市的股票已经被剔除,剩下的都是被爆炒过的,看起来小市值总能超额收益。但如果你把2015年所有股票(包括2016、2017年退市的)都放进去,这个小市值因子的收益会大幅缩水,因为很多退市股票恰恰是小市值。

解决幸存者偏差的方法不复杂,但要花点功夫:使用point-in-time数据,也就是每一期只用当时实际存在的股票池。国内很多免费数据源不提供这种历史快照,需要自己定期备份。我通常会至少准备一套“带退市股票”的数据做交叉验证,考察同一AI因子在含退市样本和不含退市样本下的表现差异。如果差异巨大,这个因子基本不能信。

2.4 伪逻辑因子:相关性被包装成因果性

第四种是比较“软性”的造假,代码没问题,数据没问题,但逻辑站不住脚。AI经常会生成一些在统计上显著、但没有任何交易逻辑支撑的因子,我把它们叫“伪逻辑因子”。

举个例子。某段时间AI可能发现一个规律:股票代码尾号为8的股票,月平均收益率偏高。如果在回测期内恰好有几次并购重组发生在代码尾号为8的公司上,这个因子在数据里就会表现出收益增强。但它的底层驱动其实是那些公司自身的重组事件,而不是代码尾号为8这件事。AI不懂这些,它只看到相关。

判断伪逻辑因子的一个直接方法是做时段稳定性测试:把同样因子在不同市场风格下分别回测,比如2017年大盘蓝筹行情、2021年新能源行情、2023年AI行情。如果因子只在一类行情里有效,在其他时段完全失效,那它大概率只是某段行情的投影。真正有逻辑的因子,即使收益衰减,也很少会从一个极端直接翻到另一个极端。

提示:不要要求AI因子在每个时段都赚大钱,那不现实。但如果某因子只在某一段特定行情里爆发,而你正好用那一段行情来做回测,那它就是在假装优秀。

3. 过拟合的解剖:从样本内到样本外的“第五次说谎”

如果说造假是“数据在说谎”,那过拟合就是“统计在说谎”。造假还分善意恶意,过拟合则完全是无意识的欺骗,它比造假更难识别,因为回测曲线不会骗你——骗你的是你对这条曲线的解释。

3.1 过拟合的本质:记住行情,而不是理解行情

过拟合的本质是模型把训练数据里的噪声当成了规律。用大白话说,模型不是学会了“什么情况下股票会涨”,而是背下了“过去哪几天股票涨了”。AI生成策略时,模型复杂度高、参数多、搜索空间大,天然容易走向过拟合。

拿深度学习模型举例。一个只有两三个参数的小模型,想记住复杂历史走势很难,所以它只能学到粗糙规律,泛化能力反而强。而AI搜索过程中,可能会自动尝试几百组参数组合,最终挑出在历史上表现最好的那一组。这组参数可能只是对过去几段特定行情做了深度记忆,一旦行情节奏切换,立刻失效。

这里有个方便判断的经验法则:如果策略参数有30个以上,训练数据只有几百个交易日,那每个参数平均只有十几个样本点来支撑,过拟合几乎是必然的。不要相信“参数多但表现依然很好”的回测,参数越多,样本内表现好就越不值得惊讶。

3.2 参数敏感性测试:戳破“完美参数”的伪装

识别过拟合最直接的工具,不是看样本外收益,而是参数敏感性测试。原理很简单:一个真正有效的策略,在参数小幅偏离最优值时,表现应当相对平滑;而过拟合策略的参数就像站在刀刃上,稍微偏一点就崩盘。

操作上,选定策略的核心参数(比如均线周期的长短、RSI的阈值、持仓周期等),在最优参数基础上上下浮动10%、20%、30%,分别记录回测的收益、最大回撤和夏普比率。如果收益率呈现悬崖式崩塌,比如最优参数年化50%,参数变化5%后年化变成-10%,那这个参数就是过拟合出来的伪参数,没有任何可靠性。

我自己一般会把结果整理成表格来观察:

参数偏移幅度年化收益最大回撤夏普比率结论
最优参数52.3%18.6%1.62基准
-10%44.1%20.3%1.31可接受
-20%25.7%28.9%0.87明显衰减
+10%40.8%21.1%1.18可接受
+20%-8.3%35.7%-0.24失效

如果只有最优参数附近表现好,上下浮动20%就亏损,那这个策略基本是废的。真正值得实盘的策略,参数变化20%-30%后收益会衰减,但不会直接崩溃。

3.3 交叉验证的量化陷阱:时间序列不能随机切

很多人拿到AI策略后会做交叉验证,但直接用机器学习里的K-Fold随机切分来做时间序列数据,本身就是个大坑。K-Fold随机切分假设样本之间相互独立,但股票数据是强序列相关的,今天的价格和明天的价格高度相关。随机切分会把未来数据混到训练集里,模型在训练时已经偷看到了未来一段行情,测试结果自然虚高。

正确做法是使用时间序列交叉验证,比如Expanding Window(不断扩展训练窗口)或Rolling Window(滚动窗口)。每次训练时只用过去的数据,测试时只用未来的数据,保证信息严格单向流动。我建议在验证AI因子时,至少做一次“训练集截止到2020年、测试集2021-2024年”的切分测试。如果AI因子训练时是2023年才发布的数据,那你还需要特别注意,因子生成时是否已经包含2023年数据的统计信息——这也是时间泄漏的常见形式。

3.4 Walk-forward分析的完整操作思路

比一次性切分更严格的是Walk-forward Analysis,也就是滚动样本外测试。简单说,就是把时间轴分成很多段,每段先用前面的数据训练,再对后面一段做样本外测试,然后窗口向前滚动,重复这个过程。

我用一个简化流程来说明:

  1. 把2018-2024年数据按月分成训练窗口和测试窗口,比如训练窗口36个月,测试窗口6个月。
  2. 从2018-2020年训练模型,在2021年上半年测试。
  3. 窗口向前滚动6个月,变成2018年6月-2021年6月训练,在2021年下半年测试。
  4. 不断重复,直到覆盖完所有数据。

这样会得到一系列连续样本外区间的收益记录。如果这些区间的收益整体为正,且大多数区间收益与样本内同级别(允许一定衰减),那这个策略才算初步扛过了过拟合审查。如果只有一两个区间贡献了全部收益,其他区间都在亏损,那就是典型的靠运气吃饭,不能要。

提示:样本外收益衰减多少算正常?按照我的经验,样本外相对样本内衰减20%-30%是正常的,毕竟是不同时间段,行情总有差异。但如果衰减超过50%,那基本可以断定原来的“优秀”有一大半来自过拟合。

4. 一套可以落地的验证流程:从拿到因子到实盘

判断造假和过拟合,不应该靠某一个指标,而应该走一套完整的质检流水线。下面这套流程是我每次拿到AI生成的因子后都会执行的标准步骤,顺序很重要,每一步都比上一步更耗时间,但也更接近实盘真相。

4.1 第一步:静态逻辑审查,先看代码再看曲线

无论AI把回测曲线吹得多漂亮,拿到的第一件事永远是打开代码看逻辑,不是看净值曲线。有经验的策略研究员都明白,曲线是可以被各种手段美化出来的,但代码逻辑里的问题一定会在某个细节里暴露。

静态审查重点看三个方面。第一,数据对齐:因子值计算时是否使用了shift(-1)、iloc[i+1]等未来索引;是否用了未来区间的全局统计量做标准化。第二,标签构造:训练标签是否是“未来N日收益”,且因子计算的最晚时间点是否早于标签起始点。第三,成交假设:回测里信号价与成交价是否在同一根K线上,是否忽略了涨跌停无法成交的情况,是否假设了无限流动性。

这一步不需要跑任何代码,纯靠读代码就能筛掉一大批问题因子。如果AI生成的代码你读不懂,那就先让它拆解成最小逻辑单元,每一项都要给你讲明白。讲不明白的,默认有问题。

4.2 第二步:极端场景样本外测试,专挑市场不高兴的时候测

逻辑审查通过后,很多AI因子在正常样本外测试也能看,但一到极端行情就原形毕露。所以我在第二步会专门把因子丢到几个“不愉快的行情切片”里做测试。

怎么切时间点有点讲究。尽量选择包含大幅下跌、流动性枯竭、风格剧烈切换的时段。国内市场上可以参考几个典型区间:2015年下半年股灾和流动性危机、2016年初熔断、2018年全年单边下行、2020年疫情冲击、2024年初小微盘流动性危机。把AI因子在这些区间内单独回测,观察它是否出现极端回撤或收益崩塌。

真正有逻辑的因子,在极端行情下会受伤,但不会莫名其妙地出现反逻辑的收益来源。比如一个“低波动”因子,在2024年初小微盘崩盘时回撤大很正常,因为小盘低波动股票正是流动性危机的重灾区。但一个“动量”因子如果在这种行情里反而暴涨,那就要怀疑它是不是在做空波动率——这种风险收益特征在回测里看着爽,实盘里遇到尾部风险会直接扛不住。

4.3 第三步:多空对比与交易成本压力测试

很多AI因子只做了单边做多的回测,这掩盖了一个核心问题:它的超额收益到底来自选股能力,还是来自市场整体上涨?区分方法就是做多空对比。

具体操作是:把AI因子分为多头组合(因子值最高的一组)和空头组合(因子值最低的一组),分别回测。然后看三样东西:多头收益是否明显跑赢基准、空头收益是否明显跑输基准、多空价差曲线是否平滑。如果多头和空头差不多,那说明因子只是Beta的镜像,没有真正的Alpha。如果多头收益高但空头不跌,因子可能只是在暴露风格偏配,而非有效选股。

紧接着做交易成本压力测试。AI因子很容易在回测里隐藏过高的换手率。你把佣金调成单边万三、印花税千一、滑点成交价偏移一个最小变动价位,再回测一遍。如果策略收益从年化50%掉到年化5%,那它实盘基本没有可操作性。这里我额外提一点:回测软件里的滑点参数设置往往偏乐观,实盘里小盘股的冲击成本和延时远大于你的设置,建议至少按回测滑点的两倍再做一次压力测试。

4.4 第四步:部署前的模拟盘与因子监控记录

经过前三步仍然“活下来”的AI因子,数量大概会从你最初的几十个变成两三个。这时候再进入实盘前的最后一关:模拟盘记录和实时因子监控。

不要急着投钱,先用模拟盘跑至少一个完整月,并记录因子每天的IC值。IC就是因子值与未来收益的相关系数,是衡量因子预测能力的核心指标。计算方式上,每天计算因子值与次日或未来N日收益的Spearman秩相关,然后看均值、标准差和ICIR。回测期与模拟盘期的IC均值对比非常关键。如果模拟盘IC均值远低于回测期,衰减超过30%,说明因子的有效性在当下市场环境里已经大打折扣。

模拟盘期间还要看因子是否出现“脏数据污染”,比如停牌股没有剔除、ST股混入股票池、新股上市前几日被纳入导致价格异常。这部分没有捷径,只能靠每天的日志和报表盯。个人经验是,模拟盘跑满20个交易日以上且因子IC稳定为正,才具备实盘小仓位的资格;只跑一两周就急着上的,都是赌徒心理。

我还会在部署前建立一份“因子出生证”,记录几个关键信息:因子生成日期、训练数据截止日期、数据快照版本、参数选择过程、样本外测试区间、模拟盘启动时间。这份出生证是以后回溯策略问题的关键——等因子失效时,你能知道它是在什么数据上被发现的、当时验证到了哪一步、现在偏离了多少。没有出生证的因子,就像没有疫苗记录的宠物,出了事你连该怀疑哪一环都不知道。

5. 我踩过的坑:回测曲线越漂亮越要警惕

最后这部分,讲几个真实的踩坑记录。这些坑我在过去几年里都切切实实踩过,也为此交过学费。拿出来说,是希望你在AI因子这条路上少走我走过的弯路。

5.1 年化500%的因子,三个星期后归零

那是2022年底,一个朋友拿了个AI生成的日内策略给我看,回测年化超过500%,最大回撤不到5%。曲线几乎90度向上,堪称完美。我静态审查代码时发现,策略在t日收盘时产生信号,同时就以t日收盘价成交,没有考虑信号产生和成交之间的时滞。朋友觉得就差那么几个点无所谓,结果实盘三个星期,不仅没有500%的收益,反而亏了十几个点。

问题恰恰出在那个“差几个点”上。高频或日内策略对成交价格的敏感性是数学级的——信号价和成交价的偏差只要超过0.5%,高频策略的收益就很容易被吃掉。回测里看起来只差几个最小变动价位,实盘里可能是完全不同的世界。

5.2 换手率被低估的代价

另一个AI因子,回测换手率显示月均换手在30%左右,算上佣金和滑点后还有不错的收益。上线后我发现实际成交过程中的冲击成本远高于回测假设。原因是AI因子选出来的股票集中在小市值范围,这些股票流动性本身就很差,每笔成交都会推动价格向不利方向移动。回测软件里设的固定滑点,忽略了“策略在买的时候别人也在买”的反馈效应。

这事给我的教训是:回测里的换手率需要叠加一个“流动性系数”来看。如果因子持仓集中在成交额排名后20%的股票,无论AI把逻辑包装得多完美,我都建议直接降低仓位上限,或者干脆不用。策略的账面收益永远不等于实际收益,中间的差额就叫交易摩擦,AI不告诉你摩擦多大,但你的账户会把真实的摩擦给你看。

5.3 关于“AI自动挖因子”的个人建议

经历这些之后,我现在的态度很明确:AI挖因子可以,但要把AI当作一个“能力极强、经验为零、毫无羞耻心”的实习生。它可以在几小时内完成一个人几周的工作量,但它完全不知道什么是合理的,什么是瞎编的。如果你不设质检流程,它就会源源不断地给你制造“听起来很美”的垃圾。

给自己定两条铁律。第一条,所有AI因子在通过完整质检前,一律不算策略,只算素材。第二条,如果一个AI因子的回测收益超过你熟悉的同类人工因子两倍以上,请默认它有问题,先去证明它有问题,再考虑它是不是天才之作。好消息是,证明它有问题通常比证明它有效快得多。

落实到日常操作,我习惯把AI生成的因子分门别类放进一个“因子库”目录,后备注生成日期和数据快照版本,每次只挑最有机会的1到2个走完整验证流程,绝不批量上马。宁可错过十个好因子,也不要踩中一个坏因子——在量化这个领域,踩中一个坏因子的成本往往需要几十个好因子才能弥补回来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询