← 返回首页

我让AI审查我写了两年的回测代码,它揪出4个未来函数:那个'年化30%'的策略当场社死

💤 小Q · 2026-10-12 · AI+理财

一切始于一个对不上的数字

我的回测框架是自己从零写的,跑了两年多,回测过不下40个策略。一直有个现象让我隐隐不舒服:回测和实盘之间总隔着一条跨不过去的鸿沟。 最典型的一个:一个基于行业动量+基本面过滤的策略,回测年化30%,最大回撤12%,夏普1.8。我满怀信心上了实盘,9个月下来年化只有9%左右。之前我一直用'市场环境变了''成本没算够'来解释,直到上次写过成本压力测试那篇文章后,成本解释不通了——扣完成本回测还有22%,实盘依然只有9%。 剩下的13%去哪了? 正好那阵子在折腾大模型,我突发奇想:把回测框架的代码整个喂给AI,让它当一次代码审计员,专门找一种东西——未来函数,也就是那些'偷看了未来数据'的bug。 结果它20分钟干的事,让我冷汗下来了。

AI揪出的4个bug,一个比一个丢人

Bug 1:用当日收盘价生成当日信号(最经典,最丢人)

我的动量信号是这么写的:`signal = close.pct_change(20) > 0.05`,然后当天的调仓就按这个signal执行。 问题在哪?20日涨幅是拿当天收盘价算的。可当天收盘价出来的时候,今天的交易早就结束了。相当于我知道了今天收盘价,再回头决定今天买不买——标准的未来函数。 正确写法应该是信号滞后一天:今天的信号,明天执行。

Bug 2:财报数据的'时间旅行'

基本面过滤用了ROE和营收增速,我是直接拿财报数据按报告期对齐的。但AI指出:年报的报告期是12月31日,可披露日期可能是次年4月底。 我在1月份的回测里用上了'去年年报'的数据——那时候年报还没披露,市场还不知道。 等于我在用信息差做回测,全市场只有上帝和我知道这家公司年报长什么样。

Bug 3:停牌股'穿越'成交

回测里遇到停牌,我的框架会自动用'前收盘价'成交。听起来合理?AI一句话点破:现实中你根本买不到一只停牌的股票。 我的策略因为动量强,偏偏最爱选中停牌前暴涨的票。回测里它们被'幸运地'买到了,实盘里下单直接废单。这一条不仅虚增收益,还系统性地偏袒了我的策略。

Bug 4:股票池的幸存者偏差

我用的是'当前上市的股票列表'往前回测。那些中途退市、被吸收合并的票,压根不在我的股票池里。AI提醒:动量策略恰恰容易选中那种'涨着涨着突然暴雷退市'的票,把退市股排除掉,等于把策略最惨的死法从样本里删掉了。

修完重跑:从30%到11%,我居然松了口气

四个bug全修掉之后,我把那个'年化30%'的策略重新回测了一遍:
  • 年化收益:30% → 11.4%
  • 最大回撤:12% → 19%
  • 夏普比率:1.8 → 0.9
  • 年化直接砍掉三分之二。但神奇的是,我的第一反应不是沮丧,是松了口气——因为修完之后,回测的11.4%和实盘的9%,终于能对上号了。(剩下的差距基本就是交易成本和执行滑点。) 这比我过去两年无数个深夜对着'回测30%、实盘9%'抓头发的感觉好太多了。数字难看不要紧,数字诚实才是回测存在的意义。

    这次审计教我的三件事

    第一,未来函数极少是'不知道',几乎全是'没想到'。 我当然知道不能用未来数据,教科书第一章就讲了。但真到自己写代码,`shift(1)`忘写、日期对齐想当然,bug就藏在每个'我觉得这里应该没问题'的角落。知识和执行之间隔着的,是代码评审。 第二,AI干这活儿比我想象的强,但要用对姿势。 我不是让它'帮我看看代码有没有问题'——那样它只会夸你写得整洁。我的prompt是让它扮演一个专门找未来函数的审计员,逐行列出'这行代码在实盘中能否用当天之前的信息复现',并要求每一条都给出证据链。角色限定+逐行过+要证据,它才能把那4个bug全挖出来。 第三,回测虚高的代价不是'回测不准',是错误的仓位。 这是我最想强调的。如果我一直按'年化30%、回撤12%'的假数据给策略配仓位,遇到真实回撤19%时,我很可能中途崩溃式减仓,把一个其实能赚钱的策略拿到腰斩。回测撒谎的真正杀伤力,在于它让你对真实风险的准备完全错误。

    给同样自己写回测的朋友

    如果你也是自己撸回测框架的,强烈建议把代码喂给AI做一次'未来函数专项审计'。几个实操建议: 1. 分块喂,别一次全喂。 按数据加载、信号生成、撮合执行、绩效计算拆开,每块单独过,发现的问题更细。 2. 重点审三个地方: 信号和成交的时间对齐、财报/事件数据的实际可得日期、股票池的构建方式。这仨是未来函数的重灾区。 3. 修完后做一次'现实性对账': 修好的回测和实盘差距如果还在3%以内,说明框架基本诚实了;如果仍然对不上,继续审。 最后说个后怕的事:审计完当晚,我把另外3个在跑的策略也重测了一遍,又有一个掉了一个台阶。那天晚上我把所有策略仓位按新数据重新算了一遍,主动降了两成。 亏吗?不亏。回测可以骗我,实盘不会。早一天让回测诚实,就早一天不用拿真金白银去交学费。 我的回测框架跑了两年才做这次审计,你如果也是自己写的——现在就去。
    AI+理财大模型应用回测审计未来函数Python实战代码审查量化交易小Q风格2026年10月