市面上的 AI 理财助手都是花架子——真正有深度的理财 Agent 应该长这样“帮我分析一下我的基金组合”——现在市面上任何一个接了 LLM 的理财工具都能给你回复。但回复的内容大概率是「建议您分散投资、长期持有、根据风险偏好调整配置」。这不是废话吗。用户问的是「我该买什么基金」不需要你再重复一遍理财入门课的第一章。他要的是我买的这三只基金底层到底投了哪些股票、有没有重叠、估值贵不贵、如果再来一次 2018 年会亏多少。这篇文章不讲入门。讲的是一个真正有深度的理财 Agent 应该具备哪些分析能力以及每一层怎么实现。一层一层拆真正的理财 Agent 需要五件事第一层持仓穿透——「你买的基金到底是什么」用户买了三只基金易方达蓝筹精选、中欧医疗健康、招商中证白酒。表面上看分散了——消费、医疗、白酒三个赛道。穿透到底层持仓之后你发现三只基金同时重仓了茅台和五粮液。你以为你在分散投资实际上你有一半的钱都在白酒上。数据从哪来基金季报是公开信息——天天基金、好买基金、蛋卷基金都提供持仓查询。AKShare开源 Python 库提供ak.fund_portfolio_hold_detail_em(code, year)接口直接拉取基金前十大重仓股。ETF 更简单——直接查指数成分股即可不需要等季报。这个分析不需要 AI。需要的是一个能自动拉取基金季报数据、把每只基金的十大重仓股展开、然后按股票维度聚合的计算引擎。代码实现importakshareasakdeffetch_top_holdings(fund_code:str)-list[dict]:拉取基金前十大重仓股数据来源天天基金dfak.fund_portfolio_hold_detail_em(symbolfund_code,date2025)return[{name:row[股票名称],weight:float(row[占净值比例])}for_,rowindf.head(10).iterrows()]defpenetrate_portfolio(fund_codes:list[str])-dict:穿透基金持仓按股票维度聚合stock_exposure{}forcodeinfund_codes:holdingsfetch_top_holdings(code)forstockinholdings:namestock[name]weightstock[weight]stock_exposure[name]stock_exposure.get(name,0)weight# 找出重复持仓聚合后占比 5% 的股票overlaps{k:round(v,1)fork,vinstock_exposure.items()ifv5}return{total_holdings:len(stock_exposure),overlapping_stocks:overlaps,concentration_top3:round(sum(sorted(stock_exposure.values(),reverseTrue)[:3]),1)}运行结果可能是「你表面投了三个赛道实际上三只基金的十大重仓里茅台占了 18%、五粮液 9%、迈瑞医疗 7%——光前三只股票就占了你总仓位的 34%。」这个结论不需要 AI 生成。它是一次计算的结果。但它是所有后续分析的基础。第二层估值分位数——「贵不贵用数据说话」AI 跟你说「当前估值合理」——它怎么判断的大概率是 LLM 从训练数据的模糊记忆里猜的。真正的估值判断需要硬数据把一只股票或一只基金当前 PE/PB 和它自己过去 5 年的历史数据对比。defvaluation_percentile(stock_code:str)-dict:当前 PE 在历史 5 年中的分位数hist_pefetch_historical_pe(stock_code,years5)current_pehist_pe[-1]below_countsum(1forpeinhist_peifpecurrent_pe)percentilebelow_count/len(hist_pe)return{current_pe:current_pe,percentile:percentile,judgment:偏低ifpercentile0.3else偏高ifpercentile0.7else适中}然后你告诉用户「当前贵州茅台 PE 为 28.5处于过去 5 年的 72% 分位数意味着当前估值比过去 5 年中 72% 的时间都贵。」这个结论有数学依据不是 AI 猜出来的。LLM 在这个流程里的角色不是做判断而是把数据结果翻译成人话。第三层风险归因——「涨跌是运气还是实力」你说「这只基金今年涨了 20%挺厉害」。20% 里多少是市场整体涨的Beta、多少是行业涨的行业因子、多少是基金经理真本事Alpha这个分析在金融学里有成熟的方法论叫 Fama-French 三因子模型。importnumpyasnpfromsklearn.linear_modelimportLinearRegressiondeffactor_attribution(fund_returns:list,market_returns:list,smb:list,hml:list): 用 Fama-French 做收益归因 返回市场因子、规模因子、价值因子各自的贡献 Xnp.column_stack([market_returns,smb,hml])ynp.array(fund_returns)modelLinearRegression().fit(X,y)# R² 表示「多大程度能被这三因子解释」return{r_squared:model.score(X,y),alpha:model.intercept_,# 基金经理的真本事market_beta:model.coef_[0],# 市场敏感度size_loading:model.coef_[1],# 大小盘偏好value_loading:model.coef_[2],# 价值/成长偏好}输出可能是「这只基金今年 20% 的收益里市场整体上涨贡献了 14 个百分点行业因子贡献了 5 个百分点剩余约 1% 是无法用这三维解释的超额收益。」这个信息量比「涨了 20% 好厉害」大了一百倍。它告诉你如果市场不涨了这只基金大概率也不会有超额收益。数据来源三因子数据可以从 Fama-French 官网免费下载mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html覆盖美股。A 股版本可以从清华大学金融科技研究院的因子库获取。第四层重叠度分析——「你的分散是真的还是假的」这是最容易被忽略但最直观的一层。用户买了五只基金自以为分散得很好。但你把他所有基金的持仓股票拉出来会发现一个尴尬的事实五只基金有三只重仓了同一批股票。defoverlap_analysis(fund_codes:list[str])-dict:分析基金组合的持仓重叠度all_holdings{}forcodeinfund_codes:holdingsfetch_top_holdings(code)all_holdings[code]set(h[name]forhinholdings)# 两两计算重叠度overlaps{}fori,f1inenumerate(fund_codes):forf2infund_codes[i1:]:commonall_holdings[f1]all_holdings[f2]allall_holdings[f1]|all_holdings[f2]ifall:overlaps[f{f1}vs{f2}]len(common)/len(all)returnoverlaps结果「基金 A 和基金 B 的重叠度为 0.4——你买这两只基本等于买了同一批股票的两倍。」用热力图呈现这个结论比任何文字描述都有冲击力。用户一眼就能看到自己组合里哪些是真正的分散哪些是重复下注。第五层历史情景测试——「再来一次 2015 年会亏多少」AI 分析的另一个通病是只看当期数据不看极端情景。2015 年股灾、2018 年去杠杆、2020 年疫情崩盘——你的组合在这些极端事件下会表现如何defscenario_test(fund_codes:list[str],scenarios:dict[str,tuple])-dict: 基于历史极端事件做压力测试 scenarios {2015股灾: (2015-06-12, 2015-08-26), ...} results{}forname,(start,end)inscenarios.items():total_loss0valid_funds0forcodeinfund_codes:try:returnsfetch_returns_range(code,start,end)total_lossreturns valid_funds1exceptExceptionase:print(f{code}数据缺失:{e})avg_losstotal_loss/valid_fundsifvalid_fundselse0results[name]{avg_drawdown:round(avg_loss,2),duration_days:(parse_date(end)-parse_date(start)).days}returnresults然后你告诉用户「假设 2018 年重演你当前的组合在最坏情况下会回撤约 32%需要大约 9 个月回到原点。」这个数据不是预测未来但比「投资者需注意风险」有价值得多。它让抽象的风险变成了具体的数字和情景。真正好的理财工具长什么样——不是 Agent是逻辑这里不说 Agent说几个全球做个人理财做得最好的工具。它们的共同点是不需要 AI但分析深度远超任何接 LLM 的 Chatbot。工具核心能力值得借鉴的Betterment税务损失收割 自动再平衡不是选基金是算法调仓Wealthfront风险平价 直接指数化不用 ETF直接买底层股票Portfolio VisualizerFama-French 归因 蒙特卡洛模拟业界标准的分析引擎Morningstar X-Ray持仓穿透 重叠度分析告诉你「你买的到底是谁」它们的共同思路是算出来的结论不用 AI 生成。AI 在这些工具里的唯一价值是把分析结果解释给用户听——不是替代计算是翻译计算结果。五层能力一句话总结层级解决的问题输出示例持仓穿透你到底买了什么茅台在三只基金里一共占了 18%估值分位数现在贵不贵PE 处于 5 年 72% 分位偏贵风险归因涨跌是什么原因市场贡献 14%Alpha 约 1%重叠度分散是真的吗两只基金重叠度 40%重复下注历史情景极端情况亏多少2018 年重演会回撤 32%从零到深阶段推进清单一口气做完全部不现实按阶段来第一阶先做已有深度持仓穿透接入 AKShare 拉基金季报 → 展开十大重仓 → 按股票聚合重叠度两两计算持仓重合率 → 用 Matplotlib 生成热力图做完这两样你的 Agent 已经比市面上所有「问问 AI 该买什么」的理财工具都有深度了。时间投入一个周末。第二阶加专业权重PE 分位数当前估值 vs 历史 5 年 → 贵还是便宜用数学说话历史情景模拟选 3-5 个极端事件 → 跑一遍压力测试 → 告诉用户最坏会亏多少相关性矩阵组合内每对资产的相关系数 → 真正的分散度做完这层你的 Agent 能输出的已经不是「建议」了是有数据支撑的量化分析。时间投入2-3 个周末。第三阶冲顶用Fama-French 归因拆解收益来源 → 市场涨了多少、行业涨了多少、基金经理真本事多少费率侵蚀计算1.5% vs 0.5% 管理费 → 30 年后差了多少钱这个数字比任何投资建议都有冲击力蒙特卡洛模拟基于历史参数随机生成 10000 条未来收益路径 → 预测 5 年后资产分布范围做完这三阶你不是在做理财 Agent 了你是在做个人版的 Wealthfront。数据源清单数据类型免费方案付费方案A股行情AKShare开源免费Wind / 同花顺 iFinD基金持仓天天基金 APIWind美股行情Yahoo FinanceyfinancePolygon.io因子数据Fama-French 官网Barra / Axioma估值分位数自己算历史 PE 数据 分位数无需外购市面上没有好用的理财 Agent不是因为 LLM 不够强是因为没人把「金融分析」的逻辑沉淀成 Agent 的工具链。你能查行情、能读财报都不算本事——能穿透持仓做重叠度分析、能归因收益做风险分解、能用历史数据模拟极端情景才算真正有用的 Agent。这五层不需要同时做。从持仓穿透和重叠度开始两样加起来不超过 200 行 Python。但做完之后你的 Agent 说的就不是「建议分散投资」了——它会告诉你「你三只基金里茅台占了 18%这不是分散这是赌白酒」。