文章 / #076

12小时自动迭代年化14%:微软这套AI选股系统太完美了,直到我看到论文里那个细节

RD-Agent 真能自己挖因子,但同一份考卷看了四遍

你花了两周,试了三十几种选股公式。每条公式都要写成代码、接进历史数据、跑一遍回测看看过去十年效果怎么样。效果好的留着,效果差的丢掉,参数微调一下再跑一遍。两周下来,能用的就一两个。

如果有这样一个工具:你对它说「帮我找一些能预测股票涨跌的公式」,它自己提想法、自己写代码、自己接数据跑回测、自己从失败里学习。十二小时跑完一整轮。模型调用费不到 10 美元。

微软把它做出来了,叫 RD-Agent。论文已经被 NeurIPS 2025 接收。

然后我翻到了论文里的一个细节。越看越不对劲。

那个细节:同一份考卷,它看了四遍

论文里有一个细节,几乎所有转发和报道都没提。这套系统在自动优化的过程中,会把同一段历史数据反复拿来用——打分用它、排序用它、择优用它、下一轮迭代还是用它。打个不太精确但好懂的比方:你拿一份考卷反复测同一批学生,每次考完还告诉他们分数,让他们照着改答案。几十轮下来,分数肯定越来越高——但这不代表学生真的变聪明了。

量化圈子把这段历史数据叫 test 集。正常的用法是最后一次才看,像高考——考完交卷,看一眼分数就结束了。但在 RD-Agent 的工作流里,test 集在循环里被反复读了四遍:在上面算预测值、在上面算相关性分数、在上面跑模拟交易、然后把这些结果喂回系统让它决定下一轮往哪个方向优化。几十上百轮转下来,选出来的公式在这段 test 上好看,本质上是被这段数据反复筛出来的结果。

同一份考卷反复批

这不等于论文造假,也不等于代码偷看了未来数据。更准确的说法是:这套系统的公开实现,在设计上就没有把 test 封存起来当单次终裁——它被反复读了。

这不是 RD-Agent 一个项目的问题。自适应数据分析领域 2015 年就有过系统性的讨论——Cynthia Dwork 等人的 foundational paper 证明过,任何反复读取同一个 test 集来做模型选择和参数调优的过程,都会让 test 集上的分数系统性地偏乐观。你每读一次 test 的分数,就等于在那张卷子上抿了一笔。抿的次数多了,卷子上自然全是你的指纹。

先把这个最要紧的问题钉在这儿,回头看看这套系统本身。

它到底是个什么东西

RD-Agent 是一个通用的自动研发框架——你可以把它理解成两个 AI 角色搭班子干活:一个叫 R,负责研究(提想法、出假设);一个叫 D,负责开发(把想法写成能跑的代码)。量化金融是它的一个专版,命令行敲 rdagent fin_quant 进去。论文挂在 arXiv 上(2505.15155 v2)。

它跟传统自动化工具最大的区别,在于对待失败的方式。一轮实验跑砸了——某个公式在验证数据上表现平平,或者代码根本没跑通——系统不会把这次实验丢掉。它会记住这个公式的表达式、它在哪些股票上不行、回撤曲线长什么样。下一次提新假设的时候,分析调度模块会把这条记录翻出来:「上次用 20 日动量搭配沪深 300 不行,这次试试 60 日动量,或者换到中证 500 上跑。」它不是在随机试,是沿着上一次的失败定向试。

一整轮拆下来是五步。定规格:明确这轮要找什么样的公式、搜什么样的模型。提假设:给出一个具体的、可验证的猜想——比如「反转因子,过去 5 日收益率倒数加权」。写实现:交给一个叫 Co-STEER 的组件,把假设翻译成能跑的代码。代码跑崩了它会自己读报错、改逻辑、再跑,反复几次直到跑通。做验证:写完的公式拿去去重、做健康检查,再塞进一个叫 Qlib 的回测引擎里跑一遍。最后分析调度:把验证结果咀嚼一遍,决定下一轮是继续找新公式还是回头改模型。学到的东西顺着这个循环往前滚。

沿着上次的失败定向试

三种玩法。R&D-Factor 只找公式、模型固定不动;R&D-Model 反过来,公式固定、只搜模型;还有个联合版,自己判断这一轮该补公式还是该换模型。论文的实验是三种分开报结果的,后面的数字别混着看。

不到 10 美元,买的是哪一段

花多少钱。论文 Figure 11 给了账单,5 次试验平均:只找公式的分支跑 6 小时,o3-mini 花了 9.48 美元(约 68 块人民币),GPT-4o 花了 7.86 美元;联合版跑 12 小时,分别是 8.11 和 7.28 美元。完整跑一次联合实验,模型调用费确实不到 10 美元。

