直接说结论:这笔钱花得值。注意,我说的值,不是指它替我挑出了什么稳赚代码,而是它把一项原本需要我连续加班两三天、抱着Excel表对数据对到想吐的工作,压缩成了半天,还顺手逼我重新理顺了一套基本面分析的标准口径。用AI把A股前600家上市公司的基本面轮一遍,这件事做之前我以为难点在"跑数据",做完之后我才发现,真正的坑全在数据之外:口径、幻觉、批量设计的边界、以及怎么让模型输出一份你敢拿去用的结论。
这篇帖子的内容就是完整复盘这次实操:思路怎么来的、钱花在哪、指标怎么选、600家怎么分批跑、中间踩了哪些坑、最后怎么校验。不吹不黑,纯粹是个人经验记录。看完你至少能明白一件事:用AI筛基本面真正节约的其实是"读报表摘要"的时间,而真正费时间的,永远是那些AI帮不了你、必须你自己拍板的判断。
1. 为什么非要筛600家:一次给自己设的压力测试
1.1 600家这个数字是怎么定的
最开始我其实想的是"全市场五千多家全筛掉"。后来算了一笔账:A股现在五千多家公司,这里面有大量上市时间很短、市值极小、财务数据口径混乱的小票,把它们全部纳入初筛,不仅接口调用次数翻好几倍,还会显著拉低结果信噪比。与其贪多嚼不烂,不如先聚焦在"市值排序靠前、行业代表性够用"的600家。
600家覆盖的是A股里流动性和关注度最高的一批公司,行业分布相对均衡,财报数据也更规范。这600家如果跑完,基本就能代表上市公司里最值得研究的那个梯队。换句话说,我用600家把"数量广度"和"数据质量"做一个折中。你如果自己手里有更聚焦的行业名单,其实不用非得抄这个数字。
1.2 为什么Excel做不了这件事
有人可能想问:基本面筛选不就是算几个财务指标吗?用表格软件拉数据、写公式、排序,完全能做,为什么要上AI?
因为纯表格只能做"计算",做不了"阅读"。一家公司的基本面好不好,不能只看净资产收益率或者营收增速这两个数字,你得把这些指标串起来看:毛利率下降的同时周转率在上升,说明什么?应收账款暴涨但现金流没跟上,又说明什么?这些跨指标的逻辑判断,表格软件是没法替你归纳的。
AI的价值不在于把指标算得更准,算数本来就该交给程序。AI真正有用的地方,是能基于你给的结构化字段,生成一段有逻辑的定性判断,相当于替你把"年报里最值得关注的点"压缩成了三句话。这件事,人工做太慢,表格做不了,AI正好补上。
1.3 2000块的账,我是这么算的
很多人一看到"花了2000块"就觉得贵,其实拆分下来一点都不夸张。我做了一张成本表,给大家一个参考:
| 成本项 | 预算区间 | 说明 |
|---|---|---|
| 数据接口额度 | 约800元 | 拿全600家的核心财务字段,按调用次数计费 |
| 大模型API调用 | 约900元 | 600家逐批生成分析摘要,输入输出按token计费 |
| 脚本调试与人工复核 | 约300元折算 | 按小时折算,不算沉重 |
实际跑下来,数据接口费用比预算略低,模型接口费用略高,总盘子基本控制在2000元上下。如果你想压缩成本,最有效的办法不是换便宜接口,而是减少每次请求的输入输出长度,后面第四节我会专门说这个。
2. 数据源、指标口径、AI工具:动手前必须想清楚的三件事
2.1 数据源怎么选,决定了后面所有工作
选数据源我的经验是三条标准:覆盖面全、字段表头稳定、能批量下载。市面上常见的财经数据接口不少,但很多免费接口字段命名混乱,今天叫"净利润",明天叫"归母净利润",代码里光适配字段就够折腾。
我最后选了按调用次数计费的付费接口。不是说免费接口一定不行,而是付费接口通常有更统一的数据字典,字段缺失率也低得多。600家公司的数据集,一次拉错就是成百上千条脏数据,后面清洗的功夫比重跑一遍还贵。这个钱省不得。
提示:不管用哪家数据源,第一步先下载两到三家你熟得不能再熟的公司的数据,人工核对一遍。数据口径错位,后面所有分析都是在沙子上面盖楼。
2.2 基本面指标别贪多,四类指标各抓两三个就够了
刚开始我列了一个超长指标清单:每股收益、每股净资产、收益质量、存货周转、总资产周转、销售费用率……什么都想塞给模型。后来发现指标过多,AI输出反而泛化,抓不住重点。我重新收敛了一下,做成了下面这个核心矩阵:
| 分析维度 | 核心指标 | 我的理解 |
|---|---|---|
| 盈利能力 | 净资产收益率、毛利率、净利率 | 净资产收益率看股东回报,毛利率看商业模式护城河 |
| 成长性 | 营收同比、归母净利润同比 | 收入与利润要放一起看,防止增收不增利 |
| 财务健康 | 资产负债率、流动比率、经营现金流 | 现金流比账面利润更诚实 |
| 估值与回报 | 市盈率、市净率、股息率 | 这个维度在初筛阶段只做记录,不参与打分 |
以一家典型的消费类公司为例:如果净资产收益率18%、毛利率30%、净利率12%,同时营收增速只有8%,资产负债率40%,那AI应该把它定性成"稳健型"而不是"高增长型"。这类跨结构判断,就是我要AI做的核心工作。
2.3 口径统一这件事,得在数据进模型前解决
这是老生常谈,但实操中真的特别容易翻车。就拿"净利润"这个字段来说,至少有归母净利润、扣非归母净利润、含少数股东损益净利润好几个口径。如果横向对比的600家混用了多个口径,排名直接失真。
我的做法非常粗暴:所有公司统一用"扣非归母净利润"做横向对比。扣非剔除了非经常性损益,更接近一家公司的真实造血能力。你说它不完全公平也行,但在600家这种规模的初筛里,统一口径比追求个别公司的精确更重要。
2.4 AI工具选型:不要太早绑定单一模型
我这次试了两家主流大模型API做交叉验证,没有点名哪家更好,因为我发现各有所长:一家逻辑归纳更稳,适合生成结构性评价;另一家对中文财报措辞的理解更顺,适合解读公告片段。所以我的建议是别把鸡蛋放一个篮子,至少让两家模型各自跑一批,再看输出差异。
工具上是直接调API再用脚本批量请求,没有用现成的聊天界面,因为600家数据如果靠人工一条条复制粘贴进对话框,成本早就爆了。脚本化是必须的。
3. 实操全流程:从股票池清洗到AI批量打分
3.1 搭建候选池:先用简单规则砍一刀
我先按市值排序取前800家,然后按几个硬性规则做剔除:上市不满一年的剔除;剔除数据缺失超过三成的;剔除无法确认最新报告期的。这步做完剩下约600家整。
这个"先砍一刀"的思路非常重要。初筛的目的是尽量把有明显瑕疵的标的挡在门外,保住后续分析的质量。不要舍不得剔,基本面筛选本来就是一个漏斗,前面漏掉一些边缘标的,后面才有精力对留下的重点公司做更有价值的研究。
3.2 批量采集与本地落盘
数据不是直接喂给AI的,流程是:代码拉取 → 存本地数据库 → 抽样核验 → 按批导出。
我用的工具组合很简单:脚本批量请求,返回的JSON统一解析后落到本地数据库里。为什么要落本地?一是接口数据源偶尔会有调整或回补,本地留一份原始快照,后面发现问题可以追溯;二是断点续跑更方便,哪批挂了能从相应分组重来,不用全量再拉一遍。
下面一段伪代码是我当时的采集思路,给你参考:
for company in stock_pool: fields = fetch_annual_report(company.code) if fields is None or missing_ratio(fields) > 0.3: continue store_to_localdb(company.code, fields)重点是:所有原始字段先原样入库,不要在处理过程中顺手改掉精度。你永远不知道后面会不会需要重新核对某个数。
3.3 设计AI提示词模板:让每家公司用同一套分析框架
这一步是整个项目的核心中的核心。AI能不能稳定输出,不取决于模型有多强,而在于你的输入框架有没有把它的自由度限制住。
我的提示词模板大概是这样的结构:
你是一名基本面研究助理。以下是一家公司的核心财务指标,全部来自最新报告期。 请严格基于我给出的字段,从三个角度分析: 1. 盈利质量:重点看净资产收益率、毛利率、净利率的匹配度; 2. 成长稳定性:结合营收与净利润同比,判断增速是否有质量; 3. 财务风险:结合资产负债率、流动比率、经营现金流,识别潜在风险。 每个角度不超过100字,最后给一个0到100的基本面强度分。 如果你认为数据不足以判断,请直接说“数据不足”,绝对不能编造任何我没有提供的数字或事件。这个模板看起来简单,但里面有三个设计很关键。第一,明确要求AI"严格基于我给出的字段",从源头掐掉编数据的可能性;第二,分角度限定字数,防止输出几百字废话;第三,给了AI一个"数据不足"的合法出口,让它在面对残缺数据时不会强行脑补。
3.4 批量跑批:60家一组,断点续跑
600家一次全部塞给API,既不现实也没必要。我按6个批次,每批100家来跑。每批跑完就把结果写回本地库,保存一份带批次的标记。这样即便中途接口报错,也能从失败批次重新开始,不至于前面全部白跑。
跑批过程大概是这样:
- 第一批我先放了10家做试跑,确认输出格式稳定后再放量;
- 每批次之间稍作停顿,避免触发接口限流;
- 输出结果统一存JSON,后面再做字段解析。
这步没有太多技术含量,但很考耐心。如果你打算照做,我的建议是不要在晚上睡觉前跑批,因为一旦半夜接口报错,你第二天看到的就是一个半途而废的任务。最好白天边干活边盯。
3.5 人工复核与最终打分矩阵
AI输出完不代表结束,我额外做了一层人工规则校验。重点看几个容易出问题的分支:
| 触发条件 | 处理方式 |
|---|---|
| 净资产收益率高于30% | 单独复查,防止周期股顶点利润被当成常态 |
| 经营现金流为负 | 强制标注风险提示 |
| 资产负债率高于70% | 标记高杠杆,复核有没有大额短期借款 |
| 模型输出含"非常优秀"等模糊词汇 | 退回重跑,逼模型用数字说话 |
通过这一道复核,600家公司最终被分成五档:基本面稳健、基本面较好、基本面一般、基本面偏弱、数据不足。后面再要做什么深度研究,可以直接按档位分层抽样。
4. 踩坑实录:这些坑比预想中更深
4.1 AI幻觉:把A公司的数据安到B公司头上
这是我最想提醒你的一件事。大模型不是数据库,它非常容易在长篇上下文里把某家公司的特征串到另一家公司上。我在试跑阶段就让AI点评一家公司,结果它把另一家公司的产品优势写进来了,要不是我对那家公司足够熟悉,这个错误就埋进正式结果里了。
解决办法有三个层次。第一层:尽量把输入字段全部结构化,不给模型自由发挥的文本空间;第二层:提示词里明确声明"不提供字段信息就视为数据不足";第三层:在人工复核阶段用规则引擎跑一遍,比如把AI提到的关键数字,跟原始库里的字段做一个简单一致性校验。
4.2 财报口径错位:同比增速错得离谱
有一批公司跑出来营收同比增速普遍高得吓人,我还以为是出现了什么高增长集群,后来一排查发现是数据源把"单季度"和"年初至今"两个口径混在一起。你想想,如果拿一季度的数去对比去年全年,增速当然虚高。
我的解决办法是只保留最新一期定期报告的年度累计字段,不用任何跨期间拼接。同时,在数据入库时强制记录报告期标识,凡是报告期不一致的数据,直接拒绝入池。
4.3 API成本失控:钱是怎么悄悄烧掉的
我预算模型调用大概900块,结果第一批100家跑完就烧了小一半。排查之后发现两个原因:一是模型返回的格式不稳定,我为了让输出变严谨,在提示词里加逻辑链说明,结果每次返回都带出一大串解释;二是输入里带了太多用不上的公告原文,token直接爆掉。
优化办法也很实在:把提示词里的解释改成"尽量简洁、不超过指定字符",输出格式则让它"必须按要求返回JSON字段",一次成功的重试成本远比分次失败低。成本压下来之后,我才真正理解"提示词工程"这四个字有多值钱。
4.4 结果不能直接当买入信号
这是我最想强调的一件事。初筛出来的"基本面强"公司,只能说明它过去一段时间的财务报表结构不错,不代表它未来股价会上涨。基本面强跟能赚钱之间,还隔着估值位置、行业景气、市场情绪、流动性、政策变化等一大堆因素。
所以我把这次结果定位成"候选池",不是"买入名单"。池子里的标的,后面还要做估值拆分、产业链对比、管理层质地分析。初筛的价值是缩小范围,不是替代决策。
5. 事后复盘:如果重来一次我会怎么做
5.1 该加大投入的不是模型,而是数据清洗
实操跑完,我最大的体会是:整个流程里最花时间的环节不是AI调用,而是数据清洗与口径核对。我大概统计了一下,真正的模型生成摘要只花了两三个小时,而数据采集、清洗、口径校验、人工复核加起来花了超过四倍时间。
所以如果再来一次,我会把更多预算花在数据质量和字段完备性上,而不是追求更强的模型。模型能力早就够用了,瓶颈永远在"喂给模型的数据是不是可信"。
5.2 提示词模板值得反复迭代
第一次跑批的提示词和最后一次的提示词,之间改了至少五版。从开始的大段自由发挥,到最后严格限定角度和字数,输出质量提升非常明显。建议你在正式跑600家之前,先用20到30家的交叉验证集把提示词打磨稳定,再放量。
5.3 这套流程完全可以扩展成每周增量跑批
600家整批跑完是一个里程碑,但它不应该就此终止。财报季度更新之后,完全可以把增量逻辑做成定时任务,只跑最新报告期有变化的公司,再跟上一期结果做差分。这样下来,你手里就等于有了一张持续更新的基本面温度表。
我个人后续的计划,是把基本面打分结果跟行情数据做延迟相关性回测,看看哪些指标对后续半年的表现更有区分度。这套东西做好之后,筛600家的平均成本会进一步下降,因为框架已经稳定,剩下的只是维护和更新。
说到底,用AI做基本面筛选这件事,真正的门槛不在工具贵不贵,而在你有没有把自己的判断标准想清楚。工具永远在进步,但你怎么定义"好公司",这件事只有你自己能答。