云计算百科
云计算领域专业知识百科平台

AI 辅助投资决策(上):16 个算法 × 4 万次置换检验下的 0 个显著 RankIC、90.5% 常数地板与 IC=0 夺冠的 0.329 分临界差

这篇讲的是:一个会自己选基、自己打分、自己排名的 AI 辅助投资决策系统,它的打分与算法擂台部分到底能不能站住。我不写概念,全部结论都来自本机跑出来的数字——用 Java 把系统的真实接口读数重算了一遍,再用置换检验和蒙特卡洛把它的统计口径量了一遍。

解决什么问题:当 AI 给出一个 0 到 100 的综合评分、一份算法排行榜、一个“今日冠军”时,你怎么判断这些数字里到底有多少信息。

适合谁读:做过量化或智能投顾相关系统、或者正准备把大模型接进投研流程的同学;不需要金融背景,需要你能读懂相关系数和标准误。

能收获什么:一套可以直接搬走的审计方法(复合分复算、归一化映射反推、命中率分母反推、置换检验临界值表),以及一份“哪些指标看起来有效但其实没有区分度”的清单。

先给一个公开报道做时间锚。证券时报基金研究院在 2026 年 11 月 2 日发了一篇《AI 深入投研腹地》,里面引了美世《2026 人工智能如何重塑资产管理研究报告》:在接受调研的 131 家全球资管机构中,69% 报告用了 AI 之后运营效率提升,55% 认为洞察获取更快或质量更高,但只有 8% 看到了可衡量的投资回报改善,只有 8% 报告组合波动率下降。同一周,世界黄金协会 11 月 3 日发布 2026 年三季度《全球黄金需求趋势》报告,全球实物黄金 ETF 持仓升到了历史高位,贵金属成了这段时间最热的资产类别之一。而中国证券报 10 月 30 日采访路博迈基金时,对方给了一个很实在的行业口径:传统人工因子的 IC 值只有 3% 左右,能做到 5% 就已经很不错,他们用深度学习做出来的因子 IC 能到 14%。

这三个数字放在一起看就很有意思:效率提升是普遍的,可归因的超额是罕见的,而一个“好因子”的 IC 量级只有百分之几。我手上这套系统正好把这三件事都摊开了——它每天都在自动选冠军、自动打分、自动出预期收益。于是我把它的读数拉下来,用 Java 重算了一遍。

关于脱敏:文中所有标的(基金、贵金属 ETF)一律不出现名称与代码,只以“基金类样本”“贵金属类持仓 #1”指代;与具体标的绑定的收益率一律换成比值或对数收益量级。系统处于本地联调测试阶段,跑的是本地模拟盘,不是真实持仓,更不是任何投资建议。

一、复合分能被逐位复算,但它的归一化只是“平移加固定尺度”

系统把 16 个算法放在同一个擂台上比,复合分公式写在接口里:0.40×RankIC + 0.30×模拟Sharpe + 0.15×Top10命中 − 0.15×最大回撤。但界面上的复合分明显不能直接用原始指标乘权重得到,说明中间有一层归一化。这一层以前不暴露,现在接口把 normIc、normSharpe 和每一项的贡献都返回了,于是可以逐行复算。

实验台 1 把 16 行读数全部重算了一遍,最大绝对误差 6.5e-7,公式可复算成立。真正的问题在归一化本身:把 normIc 和 RankIC 两列放在一起,16 行全部满足一个关系。

算法(代号)RankIC接口 normIc0.5 + RankIC差
ICIR 多因子(基线) 0.041066 0.541066 0.541066 0.000000
BL 观点融合 0.065625 0.565625 0.565625 0.000000
卡尔曼趋势滤波 0.033933 0.533933 0.533933 0.000000
梯度提升树(今日冠军) 0.000000 0.500000 0.500000 0.000000
风险平价 -0.116698 0.383302 0.383302 0.000000

