我零经验参加量化金融挑战赛,靠 AI 完成训练、提交和审计。Codex 工程扎实,却一直沿用我误设的限制;换用 Claude Code 后,约20分钟发现2022年也可训练,带来最大提升。最终私榜11/90,赛道第二,获200元奖金。复盘发现,真正差距是样本外 RankIC 的稳健性,不是反复折腾的 IR 技巧。下次要先对齐评测、复审规则、及时止损。AI 能高效执行,但方向和取舍仍得自己定。
10 月初,我参加了学校举办的量化金融挑战赛(CSI300 Challenge 2026):每天给沪深 300 的 300 只成分股打分,比谁排得准。我之前完全没有量化比赛的经验,所以只能依靠 AI 助手:我提需求、拍板、追问,审题、训练、打包、提交都由 AI 完成,也就是 vibe coding,我自己顺便把里面的知识学一遍。前期用的是 Codex,成绩一直上不去;后期换成 Claude Code,约 20 分钟就找到了整场比赛最大的提升。
这篇文章由 AI 根据我的会话记录和项目文档整理,数字来自这些记录;下面是比赛结束后的复盘:做了什么,学到了什么,哪里走了弯路,最后说说结果。
第三,本地验证是校准的。“训练截止提前一年、两年”的长间隔测试预测 IC 约 0.077 和 0.069;公榜实际 0.0773,私榜 0.0708,量级对得上。选模型靠这套验证、不靠公榜,这个做法没有被带偏。
边做边学
我对量化几乎没有基础,学东西的办法很朴素:让 AI 去做,再追着问。每次它给出结论,我就问“为什么”“会不会是过拟合”“公榜和私榜是不是相似”,它会拿数据回答,我再让另一个助手去审。这样下来,我大致弄明白了几件事。
怎么判断一个模型好不好。本地要用前向验证:训练到上一年,测下一年,不能拿训练过的年份算分。公榜只能当核对,因为它的噪声很大:按 AI 的估算,公榜这一小段时期的 RankIC 标准误约 ±0.01,IR 约 ±1.4,几个点的差距分不清是实力还是运气;提交很多次、每次挑最高的人,还会被选择效应抬高。
怎么判断“涨了”是不是真的。任何一次提升,先问它有没有偷看未来,比赛里那两次泄漏就是这样查出来的。再往后一步是看它在新时期还能不能成立:私榜是更靠后的另一段数据,模型不会再更新,所以长间隔测试里的衰减比本地分数更重要。这些理解主要来自 AI 的解释和这次的实验结果,我没有系统学过,细节上可能还有不准确的地方。
别把鸡蛋放在一个篮子里,也别想当然地认为同类服务差不多。以前我觉得 ChatGPT Plus 和同类订阅相差不大,用 ChatGPT 就够了。这次的体感完全不同:Codex 这边,20 美元的 Plus 对这种高强度的用法几乎没法用,两个账号轮流也不够,开了 100 美元的 Pro 连跑一两天仍然没有效果;而 Claude Code 我只用了 20 美元的 Pro,额度却几乎和那个 100 美元的 Pro 相差不大,体验又快又准。这只是我这一次的使用感受,模型和套餐都在变,但它让我明白:卡住的时候,应该多换几个工具试试,而不是在一个上死磕。
本机回测没有对齐平台。Codex 线的回测还是早期的代理设置(持仓数、约束、成本都和官方不同),算出的 IR 和平台没法比,赛后看冠军代码才发现。冠军本地 IR 约 5.2,公榜 5.57、私榜 5.21,彼此吻合,因为他把官方示例约束和成本照搬进了本地回测。下次第一周就该复刻评测,本地 IR 对不上平台之前,不优化 IR。
在已经饱和的方向上堆变体,还把力气花错了地方。近百个变体和上百个超参试验都落在噪声里,平滑、滞后带、粗分桶、中性化这些 IR 技巧折算后也是净持平或净亏,真正的差距却在 RankIC 的样本外衰减。冠军有效的是别的路子:冻结因子网络后,在同风格邻居里学相对强弱;再用最近 20 个已兑现标签现算一个闭式修正。两者都是针对“换时期”设计的。下次要把样本外衰减当主指标,长间隔验证做成常规,每个方向给固定预算,连续几次无增益就换赛道。
最大的一次提升来自撤掉自己设的限制,最大的一次认知修正来自赛后看私榜:真正的差距在样本外 RankIC 的稳健性,不在我花了很多精力的 IR 技巧。对一个没有经验的人来说,这场比赛最大的收获是学会了追问一个结果是不是真的:它有没有偷看未来,换了时期还能不能成立,是实力还是公榜上的运气。下次先对齐评测口径,盯紧规则,把力气放在“换了时期怎么不掉分”上。
10 月初,我参加了学校举办的量化金融挑战赛(CSI300 Challenge 2026):每天给沪深 300 的 300 只成分股打分,比谁排得准。我之前完全没有量化比赛的经验,所以只能依靠 AI 助手:我提需求、拍板、追问,审题、训练、打包、提交都由 AI 完成,也就是 vibe coding,我自己顺便把里面的知识学一遍。前期用的是 Codex,成绩一直上不去;后期换成 Claude Code,约 20 分钟就找到了整场比赛最大的提升。
这篇文章由 AI 根据我的会话记录和项目文档整理,数字来自这些记录;下面是比赛结束后的复盘:做了什么,学到了什么,哪里走了弯路,最后说说结果。
比赛怎么赛
规则不复杂:只能用官方给的 2016–2022 年三张表(行情、33 个因子、10 个 Barra 风格因子),不许引入外部数据;平台每天调用我提交的 predict,给最多 120 天的历史窗口,我给 300 只股票打分,再由官方回测库按约束构造组合。分数里 RankIC(每天打分与后续收益的秩相关)占 70%,IR(相对基准的超额收益除以跟踪误差)占 30%。
榜单分公榜和私榜,使用不同的隐藏区间,私榜只看最后一次提交;每天最多交 3 次,10 月 14 日截止。主办方还会抽查,用 train.py 从公开数据重训,对不上则成绩作废。
两周流水账
10 月初我用 Codex 审题。它把三份官方 PDF 读完,写成“审题记录”,我又让它建了 AGENTS.md 立规矩:用“训练到上一年、测下一年”的前向验证选模型,不围着公榜调参。我还额外规定 2022 年不参与训练、留作测试,这条后来证明是错的。
接下来几天是 Codex 阶段。它的工程化很扎实:实验登记、回测、打包、验收,最终攒下近 200 个实验目录、1239 次回测、354 份分析文档。成绩却一直不理想:第一次提交 RankIC 0.0495、IR 0.74,排 87/104,之后也没有明显起色。
额度也是个问题。我本来有两个 Codex(ChatGPT Plus)账号轮流跑,因为一个完全不够;后来发现两个也不够,只好又开了一个每月 100 美元的 Pro,连着跑了一两天,没停过,却一点效果都没有,相当失望。那段时间 ChatGPT 的模型还特别慢,输出速度(tps)有问题,更拖后腿。
实在没办法,10 月 9 日我想换成 Claude Code 试试,让它对照官方原文做一次合规检查。约 20 分钟,它就发现:官方明确允许用 2016–2022 全部数据训练,“2022 年关闭”只是我自己写进 AGENTS.md 的限制。补上之后,同样的配方公榜 RankIC 从约 0.054 涨到约 0.073。这是整场比赛最大的一次提升,没用任何新技术,只是撤掉了一条自己设的限制。之后的训练(LightGBM 和 CatBoost 集成)、验收和最终提交的包,都在 Claude Code 里完成。
补上 2022 年后,集成的前向 IC 停在 0.0905 到 0.0915,再也上不去。最后几天我让 Claude Code 把能想到的方向都试了一遍,结果几乎都是无效或净亏:
试过的方向和结果(点开看)
中途有两处“涨了”其实是泄漏,都是 AI 自己查出来的:一个 GRU 融合的“+0.0025”,来自用了含测试期的全样本均值;数据里的“名称”列是最新名称,用它推 ST 状态属于前视,管线里从未使用。
提交上也有几件事。52 MB 左右的大包先后三次报 “judger stopped responding”,同一个文件重传就过,23 MB 以内的小包一次没失败。我还让 AI 做了慢信号占 30% 和 60% 的两个测试包,判据提交前就写好:60% 明显更差(IR 掉 0.94),30% 持平,结论是原包已是最优点。要提醒自己的是,私榜只看最后一次提交,测试之后必须把稳妥包重新传到最后。另外群里有人提议在 predict 里用窗口内已兑现的收益现算一个闭式岭回归,AI 按指南字面判断这属于“评测阶段重新 fit”,建议先要书面确认;离线测出的收益也很小(融合最多 +0.0005),就没做。
比赛结束后,我先清理了磁盘:删掉可再生的中间文件,项目从 67 GB 降到 26 GB,可复现所需的代码、配置和预测都留着。然后读了冠军开源的代码(CSI300-Challenge-2026),逐项对照我们差在哪。
成绩和差距
我的公榜是 RankIC 0.0773、IR 2.58,41/153;私榜 RankIC 0.0708、IR 4.37,11/90。冠军的私榜是 RankIC 0.0825、IR 5.21。两个榜人数不同,名次不能直接比,但有三件事值得记住。
第一,差距在 RankIC,不在 IR。我和冠军的私榜 Score 差 0.145,约 83% 来自 RankIC,只有约 17% 来自 IR,而我却花了很多精力在 IR 技巧上。公榜的 IR 噪声很大:我的 IR 从 2.58 涨到 4.37,冠军则从 5.57 降到 5.21,别人也常在两个榜之间变几个点。
第二,本地不输,输在“换了时期掉多少”。本地验证里我的 RankIC 约 0.092,冠军 0.0887,我不低。但从公榜到私榜,我衰减了约 8.4%,冠军只衰减约 2.9%。
第三,本地验证是校准的。“训练截止提前一年、两年”的长间隔测试预测 IC 约 0.077 和 0.069;公榜实际 0.0773,私榜 0.0708,量级对得上。选模型靠这套验证、不靠公榜,这个做法没有被带偏。
边做边学
我对量化几乎没有基础,学东西的办法很朴素:让 AI 去做,再追着问。每次它给出结论,我就问“为什么”“会不会是过拟合”“公榜和私榜是不是相似”,它会拿数据回答,我再让另一个助手去审。这样下来,我大致弄明白了几件事。
怎么判断一个模型好不好。本地要用前向验证:训练到上一年,测下一年,不能拿训练过的年份算分。公榜只能当核对,因为它的噪声很大:按 AI 的估算,公榜这一小段时期的 RankIC 标准误约 ±0.01,IR 约 ±1.4,几个点的差距分不清是实力还是运气;提交很多次、每次挑最高的人,还会被选择效应抬高。
怎么判断“涨了”是不是真的。任何一次提升,先问它有没有偷看未来,比赛里那两次泄漏就是这样查出来的。再往后一步是看它在新时期还能不能成立:私榜是更靠后的另一段数据,模型不会再更新,所以长间隔测试里的衰减比本地分数更重要。这些理解主要来自 AI 的解释和这次的实验结果,我没有系统学过,细节上可能还有不准确的地方。
别把鸡蛋放在一个篮子里,也别想当然地认为同类服务差不多。以前我觉得 ChatGPT Plus 和同类订阅相差不大,用 ChatGPT 就够了。这次的体感完全不同:Codex 这边,20 美元的 Plus 对这种高强度的用法几乎没法用,两个账号轮流也不够,开了 100 美元的 Pro 连跑一两天仍然没有效果;而 Claude Code 我只用了 20 美元的 Pro,额度却几乎和那个 100 美元的 Pro 相差不大,体验又快又准。这只是我这一次的使用感受,模型和套餐都在变,但它让我明白:卡住的时候,应该多换几个工具试试,而不是在一个上死磕。
复盘
先说做得不错的:选模型靠前向验证、留一年交叉和长间隔测试三层验证,不看公榜;任何“涨了”都先查有没有偷看测试期,两处泄漏就是这样抓出来的;测试包的判据提前写好,最终包也是提前定的,没有为了公榜好看去换;train.py 在本机独立复跑过,抽样日的预测逐值一致。
自己设的限制比规则更严。“2022 年不训练”让 Codex 阶段一直围着它做实验,晚了好几天才吃到最大的提升;发现时 AGENTS.md 里这条还写着,新会话会再次关闭 2022。下次自己定的规矩要写明理由和解除条件,每隔几天对照官方原文复审一遍:允许什么就用什么。
本机回测没有对齐平台。Codex 线的回测还是早期的代理设置(持仓数、约束、成本都和官方不同),算出的 IR 和平台没法比,赛后看冠军代码才发现。冠军本地 IR 约 5.2,公榜 5.57、私榜 5.21,彼此吻合,因为他把官方示例约束和成本照搬进了本地回测。下次第一周就该复刻评测,本地 IR 对不上平台之前,不优化 IR。
在已经饱和的方向上堆变体,还把力气花错了地方。近百个变体和上百个超参试验都落在噪声里,平滑、滞后带、粗分桶、中性化这些 IR 技巧折算后也是净持平或净亏,真正的差距却在 RankIC 的样本外衰减。冠军有效的是别的路子:冻结因子网络后,在同风格邻居里学相对强弱;再用最近 20 个已兑现标签现算一个闭式修正。两者都是针对“换时期”设计的。下次要把样本外衰减当主指标,长间隔验证做成常规,每个方向给固定预算,连续几次无增益就换赛道。
没有人盯规则澄清。闭式岭回归被我们搁置,而冠军引用了主办方的澄清并用上了,本地 RankIC 约 +0.004。它在私榜值多少我不确定,但这是一次因信息不对称错过的机会。下次官方群和官网每天看,口头澄清要求书面化,拿不准的先离线测增益。
工程上还有两个隐患。52 MB 的大包让平台失败三次,私榜评测若撞上瞬时故障后果最大,最终包应当更小,并提前备好轻量备用包。AGENTS.md 也涨到近 80 KB,新会话先读这些,既费上下文,又容易被过期条款误导,应该只留当前有效的条款。
如果只记三件事:先复刻评测口径;自己设的限制要对照原文复审;把力气放在“换了时期怎么不掉分”上。
关于 Vibe Coding
这两周我做的事主要是提需求、拍板和质疑:“你为什么不做?”“排名不够高怎么办?”“榜上靠前的会不会是过拟合?”剩下的都是 AI 在干。
Codex 和 Claude Code 在这次比赛里的表现差别很明显。Codex 的工程化很扎实,但它一直照着我写下的规矩办事,没有回头质疑“2022 年关闭”这条限制;Claude Code 则先读官方原文,再拿我自己的限制去对照,很快就找到了症结。当然,这只是一次比赛里的体验,两边接手的阶段、提示和上下文并不相同,不能当成两个工具的通用结论。我能确定的是:同一个问题,换一双眼睛、重新对照官方原文审一遍,比在原地继续加实验便宜得多。
总的来说,AI 擅长吞吐和纪律:大量实验、泄漏审计、预先写判据、复现验收,也会自己纠错。它不擅长在没人推的时候换赛道,容易在熟悉的模型家族里微调,对规则的解释偏保守,给出的概率也只能当粗估。方向、规则灰区碰不碰、什么时候止损、“别只追公榜”这类取舍,还是得人来定。让一个助手专门做审查和合规检查也很值,最大的那次提升就是这样查出来的。
最大的一次提升来自撤掉自己设的限制,最大的一次认知修正来自赛后看私榜:真正的差距在样本外 RankIC 的稳健性,不在我花了很多精力的 IR 技巧。对一个没有经验的人来说,这场比赛最大的收获是学会了追问一个结果是不是真的:它有没有偷看未来,换了时期还能不能成立,是实力还是公榜上的运气。下次先对齐评测口径,盯紧规则,把力气放在“换了时期怎么不掉分”上。
最后说说结果
比赛分三个赛道:信息学院学生、大一新生、非信息学院学生。我在非信息学院赛道,完整私榜上排第 11(共 90 人),赛道内第 2,拿到了 200 元奖金。赛道第一在完整私榜里只比我高一名;信息学院的同学我比不了,不过完整私榜上所有大一新生都在我后面。
说实话,运气不错。我在公榜上排得并不靠前,私榜才升上来,前面说过公榜的噪声很大,这里面有运气的成分。更让我感叹的是 AI 的强大:一个完全没有量化比赛经验的人,靠它做出了能和同榜选手竞争的东西,还顺便学了不少。奖金不多,但这次经历很有意义。