但这个数字只是 Token Cost——模型调用费,**不是总成本。**跑这套东西背后是一台装了 112 个线程 CPU 和 4 块 RTX A6000 显卡的服务器,硬件成本不在这张账单里。还有数据准备、容器构建、缓存预热、人工检查和工程维护,全都不在里面。而且这是论文当时的 GPT-4o 和 o3-mini 价格——不是你今天重跑一遍的报价,模型 API 的定价早变了几轮了。

不到10美元只是账单一角

两个数字,别焊在一起

看效果。这套系统产出的公式好不好用,量化圈用两个指标来评判。一个是 IC——你可以把它理解成「预测排名跟真实排名的吻合度」。联合配置在沪深 300 上的 IC 是 0.0532。它不是收益率,不是胜率,也不是准确率——就是一个约 0.05 的相关系数,别当成 5% 收益去读。在量化圈,IC 能稳定在 0.05 以上算有信息量,但能不能真的赚钱,还得看换手频率、资金容量和真实交易成本。

另一个是年化收益率。同一个联合配置的历史回测年化是 14.21%。训练数据用 2008 到 2014 年的行情,验证用 2015 到 2016 年,测试用 2017 年初到 2020 年 8 月。注意,IC 和年化是两条线上的东西——IC 讲的是「预测有多准」,年化讲的是「在历史上能赚多少」,中间还隔着你怎么建投资组合、怎么做交易。

论文里那句「约两倍」也有前提。它比的是两个传统静态公式库:Alpha158 年化 5.70%,Alpha360 年化 4.38%。14.21% 大概是它俩的两倍——不是「吊打所有模型两倍」。换一套已经在实盘跑了两年的公式组合来比,这个倍数就不一定了。还有个更容易被顺手拼上去的数字:14.61%。那是另一套配置跑出来的,它的 IC 是 0.0489。最高 IC 和最高年化不在同一行,谁把它们焊成「又准又赚的同一套系统」就是读错了表。

团队自己也知道,搭了两道防线

回到卷子的问题。团队自己也清楚这个风险,搭了两道防线。一是让 AI 看数据时只看结构不看具体数值——就像只看试卷的题型分布,看不到题目本身。二是 v2 版本补上了中证 500 和纳斯达克 100,把测试窗口往后推到 2024–2025 年,这段时间已经接近甚至超过 AI 训练数据的截止日期了。这两条能缓解一部分担忧,但缓解不等于消除。真想放心用,更稳的做法是留一份从没进过循环的最终数据,或者直接拿真金白银做前向实盘验证。

数据这头还有几个没盖住的洞。底层引擎 Qlib 技术上能做退市处理、调仓剔除,但论文没给出这次实验实际用的股票成分股清单,只能说「有能力处理」、不能说「已经消除」。交易成本是显式建了的——买入收 0.05%、卖出收 0.15%、每笔最低 5 块——可真实交易里还有两样东西没建模:市场冲击(你下的单太大,会把价格推开)和容量约束(策略规模上去后,能成交的量会缩)。

想自己跑一遍

想自己动手跑的话,源码留了三个可以人为干预的入口,时间窗要配在 .env 文件里——直接改配置文件是不生效的,这在官方 Issue 1319 里有记录。官方也写着:这套工具不能直接拿去做金融投资,不替代专业人员。

装起来跑一遍:

docker run hello-world              # 确认 Docker 免 sudo
conda create -n rdagent python=3.10 # 建独立环境
conda activate rdagent              # 进环境
pip install rdagent                 # 装包
# 在 .env 里配好 CHAT_MODEL、EMBEDDING_MODEL 和 API key
rdagent health_check                # 查依赖和 Docker
rdagent fin_quant                   # 启动,会产生付费模型调用

几个前提:官方目前只承诺 Linux;Python 3.10 或 3.11;多数场景要能免 sudo 跑 Docker。第一次跑会自动下载沪深市场日频数据、准备 Docker 环境。

跑完之后,看着那份 14.21% 的历史回测报告,剩下的是四个问题:这份数据在当时真的拿得到吗?test 已经被循环读过几遍?成本、容量和成交假设能不能扛住真实市场?这条回测曲线够不够格进入模拟盘、前向验证和风控审批?

RD-Agent 没有证明 AI 已经会替你赚钱。它证明的是另一件事:量化研发里大量「提一个设想、写代码、跑失败、再改」的力气活,已经能被塞进一个自动转的循环里。等实验本身变便宜了,贵的那部分就换成了判断

主要来源

DAVID YIN · 2026 · 07 · 29 · 杭州
← Older · #075
Kimi K3 放出 1.56TB 权重:社区试了一天,没人在自己机器上跑起来