16 行全部命中,最大误差 0。同一列的 Sharpe 侧也成立:normSharpe = 0.5 + Sharpe/6,最大误差 3.3e-7。

这意味着归一化不是截面百分位,也不是排名归一,而是把原点搬到 0.5 的平移。后果很直接:RankIC 等于 0 的模型不会拿到差分,它会正好落在中位,白得 0.5 的 normIc。一个完全没有排序能力的模型,在“预测力”这一维上的得分和截面中位数一模一样。

二、90.5% 的复合分是常数地板,真正参与竞争的只有 0.057

既然两项归一化都自带 0.5,复合分里就必然含一块所有算法都一样的常数:0.40×0.5 + 0.30×0.5 = 0.35。实测 16 个算法复合分的中位数是 0.386929,也就是说地板占了 90.5%,真正区分高下的部分只占 9.5%。

把四项各自的极差算出来(同一批 16 个算法,基金侧):

分项该项在 16 个算法上的极差张力占比
0.40 × normIc 0.072929 43.9%
0.30 × normSharpe 0.077806 46.8%
0.15 × hitTop10 0.005000 3.01%
−0.15 × 最大回撤绝对值 0.010502 6.32%
四项极差之和 0.166238 —
复合分实测极差 0.056950 —

四项极差之和是实测极差的 2.919 倍。一个线性可加的分,各部分极差之和却比总分极差大近三倍,只有一个解释:项与项之间在互相抵消。

抵消到什么程度?把切换阈值换算成分差:规则写的是“挑战者连续 2 个评估日复合分超冠军 ≥5%”,冠军当时约 0.3738,5% 就是 0.01869。而整张擂台的总张力只有 0.05695,是阈值的 3.05 倍。换句话说,全部 16 个算法挤在三个切换阈值宽的带子里,而每次切换只需要跨过其中一个。

三、RankIC 与 Sharpe 在这张擂台上是负相关的,相加等于抵消

抵消的来源很具体。16 个算法上,RankIC 与模拟 Sharpe 的相关系数是 -0.6627,与 hitTop10 是 -0.4580,而 Sharpe 与最大回撤绝对值是 -0.5699。

看 Sharpe 最高的三个算法分别是谁:风险平价(Sharpe 1.879,RankIC -0.1167,全场最差)、梯度提升树与极端梯度提升(Sharpe 1.663,RankIC 0.0000)、均值方差优化(Sharpe 1.250,RankIC -0.0113)。而 RankIC 最高的两个——BL 观点融合 0.0656、ICIR 多因子 0.0411——Sharpe 只有 0.536 和 0.323,是全场偏低的一档。

16 个算法里有 11 个的 RankIC 小于等于 0。也就是说,在这套“模拟回测”里赚钱能力强的模型,恰恰是排序能力最差或为零的那几个。把两个符号相反的指标线性相加,得到的排序既不反映预测力也不反映收益质量,它反映的是谁在两项之间最不偏不倚。

四、4 万次置换检验:45 个标的的截面,16 个算法没有一个 RankIC 显著

这一节回答一个更根本的问题:IC 只有百分之几,是不是本来就该这样?答案是“本来就该这样,但你现在这个样本量根本测不出来”。我在 Java 里做置换检验:假设因子与未来收益完全独立(无预测力),随机打乱 45 个标的的秩,算 Spearman 相关,重复 4 万次,看得到的分布。

截面标的数 N无预测力时 RankIC 的标准差95% 双侧临界 |IC|99% 双侧临界 |IC|
45(系统当前) 0.15107 0.29736 0.38472
100 0.10055 0.19723 0.25901
200 0.07090 0.13982 0.18246
400 0.05001 0.09902 0.12998
928(全池) 0.03316 0.06513 0.08549

在 N=45 的截面上,要判“这个因子有排序能力”,|IC| 得超过 0.297。而 16 个算法里 |IC| 最大的三个是 0.1167(且是负的)、0.0656、0.0627。达到 95% 显著的算法个数:0/16。

