做这个“漂AI指数”的起因特别简单我在整理上市公司年报文本时发现从2010年到2024年“人工智能”这个词在定期报告里的出现频率几乎成倍往上蹿但很多公司的研发人员数量、研发费用投入、AI相关收入却纹丝不动有的甚至还在往下走。一边是词频暴涨一边是投入不涨中间这条落差带就是典型的“漂AI”。所谓漂AI是我从ESG领域“漂绿”概念借来的说法指的是企业在信息披露里大量使用AI相关词汇、描绘AI战略但实际业务、资源配置和专利成果并没有跟上。说得直白一点话说了很多事没做多少。这种“言行不一”在文本数据里其实藏不住——只要把年报中的AI词频和财务底色放在一起对照偏差立刻就显形。这篇文章会把整个项目从0到1拆开讲2281家上市公司样本是怎么筛出来的、2010到2024的时间窗为什么这样选、AI关键词词典怎么搭、漂AI指数的计算公式怎么定、以及我在清洗年报PDF和跑数时踩过的各种坑。无论你是做量化研究、信息披露分析还是单纯对“哪些公司在认真搞AI、哪些公司只是嘴上说说”这件事感兴趣这篇都能给你一套可直接落地的操作框架。1. 项目整体设计为什么盯上“言行不一”1.1 从漂绿到漂AI本质都是预期管理“漂绿”这个词大家应该不陌生讲的是企业把环保标签往自己身上贴实际减排动作却寥寥无几。AI领域这几年出现了完全一样的现象市场给AI故事很高的估值溢价企业就有动力在年报、公告、投资者关系活动记录里反复提及人工智能让外部人觉得它已经站在风口上。这种行为背后是典型的预期管理逻辑。文本披露成本极低写一段“公司将积极拥抱大模型技术赋能业务智能化转型”只需要一行字但要在研发端、产品端、收入端真正落地成AI业务需要真金白银和长时间的积累。当低成本宣传能带来高估值反馈时文本内容就会先于业务内容膨胀。漂AI指数想做的事情就是把这层“预期管理的水分”挤出来。它不是去判断一家公司有没有AI业务而是去度量它在信息披露中表现出来的AI热情和它在资源配置、业务结果中体现出来的AI实绩到底偏离了多远。1.2 样本池与2010-2024时间窗的取舍项目标题里的2281不是随手抓来的数字而是经过一串剔除后剩下的样本量。我在建池子时依次做了这么几个动作从公开披露数据的上市公司股票池起步先剔除金融类公司。金融企业年报里“智能风控”“智能客服”属于常规业务描述词频逻辑和非金融差异太大混在一起会严重污染文本指标。剔除上市不满三年的公司这类公司刚上市时年报披露节奏和业务结构都不稳定词频和财务数据的可比性差。剔除关键财务字段连续缺失、年报PDF无法提取有效文本的样本。最后得到2281家并拉出2010到2024年共15年的披露数据。时间窗从2010年开始主要原因是再往前的年报电子化质量参差不齐大量扫描版PDF根本无法稳定抽取文本而且2010年之前“人工智能”在企业年报里出现次数太少词频分布几乎全是零做出来的指数没有区分度。2010年开始覆盖了深度学习兴起、产业落地、再到生成式大模型爆发这几轮完整周期既能看出整体词频膨胀趋势也能观察不同类型公司的漂AI行为如何随时间变化。1.3 指标整体框架文本热度对财务底色的偏离漂AI指数从框架上可以简化成一句话把“说出来的AI”和“做出来的AI”分别量化再求差值。“说出来的AI”我用三个文本维度度量AI关键词在年报中的出现强度、AI相关表述的具体程度、以及AI词频随时间的增长速度。“做出来的AI”则看三个财务维度研发费用投入强度、研发人员占比、以及年报中披露的AI相关业务收入或相关项目进展。这六个维度缺一不可。只看词频会误伤那些真正在做AI、因而不得不大量提及技术的公司只看研发投入又无法识别那些钱花了但业务定位模糊的样本。把它们放在一起做偏离度计算才能识别出“文本过分领先于业务”的公司也就是漂AI指数最高的那一批。2. 数据准备与关键词词典指数质量70%取决于清洗2.1 年报PDF解析与章节切片做文本类指标的人最容易犯一个错误把整份年报全文拿去跑词频。年报里面有大量重复的法律提示、财务附注、审计报告模板这些内容会把AI词频稀释得很厉害导致真正有信号价值的管理层讨论与分析部分被淹没。我当时的处理思路是先把年报PDF按章节切出来只保留管理层讨论与分析、董事会报告这类经营分析章节。具体做法是先解析PDF目录定位章节标题再按页面范围截取文本。工具上我用的是pdfplumber配合PyMuPDF前者对文本层PDF的解析稳定性好后者处理页面坐标和目录结构更快。这里有一个很关键的细节年报PDF必须确保是带文本层的版本。很多投资者关系页面挂出来的年报其实是扫描图片直接解析会得到一堆空白。遇到这种文件我的做法是先记录文件路径统一交给OCR流程处理而不是硬解析导致后面词频全部偏低。2.2 AI关键词词典的搭建与扩充词典好坏直接决定指数可信度。我最初的词表只有十个词左右后来发现完全不够用问题在于不同年代AI相关表述差异非常大。2012年叫“人工智能”“模式识别”2016年流行“深度学习”“神经网络”2020年后又冒出“大模型”“AIGC”“生成式模型”。如果词表固定在某个时点就会系统性低估后几年和新概念的关联强度。处理办法是分层建词表核心词如人工智能、AI、机器学习、深度学习、神经网络、自然语言处理、计算机视觉、语音识别、知识图谱。这些词贯穿整个窗口期语义稳定。场景词如智能驾驶、智能机器人、智能客服、智能风控、智慧医疗、智能制造。这类词说明AI落到具体业务方向。趋势词如大模型、预训练、生成式模型、AIGC、多模态、智能体。这类词主要用来捕捉后期概念热度。词表建好之后我还会对每一个词做人工抽样复核随机抽几十段包含该关键词的上下文确认它在年报里确实指代AI技术而不是某些公司名称或会议名称里的同名缩写。这一步看着笨但能把误判率降下来一大截。2.3 词频统计与归一化词频统计不能只看绝对次数因为年报篇幅差异很大。有的公司管理层讨论与分析写了七八万字有的只写了两万字同样出现20次AI词信息密度完全不同。所以我把命中次数除以章节总字数换算成“每百万字AI关键词出现次数”再进入后续计算。但这还不够因为不同行业的AI词频基准差异极大。计算机、通信行业年报里出现AI词是正常现象食品、纺织行业出现一次都算异常。因此我在归一化时会按“年度行业”分组把每家公司的词频密度转化为行业内部的百分位排名。这样做的好处是彻底消除了行业基准差异让跨行业比较成为可能。3. 漂AI指数构建把“会说”和“会做”放上天平3.1 六个核心维度的度量口径漂AI指数的六个维度每个都有明确的指标定义和数据来源。我整理了一张表方便你对照落地维度数据来源度量口径归属AI词频强度年报管理层讨论与分析文本AI关键词命中数/章节总字数换算每百万字词频后分年分行业取百分位说的部分文本具体度年报文本同时包含场景词和核心词的段落占比纯概念词不给分说的部分词频增速相邻年度文本当年词频相对于前三年的复合增速用百分位压缩极端值说的部分研发投入强度财务数据研发费用/营业收入分年分行业取百分位做的部分研发人员占比财务数据研发人员数量/员工总数分年分行业取百分位做的部分AI业务落地度财务与项目披露是否有明确AI方向收入、重大研发项目、专利等落地证据有则高分做的部分这里最花时间的是“AI业务落地度”。它不是纯财务字段需要我去年报文本里打标看公司是否披露了可以验证的AI产品或项目。比如某公司写了“自研智能仓储调度系统报告期内实现营收3000万元”这就是落地证据如果只写“公司高度重视人工智能技术发展”则不给分。3.2 偏离度打分公式与权重逻辑六个维度算出来后下一步是把“说的部分”和“做的部分”合成为一个漂AI分数。我用的公式是漂AI指数 50 (0.5×词频强度百分位 0.3×文本具体度百分位 0.2×词频增速百分位) - (0.5×研发投入强度百分位 0.3×研发人员占比百分位 0.2×AI业务落地度百分位)然后再对结果做一次0到100的截断保证分数范围可控。公式里的权重不是拍脑袋定的我做过多轮敏感性测试把权重上下浮动十个百分点观察排名前100的公司变化量稳定性差的权重直接淘汰。为什么用百分位而不是原始值因为百分位天然解决了单位和量纲问题研发费用率、人员占比、词频密度放在一起相加才有意义。再加上行业和年份分组百分位本身已经剔除了行业属性差异。还要提醒一句百分位计算有个前置条件只有当文本维度达到一定信号强度时才把公司放进“有比较意义”的池子。如果一个行业里AI词频普遍接近零某家公司偶尔提了一次AI词频百分位会直接冲到99%这肯定不是真实信号。我的处理是设定最低命中阈值AI关键词命中次数低于5次的公司文本维度不参与百分位计算直接置零。3.3 分数分级与行为画像漂AI指数算出来后我会把它切成四档方便后续分析使用指数80分以上定义为“重度过分包装”AI词频极高研发投入和落地证据都很弱基本可以判断为典型漂AI。指数60到80分定义为“轻度包装”提到AI的次数不少但部分指标还能对上处于灰色地带。指数40到60分定义为“言行基本一致”词频和投入大体匹配可能有真实布局。指数40分以下定义为“务实投入”提到AI不多但研发和落地证据充足常见于真正闷头做技术的公司。举个例子某机械制造类公司连续三年在年报中大谈“智能制造”“AI质检”词频排在行业前5%但研发费用率连续三年低于行业30%分位AI业务收入为零它的漂AI指数很容易冲到85分以上。另一家消费电子企业平时很少提AI但研发费用率常年行业前10%海外子公司涉及算法团队的业绩披露漂AI指数就稳定在40分附近。这个分级的意义在于它不是给公司贴一个“假AI”的定性标签而是提示关注哪些公司存在文本与资源、结果之间的严重脱节值得进一步深挖。4. 实操过程与代码实现从年报文本到可直接发布的指数4.1 环境准备与依赖库整套流程用Python实现核心依赖是pdfplumber、pandas、numpy、re、jieba。其中jieba主要用于词表构建阶段的初筛和快速分词真正做词频统计时我建议直接用正则表达式做关键词匹配而不是把全文分词后再匹配。原因是中文分词对“大模型”“AIGC”这类词非常不稳定。“大模型”经常被切成“大”和“模型”“AIGC”有时会被识别成未知词分词后再统计会漏掉大量命中。直接用正则匹配固定词表虽然看起来不如分词智能但胜在稳定、可解释、可复核。数据规模方面2281家公司15年的年报数量接近三万份单机跑一遍完整流程大约需要一天左右。如果只是做方法验证可以先跑最近一年数据把全流程走通再铺开。4.2 关键代码片段文本抽取、词频统计、指数合成第一步抽取年报文本。只提取管理层讨论与分析等核心章节。import pdfplumber def extract_report_text(pdf_path, start_page, end_page): text with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages[start_page-1:end_page]: page_text page.extract_text() if page_text: text page_text \n return text第二步用正则匹配AI关键词统计命中次数和章节总字数。import re ai_keywords [ 人工智能, ai, 机器学习, 深度学习, 神经网络, 大模型, 预训练, 生成式模型, aigc, 多模态, 自然语言处理, 计算机视觉, 语音识别, 知识图谱, 智能驾驶, 智能机器人, 智能客服, 智能制造 ] def count_ai_mentions(text): text text.lower() total_chars len(text) counts {kw: len(re.findall(re.escape(kw.lower()), text)) for kw in ai_keywords} total_hits sum(counts.values()) freq_per_million total_hits / total_chars * 1000000 return total_hits, freq_per_million第三步读入财务数据后用分组百分位计算漂AI指数。import pandas as pd import numpy as np # df包含字段code, year, industry, ai_freq, rd_intensity, rd_personnel, ai_revenue_score # 按年度行业分组计算百分位 df[rank_ai_freq] df.groupby([year, industry])[ai_freq].rank(pctTrue) df[rank_rd] df.groupby([year, industry])[rd_intensity].rank(pctTrue) # 指标合成并截断到0-100 df[drift_index] 50 100 * (0.5 * df[rank_ai_freq] - 0.5 * df[rank_rd]) df[drift_index] df[drift_index].clip(0, 100)上面只是最简化的形式完整版本还要把文本具体度、词频增速、研发人员占比、落地度全部纳入。简版代码的意义是让你快速看到核心逻辑一切都围绕“文本热度百分位财务投入百分位”的差。4.3 输出表结构与数据复查跑完指数后我建议导出一张长表字段至少包含脱敏证券代码、年份、行业、AI词频、每百万字词频、研发费用率、研发人员占比、落地度评分、漂AI指数、漂AI分档。导出CSV后不要急着拿去用先做几项基础复查抽取10家指数最高的公司和10家指数最低的公司人工回到原文核对。检查是否有异常值比如某家公司词频突然从0跳到行业第一通常意味着年报口径变化比如做了重大资产重组。按年份看均值稳定性如果某一年指数均值突然大幅抬升需要确认是不是词表或PDF解析出了问题。5. 常见问题与排查技巧实录做文本指数最容易踩的坑5.1 PDF解析断行乱码导致词频失真这是文本类研究最普遍的坑。部分年报PDF虽然带文本层但排版复杂表格、页眉页脚、目录目录编号混在正文里抽取出来的文本经常出现断行错位。比如“人工智\n能”被切在两行正则就匹配不到。我的排查方式是先随机抽五份年报人工对比抽取文本和原文片段确认文本连续性和完整度。出现断行时最简单的修复是把所有换行符替换成空格或者直接拼接后再做匹配text text.replace(\n, ).replace(\u3000, )但要注意把所有换行删除会导致段落边界丢失影响后续按段落计算“文本具体度”。所以更好的做法是保留换行但在匹配前先做一次“去断行”处理统计词频时用拼接后的版本计算具体度时用保留段落的版本。5.2 词表主观性太强怎么降低偏差不少人会质疑你凭什么选这30个词而不是另外30个这个质疑完全合理。词表决定成败所以我做了三件事来对冲主观偏差词表按核心词、场景词、趋势词分层每一层独立计算命中率不混合汇总。让不同的人分别独立扩充词表然后取并集避免个人偏好导致遗漏。做敏感性分析删掉最容易引发争议的“智能”类宽泛词重新计算指数看排名变化。“智能”这个字眼是最危险的。它经常出现在“智能手机”“智能电网”“智能化管理”等场景里和AI技术并不完全等价。如果直接把“智能”放入词表很多传统制造企业的词频会虚高漂AI指数失真。我最终的做法是只保留“智能驾驶”“智能机器人”“智能客服”等复合场景词禁止单独统计“智能”。5.3 研发投入口径在2018年前后不一致这个坑不在文本而在财务数据。2010到2024年研发费用在财务报告中的披露要求变化很大。早期很多公司没有单列研发费用要么缺失要么混在管理费用里。如果直接把缺失值当0处理会狠狠高估早期公司的漂AI程度。我的处理是先做口径对齐凡是研发费用数据缺失的年份优先用管理费用附注中的研发支出替代仍然找不到的该年度研发投入强度置为缺失不参与百分位计算而不是填0。这个细节如果不注意时间趋势完全没法看。5.4 行业百分位在“高AI浓度”行业里的失真计算机和通信行业的公司几乎家家都提AI词频百分位在头部被压得很扁第三名和第三十名可能只差几个词。这种情况下百分位的微小波动会被指数放大。解决办法有两个一是在分组计算百分位之前对词频做缩尾处理把超过99%分位的极端值拉回99%分位二是把“文本具体度”权重提高。一个行业如果人人都在说AI那谁说得更具体谁就更可能是真做纯词频已经没有鉴别力了。5.5 幸存者偏差与未来信息污染这是我做数据时最警惕的一点。如果我只是用2024年的研发现状去评价一家公司2020年的漂AI程度等于用未来信息评价过去行为逻辑上是错的。所以时间序列上的每个年度指数都必须只用截至该年度已公开的信息来构建。某公司2023年营收暴增是因为AI业务爆发但这不能成为降低它2020年漂AI分数的理由。一旦把未来信息混进去整个面板数据就失去了因果解释力变成一锅粥。我把这些坑整理成一张速查表方便你直接对照异常现象可能原因处理办法某公司词频全部为零PDF是扫描版或文本层缺失转OCR流程处理高频词集中在“智能”词表过宽删除宽泛词改用复合场景词指数在2018年突然跳升研发费用披露规范变化统一口径缺失置空行业内部排名剧烈波动行业整体词频低导致百分位陡峭加最低命中次数门槛和缩尾某年指数整体偏高词表混入当年突发热词按年份分别统计核心词和趋势词6. 指数落地与进一步延展6.1 从静态指数到动态追踪漂AI指数如果是逐年单独算能看到静态的“谁在漂”但抓不到“谁开始漂”。我在项目后半段又加了一个追踪维度把连续三年都拥有稳定低指数的公司看作对照组观察每年新进入高分组的新面孔重点关注它们的词频增速与研发投入增速之间的“剪刀差”。这个动态版本比静态指数更有意思。某公司第一年研发投入大幅增长第二年AI词频同步上升第三年落地收入出现这是正常的技术布局节奏。反过来第一年公司业务毫无AI动静第二年年报里突然密集出现大量AI词汇同时研发费用率还在下滑这就是非常典型的“临时蹭热点”信号。做动态追踪时时间窗的设定很关键。我推荐用滚动三年窗口当年为t年取t-2到t年的词频和投入数据要求公司必须在这个窗口内持续存在避免新上市公司因基数低而造成增速虚高。6.2 指数使用中的边界与几个提醒指数做完以后我最想提醒的一点是漂AI指数衡量的是“披露与投入的偏离程度”不是“AI含量多少”更不是投资建议。高分只能说明一家公司说的和做的不匹配不能直接推导出它在撒谎也可能是阶段性战略未披露、业务落地周期较长。在我实际动手分析后还发现三个有价值的扩展方向。一是把指数和后续几个报告期的营收结构变化对照观察高漂AI公司的业务承诺是否能兑现这比单纯看词频更有说服力。二是把文本具体度单独拎出来做指标看哪些公司愿意在年报里提及具体AI产品名、金额、客户案例这部分文本质量往往比词频更能预判业务真实性。三是人工复核流程我每次跑完新一年数据都会随机抽二三十家公司回到年报原文逐段比对确保自动化打分没有把真正埋头做技术的公司误伤。这个过程很耗时但没有这步前面所有自动化处理都缺少信任基础。文本指数这种东西机器算出来之后终究要回到原文去感受它的温度。