☰
漂AI指数:从年报文本偏离度识别上市公司AI“言行不一”
2026/10/19 4:31:29 网站建设 项目流程

做这个“漂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(pct=True) df["rank_rd"] = df.groupby(["year", "industry"])["rd_intensity"].rank(pct=True) # 指标合成,并截断到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产品名、金额、客户案例,这部分文本质量往往比词频更能预判业务真实性。三是人工复核流程,我每次跑完新一年数据,都会随机抽二三十家公司回到年报原文逐段比对,确保自动化打分没有把真正埋头做技术的公司误伤。

这个过程很耗时,但没有这步,前面所有自动化处理都缺少信任基础。文本指数这种东西,机器算出来之后,终究要回到原文去感受它的温度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询