拿路博迈给的口径反过来算需要多大规模(用 SE≈1/√(N−1),要求 t≥2):

  • IC=0.03:需要单日截面 N≥4445,或独立评估日 99 个
  • IC=0.0411:N≥2372,或 53 个独立评估日
  • IC=0.0656:N≥929,或 21 个独立评估日
  • IC=0.14(深度学习因子口径):N≥205,或 5 个独立评估日

系统当前的读数是 samples=45、sectionAdequacy.validSections=3。45 个标的单日的标准误是 0.15076,3 个评估日平均后降到 0.08704。而今天夺冠模型与基线模型的 IC 差是 0.041066,只相当于 0.47 个标准误——统计上完全不可区分,但切换已经发生了。

这里埋一个下篇的钩子:IC 只有 0.03 的模型,按因子选前 3 只能拿到多少期望超额?我在 N=45 截面上跑了 20 万次蒙特卡洛,答案是 0.057 个标准差。当这个量级被系统换算成 12 个月的“预期漂移”并写进置信带时,名义 80% 的区间实际罩住了多少结果——下篇给数字。

五、命中率指标的分母是 N×k,读数被整体放大 3 倍,而且 Top3 与 Top10 互相打架

接口还给了 hitTop3 和 hitTop10 两个命中率。它们没有说明分母。我把 16 行取值拿来反推最小公共分母(考虑接口只给 6 位小数,容差取 1e-3):

指标非零取值最小分母对应乘数(命中个数)
hitTop3 0.007407 / 0.022222 135 = 45×3 1、3
hitTop10 0.002222 / 0.004444 / 0.006667 / 0.008889 / 0.013333 / 0.017778 / 0.035556 450 = 45×10 1、2、3、4、6、8、16

两列的分母都是“标的数 × 槽位数”,但分子是把 3 个有效评估日的命中数加在一起的。也就是说,分母里没有那个 3,读数被整体放大了 3 倍;而且 hitTop3 与 hitTop10 的槽位数不同(3 与 10),两列之间不可直接比较。

用可行性约束验证这个判断:hitTop10 最大乘数是 16,如果只算单日,10 个槽位最多 10 个命中,16 不可能;除以 3 日得 5.33 个,落在 10 以内成立。所以“3 日求和、分母不含 3”这个结构是能对上数据的。

接着算随机基线。4 万次蒙特卡洛(随机排序、3 日求和、除以 N×k):

指标随机分布均值随机中位随机 95% 分位随机 99% 分位超过 95% 分位的算法数
hitTop3 0.004431 0.000000 0.014815 0.022222 1/16
hitTop10 0.014807 0.015556 0.022222 0.026667 1/16

两个指标各自只有 1 个算法超过随机 95% 分位,而且都是同一个:风险平价(Top3 命中 3 个、Top10 命中 16 个)。它的 RankIC 是 -0.1167,是 16 个算法里排序能力最差的一个。

这是整篇里我最愿意留下的一条证据:命中率最高的模型,恰好是排序能力最差的模型。两个指标不可能同时是对的。要么命中率的实现与 RankIC 的口径不是一回事,要么 3 个评估日的样本里这两者本来就只是噪声的不同投影。

六、RankIC 等于 0 也能夺冠:临界差只有 0.329 个 Sharpe

今天系统把基金侧冠军从基线换成了一个 RankIC 恰好为 0.0000 的模型。这不是 bug,是公式的必然。把两项的贡献写成等式:IC 项分差 = 0.40 × ΔIC,Sharpe 项分差 = 0.30 × ΔSharpe / 6。要让后者盖过前者:

ΔIC = 0.041066 – 0 = 0.041066
IC 项分差 = 0.40 × 0.041066 = 0.016426
临界 ΔSharpe = 0.016426 × 6 / 0.30 = 0.3285
实测 ΔSharpe = 1.662937 – 0.323134 = 1.339803 (是临界值的 4.08 倍)

只要对手多 0.329 个 Sharpe,零预测力的模型就必胜。实测对手多了 1.34 个,是临界值的四倍。切换公告写的分差是 0.4286 对 0.3738,超 14.66%,确实满足“≥5% 连续 2 个评估日”——规则被忠实执行了,执行的结果是把一个没有排序能力的模型扶成冠军。

权重敏感性实验(只调 IC 与 Sharpe 的权重,其余不变):

wIC / wSharpe冠军冠军 RankIC该项极差
0.40 / 0.30(现行) 梯度提升树 0.0000 0.0570
0.50 / 0.20 梯度提升树 0.0000 0.0508
0.60 / 0.10 BL 观点融合 0.0656 0.0774
0.70 / 0.00 BL 观点融合 0.0656 0.1180
0.30 / 0.40 梯度提升树 0.0000 0.0812
0.20 / 0.50 风险平价 -0.1167 0.1121

把 IC 的权重从 0.40 提到 0.60(同时把 Sharpe 降到 0.10),冠军立刻换成 RankIC=0.0656 的模型。也就是说,冠军是谁主要由一个权重常数决定,而不是由数据决定。另一个 A/B:把 normIc 从“平移归一”换成“截面百分位归一”,其余完全不动,16 个算法的名次全部发生变化,现行冠军从第 1 掉到第 6。

还有一个必须单独说的现象:极端梯度提升与梯度提升树的 14 项指标(基金侧 8 项 + 贵金属侧 6 项)逐位完全相同,包括 0.004444、1.662937、-0.03469、0.42861 这些六位小数。两个不同的模型不可能在两个资产类别上同时给出完全相同的读数,这更像是共用了同一个兜底分支或者未隔离的预测缓存。

七、冷启动保护写在规则里,但今天没有生效

接口里同时存在两段自述。一段是切换规则:有效评估截面不足 30 个时冠军固定基线(冷启动保护)。另一段是 Adequacy 读数:

sectionAdequacy = { cold: true, required: 30,
FUND: { validSections: 3, required: 30, sectionGap: 27, coldStart: true },
METAL: { validSections: 3, required: 30, sectionGap: 27, coldStart: true } }
baseline = ICIR 多因子

validSections=3 远小于 30,coldStart 明确为 true,基线模型是 ICIR 多因子。而切换记录给的是:

switchDate 2026-11-04 assetType FUND
fromCode ICIR 多因子 -> toCode 梯度提升树
reason 挑战者连续 2 个评估日复合分超冠军 ≥5%(今日 0.4286 vs 0.3738)

两个事实同时成立:系统自认处于冷启动,并且从基线切走了。要么冷启动保护的判定没有接进切换流程,要么 validSections 与规则里说的“有效评估截面”不是同一个量。这一条我没法从外部确定,只能把两段自述并排放着,它是需要读后端代码才能定位的问题。

八、净值停更会被风险维度反向奖励:配对实测名次前移 7.30 个百分点

前面都在说指标怎么算,这一节说指标吃什么。系统的风险维度是“波动越低越稳、分越高”。而基金净值有一个天然陷阱:如果某只标的连续几天净值和前一交易日完全一样(数据没更新,不是真的没波动),这些 0 收益会直接进入波动率窗口,把实现波动压低。

实验台 3b 做了配对 A/B:先生成 4000 条净值序列构成基准截面(一半偏债类、日波动 0.15%~0.40%,一半偏股类、日波动 0.60%~1.40%),再对其中 25% 的序列在序列尾部注入 L 天停更,用同一个基准截面给注入后的序列打风险分与综合分,比较同一条路径注入前后的名次。

停更天数 L20 日实现波动(相对基准)风险分变化综合分变化脏样本名次变化进入前 20% 的比例
2 -3.7% +0.82 +0.39 +0.25pp 30.2% → 30.9%
5 -10.5% +2.42 +1.17 +0.76pp 30.2% → 31.5%
10 -25.1% +5.77 +2.87 +1.89pp 30.2% → 32.1%
20 -100.0% +24.96 +12.09 +7.30pp 30.2% → 39.7%
28 -100.0% +24.96 +11.87 +7.24pp 30.2% → 39.5%

L=20 时,20 日窗口全部落在停更区间内,实现波动直接归零,风险分打满 100,综合分涨 12 分,脏样本在截面里的名次平均前移 7.30 个百分点,进入头部 20% 的比例从 30.2% 抬到 39.7%。这批样本的历史回撤并没有变好——它们只是没更新。

更糟的是组合形态:在 L=28 档里,有 1119/4000(27.98%)的样本同时满足“风险分≥90”和“120 日最大回撤≥8%”,这批矛盾样本的 20 日实现波动均值是 0.0000%,而它们的 120 日回撤均值是 20.50%。低波动与深回撤同时成立,只可能是数据问题,不可能是风险问题。

拦截不是免费的。我把“60 日内重复净值天数”当主特征,测两种停更形态:

阈值连续块停更检出率零星散点停更检出率健康样本误报率
dup > 2 100.0% 87.4% 0.00%
dup > 5 89.0% 50.3% 0.00%
dup > 10 68.5% 0.0% 0.00%
dup > 15 49.3% 0.0% 0.00%

零星散点型停更(60 日窗口里撒 2~10 个持平日)在阈值高于 10 时完全检不出来。所以阈值必须压到 2~5,而真实净值里本来就有少量持平日,这个区间的误报率要靠“波动-回撤矛盾”这类结构判据来兜,而不是靠单一天数阈值。

拿系统的真实读数对一下口径:dataHealth 现在是序列级的 546/928 可用(这个口径比早期的“数据源 1/1 健康”前进了一大步),但 gateExcluded=14,而 928−546=382 只标的不可用,门禁只解释了缺口的 3.7%,剩下 368 只进了“不可用”却没进“被剔除”。另一处是风险折价的区分度:risks.affected=546,可用序列也是 546,即 100% 的可用标的都被标成“波动偏高或回撤较深”。同一批数据按中位阈值筛应该是 50%,按 75 分位筛是 25%——全员命中的折价等于没有折价。

九、适用边界与风险提示

本篇只覆盖打分层与算法擂台,不覆盖组合构造与预测层;后者(置信带中心、同质持仓的相关性、信号叠加)放在下篇。以下逐条列出我没做到的部分:

  • 未做跨进程与跨版本验证:全部实验在单 JVM、本机 JDK 17.0.18 上完成,没有对比其他 JDK 版本的数值差异。
  • 未读后端代码:归一化映射(0.5+IC、0.5+Sharpe/6)与命中率分母(N×k)都是从 16 行读数反推的,能逐位对上,但不等于实现就是这样;冷启动保护未生效的原因无法定位。
  • 净值实验用的是合成序列:实验台 3/3b 的净值路径由 Java 代码在本机工作目录现场生成(固定 seed 的对数正态 GBM 加停更注入),不是真实标的净值。它验证的是“风险维度对停更的反应方向”这一机制,不能当作某只真实基金的评价。
  • 置换检验的截面规模取自接口自述:samples=45、validSections=3 是系统给的数,我没有独立核对。
  • 不构成投资建议:系统处于本地联调测试验证阶段,跑的是本地模拟盘;文中所有标的已脱敏,任何数字都不代表任何真实产品的表现,也不预示未来收益。

AI 辅助说明:本文的实验代码由 AI 辅助编写,全部在本机工作目录实跑,文中每一个数字都取自实际终端输出,未做人工修饰;热点报道均来自公开来源(证券时报基金研究院、美世研究报告转述、世界黄金协会三季度报告转述、中国证券报采访报道),我只核到标题、发布方与时间,未逐条向第一方原文复核,引用时已注明转述性质。

十、完整复现命令与判定标准

四个实验台都是单文件 Java,不依赖任何第三方包。编译与运行(含中文源码必须指定 UTF-8 编码):

javac -encoding UTF-8 Bench1_CompositeAudit.java
javac -encoding UTF-8 Bench1b_Decompose.java
javac -encoding UTF-8 Bench2_IcSignificance.java
javac -encoding UTF-8 Bench3b_StaleRank.java
java Bench1_CompositeAudit
java Bench1b_Decompose
java Bench2_IcSignificance
java Bench3b_StaleRank

判定标准(对不上先怀疑实验台,不要先怀疑结论):

① Bench1 第一节的 16 行复算最大绝对误差应小于 1e-5,且 normIc − (0.5 + RankIC) 的最大误差应为 0;若不为 0,说明接口读数被改过,需要重新取数。

② Bench1b 的 corr(RankIC, Sharpe) 应落在 -0.6 到 -0.7 之间;若符号翻转,先检查是否把基金侧与贵金属侧的列取混了。

③ Bench2 的置换检验在 N=45 时 95% 临界 |IC| 应在 0.29 到 0.30 之间(我实测 0.29736);随机排序下 hitTop3 的均值应约等于 0.0044。

④ Bench3b 的 L=20 档,脏样本名次前移应为 +7pp 量级、风险分增量应为 +24 到 +25;若风险分不涨,检查你的波动窗口是否真的覆盖了停更区间。

⑤ 随机种子固定为 20261104。置换与蒙特卡洛的均值项可复现,分位数会因随机数消耗顺序略有差异,但不会改变结论的量级。

十一、结论与两个问题

留下三条可以记住的判断:

第一,归一化的形式决定冠军是谁。当“平移式归一”把原点搬到 0.5 时,指标等于 0 不是差,而是中位;再叠上 90.5% 的常数地板,擂台真正比较的只剩 0.057 的张力,而切换阈值只要 0.019。这种结构下,冠军由权重常数决定,而不是由数据决定。

第二,样本量不够时,任何“择优”都只是在噪声里比大小。45 个标的、3 个评估日的截面,RankIC 的标准误是 0.087,而全场 IC 极差只有 0.182。要让一个 IC=0.03 的因子达到显著,需要 4445 个截面或 99 个独立评估日。在此之前,“自动择优”这个名字本身是超前的。

第三,风险维度会奖励脏数据。净值停更把实现波动压低、把风险分抬满、把综合分推高 12 分、把名次抬进头部 10 个百分点——而拦截阈值的可行区间只有 dup 2 到 5,超出就检不出来。

一个具体的自检动作:下次你看到任何一个 0 到 100 的评分,先问一句“这个分能不能用原始因子线性复算,归一化是百分位还是平移”。如果能复算出 0.5 + x 这种形式,那这个分的“中位”就是白送的,排行榜头部出现的“零指标模型”就不是意外。

最后留两个问题给你:你在自己的系统里做过“指标退化检测”吗——比如某个维度全截面同分、或者某个命中率全员命中,你有没有让它自动降级或者报警?还有,当你的自动择优在统计上不可区分时,你希望它是“不动”还是“照规则动”?我自己的答案是前者,但这意味着要接受系统看起来“什么都没做”。

下一篇进到组合与预测层:一个 IC 只有 0.03 的排序能力,被换算成 12 个月的预期漂移后写进置信带,名义 80% 的区间实际罩住了多少结果;三笔跟踪同一标的的同类持仓,反解出的隐含相关性是 0.50,而真实相关性接近 1,带宽会差多少;以及三条同构的卖出建议为什么会把一次决策复制成三次。这套系统还在本地联调测试验证中,我会把它修到哪一步、还剩哪些坑,继续用实测数字写出来。如果这篇的审计方法对你有启发,值得收藏一份当清单用。

赞(0)
未经允许不得转载:网硕互联帮助中心 » AI 辅助投资决策(上):16 个算法 × 4 万次置换检验下的 0 个显著 RankIC、90.5% 常数地板与 IC=0 夺冠的 0.329 分临界差
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!