
简介一份聚焦人工智能投资主题的上市公司梳理文档面向关注AI赛道的投资者、行业研究员及科技公司从业者可帮助快速了解A股市场中各家公司的人工智能布局与业务方向。文档为单个docx文件体积仅32KB轻量便携适合随时查阅。目前已有440人学习使用。内容按计算机、机械设备、传媒、医疗、通讯等行业分类系统整理了腾讯控股、科大讯飞、海康威视、大华股份、中科创达、机器人等数十家上市公司的AI切入点涵盖机器学习、语音识别、计算机视觉、智能安防、工业机器人、智能驾驶、智慧医疗、大数据营销等细分领域并为每家公司标注股票代码和主要业务关键词。既可用于行业扫描也能作为AI概念股索引帮助读者从庞杂市场中快速筛选潜在关注标的是一份精炼实用的AI产业公司速查清单。1. 人工智能A股上市公司梳理到底在梳理什么当你说“人工智能A股上市公司”的时候你指的是四年前就开始把“AI制造”写进年报的传统企业还是真正靠算法、算力、数据创造收入的技术公司我第一次搭AI产业链标的池时靠概念板块拉出来的名单有400多家用行业分类过滤后剩不到70家再叠加上研发费用率和专利IPC校验最后只剩40家出头。这个落差不是数据噪声而是定义标准没有前置导致的。所谓梳理第一步不是爬数据而是确定什么样的公司算人工智能公司。这篇文章按我常用的流程展开先立一个可落地的界定框架再用AKShare和Tushare把候选池跑出来接着把公司归位到产业链环节里末了用一个专利校验加两期差异对比的技巧让清单可以长期维护。读者如果是做投研数据、指数跟踪或行业研究的IT工程师可以直接照着这套流程复现。2. 人工智能A股公司的界定先立五层框架再谈筛选2.1 人工智能产业五层结构芯片、算力、模型、平台与应用很多梳理文档失败是拿“人工智能”三个字当行业用但A股没有一个“人工智能申万行业”。实际上AI公司分布在电子、计算机、通信、机械、汽车、医药等十几个一级行业里。我一般先按产业角色拆成五层基础算力、数据与工具、算法与模型、平台与服务、行业应用与终端。拆层的意义在于筛选时每一层用的验证指标完全不同。芯片公司看流片和客户导入大模型公司看研发费用率和专利应用公司看项目订单里的AI含量。生成式人工智能带动的大模型公司大多落在算法与模型层这个位置的公司普遍特征是重研发、轻资产、高毛利跟做AI服务器的硬件公司是完全两种财务形态。这个粒度用一张表来承载最清楚层级典型业务A股常见行业归属首选验证字段基础算力AI芯片、加速卡、AI服务器、液冷电子、通信、计算机AI相关营收占比、大客户名单数据与工具数据集、标注、数据治理计算机数据业务是否单独披露算法与模型大模型、CV、NLP、语音引擎计算机研发费用率、专利IPC平台与服务MaaS、AI开发平台、私有化部署计算机、通信订阅与云收入占比行业应用与终端AI安防、智能驾驶、机器人与智能硬件计算机、汽车、机械智能硬件销量、含AI订单这张表也是后面代码筛选的“主键”。每一行对应一套关键词和一组财务口径千万不要拿同一套关键词过滤所有公司否则做出来的清单会偏向某一个环节。比如只按“智能”筛会把做智能家电控制器、智能仪表、智能物流柜的传统公司全部卷进来而这些公司可能没有任何模型和算法自研能力。2.2 三个硬指标识别“真AI公司”业务占比、研发费用率与专利DNA行业归属只是第一道网落到每家公司还要过三个硬指标。第一个是AI相关业务营收占比年报“主营业务分行业情况”里会披露但口径混乱很多公司把“智能产品”和“AI产品”混在一起我一般把这条作为人工复核项而不是硬过滤项。第二个是研发费用率AI公司通常高于10%核心算法公司通常在15%到30%之间用这个指标能把一批“贴牌智能”的公司筛出去。第三个是专利IPC分类真正做算法和算力的公司专利IPC里会高频出现G06N、G06V、G10L这类分类号这个信息独立于财报适合做交叉验证。这三个指标的实现顺序也有讲究。我先用研发费用率做批量过滤因为财务数据最好取专利IPC做二次校验放在最后一章细说业务占比则留在人工复核阶段避免在批量阶段被年报口径带偏。反过来先做业务关键词扫描会让结果被营销话术污染。人工智能概念最热的时候很多公司的年报里会出现“积极拥抱AI”“AI赋能主营业务”这类表述但这些文本不会变成开发支出更不会变成专利所以硬指标的顺序不能乱。2.3 公开人工智能主题指数只能当候选池不能当结论无论是中证还是国证人工智能主题指数都有现成的成分股名单很多梳理工作直接照抄结果就是不同指数口径不一致有的偏算力基础设施有的偏AI应用软件有的还混入了不少智能家居和智能电网。我通常把两到三个主题指数的成分股拉出来做并集作为候选池的起点而不是终点。这种做法能覆盖更宽的产业边界同时避免单一指数在调仓周期内的滞后。候选池确认后再用前面五层框架手工给每家公司贴标签这个贴标签的工作不会一次到位需要跟着财报周期滚动修正。3. 用AKShare与Tushare把人工智能A股公司池跑出来3.1 数据源选型AKShare抓概念Tushare保字段稳定实际动手时我一般并行用两个数据源。AKShare免费、不需要token可以直接拉东方财富的概念板块和成分股适合一次性快筛Tushare需要注册token但stock_basic的基础资料返回稳定适合保存成快照做历史对比。这里不讨论哪个数据源更好而是先说清楚各自的坑。AKShare的接口是网页抓包实现的板块名称和字段会随页面改版变化经常出现“今天还能跑下周接口字段变了”的情况Tushare的行业分类粒度较粗一家做AI芯片的公司会被分到“半导体”或“元器件”只看行业字段会漏掉跨行业标的。所以在流程上我的取舍是用AKShare拉概念成分股做大池子用Tushare补行业、上市状态和财务指标最后用代码做交并集运算。这样即便某一单接口临时失败清单也不会完全缺失。3.2 从东财“人工智能”概念板块拉取成分股先看AKShare的快筛路径import akshare as ak # 1. 拉取全部概念板块模糊匹配“人工智能”相关板块 board_list ak.stock_board_concept_name_em() ai_board board_list[board_list[板块名称].str.contains(人工智能)] # 2. 取第一个匹配板块的成分股 symbol ai_board[板块名称].iloc[0] ai_stocks ak.stock_board_concept_cons_em(symbolsymbol) # 3. 只保留需要的基础字段 ai_stocks ai_stocks[[代码, 名称]] print(len(ai_stocks), ai_stocks.head())这段代码逻辑很直接第一步把东方财富全部概念板块拉回来用str.contains(人工智能)做模糊匹配而不是写死板块名。之所以模糊匹配是因为东财的概念板块经过多次拆分出现过“人工智能”“人工智能1”“AI人工智能”等变体写死字符串很容易在下次抓取时落空。第二步拿到板块名称后把它原样传给stock_board_concept_cons_em取成分股。第三步只保留代码和名称少带冗余列后面做merge时更干净。这一步拿到的是“东财认为属于人工智能”的公司偏向题材而不是基本面量大、噪声也多。接下来要用Tushare做行业过滤和财务硬指标过滤。3.3 行业白名单与关键词表双重过滤Tushare取股票基础信息时先用行业白名单卡一遍import tushare as ts pro ts.pro_api(你的token) stock_basic pro.stock_basic( exchange, list_statusL, fieldsts_code,symbol,name,industry,market ) # 打印全部行业肉眼圈定与AI相关的行业 print(stock_basic[industry].unique()) industry_allow [ 软件服务, 半导体, 通信设备, 元器件, 电脑设备, 汽车整车 ] cand stock_basic[stock_basic[industry].isin(industry_allow)] # 名称关键词表宁可多召回不可漏 ai_kw [人工智能, 智能, 机器, 算力, 模型, 算法, 视觉, 语音, 数据] name_hit cand[cand[name].apply(lambda x: any(k in x for k in ai_kw))] print(name_hit[[ts_code, name, industry]].head(10))提示行业白名单不要照抄不同数据版本的行业命名差异很大。先执行打印industry.unique()再人工圈定比闷头写死一份名单更稳。这段代码的两个参数值得单独说明。第一个是list_statusL只保留上市状态退市和暂停上市的公司去掉避免后面做时间序列对比时出现幽灵标的。第二个是industry_allow白名单这个名单需要按实际返回结果确认主要目的是把明显和AI无关的行业排除掉而不是把AI公司精确圈出来。名称关键词过滤是个双刃剑。名字里带“智能”的公司通常和AI相关但反过来名字里没有关键词的AI龙头会被漏掉。比如安防领域的头部公司名字里就不含“智能”。所以名称过滤只能作为召回手段不能作为排除手段漏掉的公司要靠概念板块成分股并集来补。这也是为什么我坚持把AKShare的大池子和Tushare的白名单结果做交集与并集而不是只取一路数据。3.4 合并双源结果输出带来源标记的候选清单import pandas as pd # ai_stocks 来自东财概念板块name_hit 来自关键词过滤 pool pd.concat([ ai_stocks.rename(columns{代码: code}), name_hit.rename(columns{ts_code: code, name: name}) ], ignore_indexTrue) pool[code] pool[code].astype(str).str.zfill(6) pool pool.drop_duplicates(subsetcode, keepfirst) # 标注来源方便后续回溯 pool[from_concept] pool[code].isin(ai_stocks[代码].astype(str).str.zfill(6)) pool[from_keyword] pool[code].isin(name_hit[ts_code].str[-6:]) pool.to_csv(ai_pool_raw.csv, indexFalse, encodingutf-8-sig)这里有个细节是股票代码的统一格式。东财返回的“代码”是6位字符串Tushare返回的ts_code是“600000.SH”格式直接做去重会把同一条标的当成两条。所以我统一补零或截断让所有代码都是6位再对比。zfill(6)处理的是东财那边可能出现的前导零丢失问题截断ts_code的.SH后缀则需要在数据清洗阶段完成。drop_duplicates配合keepfirst保留了先出现的来源后续如果需要统计“双源命中”再单独用from_concept和from_keyword两个布尔列去算。文件名用utf-8-sig是为了让Excel直接打开不乱码这也是交付给业务同事时的常见需求。到这里候选池已经有了但还不是最终答案因为东财概念会掺入蹭题材的公司关键词表也难免误伤。下一章把这些公司往产业链环节上归位归位的过程本身就是一次过滤。4. 从公司清单到产业链图谱让人工智能上市公司各归其位4.1 公司-业务-环节映射表的结构设计拿到候选池之后最重要的工作是给每家公司打“环节标签”。我通常维护一张映射表字段包含公司代码、公司简称、一级环节、二级业务描述、数据来源、最近验证日期。一级环节就是第2章里的五层二级业务描述写成短语比如“AI服务器”“智能驾驶域控”“NLP中间件”。这张表的价值在于它把“这家公司是AI公司”这个模糊判断变成了“这家公司处于AI产业链的哪个位置”这个可检索的事实。映射过程不可能全靠自动文本匹配只能给出建议标签。常见做法是把候选池的公司主营业务文本和五层关键词表做相似度计算给每个公司推荐三个候选环节再由人做一次确认。这个预处理步骤可以用相似度做粗排但不要直接自动打标。因为一家做机器视觉的公司主营业务文本里可能同时出现“智能制造”和“智能检测”行业应用还是卖设备搞错环节会把产业链分析完全带偏。4.2 用图结构找出跨环节的隐形枢纽公司把映射表读成图之后会得到一些单看财务指标发现不了的信息。我一般用networkx构建一个“公司-业务标签”二分图公司的点连接它所属的所有业务标签然后算每个节点的度中心性。度高的公司不一定市值最大但它的业务横跨多个AI环节一旦这类公司出现经营波动会影响上下游多家公司这在产业链风险分析里很关键。import networkx as nx import pandas as pd edges pd.read_csv(ai_mapping.csv) # 列: company_code, company_name, tag G nx.from_pandas_edgelist(edges, company_code, tag) hub_scores pd.Series(dict(G.degree())).sort_values(ascendingFalse) print(hub_scores.head(20))这段代码的核心参数是from_pandas_edgelist它自动把两列数据变成图的无向边。度中心性在这里的意义是“这家公司挂了几个业务标签”横跨环节越多度数越高。用company_code而不是company_name做节点是因为A股偶尔出现改名新名称和老名称会破坏图的连续性。degree返回的是node: 度字典包一层pd.Series后排序输出前20名。注意这个度数不是业务规模只代表产业链覆盖宽度所以结论里要把“环节覆盖广”和“单一环节市占率高”分开表述。4.3 用年报经营分析文本反查标签是否失真图跑完之后还要过一次“反查”。我从年报的“经营情况讨论与分析”章节里抽取每家公司的文本把映射表的标签做成关键词字典逐个统计在每个公司的年报里出现了多少次。如果一个公司被标成“智能驾驶”但年报全文里与驾驶、域控、雷达相关的词语只出现两三次这个标签就值得怀疑。反之一家公司被标成“AI芯片”年报里却大量出现“数据中心”“算力”“NPU”说明它的业务重心可能正在从硬件向算力服务迁移需要更新标签。import re tag_keywords { AI芯片: [GPU, NPU, ASIC, 流片, 制程], 智能驾驶: [域控, 毫米波, 高精地图, NOA, 行车], NLP: [自然语言, 语义, 对话, 预训练, 意图], } def verify_tag(annual_text, tag): kws tag_keywords[tag] hits {kw: len(re.findall(kw, annual_text)) for kw in kws} return sum(hits.values()), hits text 示例年报文本 score, detail verify_tag(text, AI芯片) print(score, detail)这个反查方法带有明显的工程妥协正则匹配会把竞争对手的名字、行业综述里的词汇也算进来造成虚高。所以我的做法是把命中分数从高到低排列抽分数最高的前20%和后20%人工复核而不是对全名单做硬性判断。反查的作用是给人工复核指出优先级真正把标签推翻的还是阅读年报对应章节。即便如此这类文本检索能把一个200家公司的标签核查任务压缩到只需要精读三四十家效率提升是可感的。5. 用专利IPC和两期差异清单给人工智能梳理结果做校验标签归位之后清单在结构上已经完整但还差最后一道客观证据。AI公司最容易被质疑的是名不副实这时候专利数据比年报文本更可信。我按IPC分类号做批量校验G06N对应机器学习与神经计算G06V对应图像识别G10L对应语音处理。每家公司取近三年发明专利申请量按这些分类号做加权汇总。真正做算法研发的公司这些分类号的专利数量通常不是零如果一家被标为“大模型”的公司在这几个分类上没有任何申请记录基本可以断定算法自研能力存疑。需要提醒的是专利检索要注意申请人名称里的历史曾用名A股公司改名频繁要合并同一个主体的多个名称再统计。# 伪代码专利IPC命中校验 ai_ipc [G06N, G06V, G10L] def ipc_hit_count(patent_list, ai_ipc): return sum(1 for p in patent_list if p[ipc].startswith(tuple(ai_ipc)))专利校验通过后清单要进入维护状态。我遇到过最实际的问题是梳理文档做完一个月市场就变了新增了大量AI概念挂牌公司旧清单很快过时。解决办法不是重跑整个流程而是把上一期清单和本期清单做差集生成“新增”“剔除”“维持”三份名单。新增名单优先看因为新进池的公司往往带有最新题材或最新业务剔除名单也要看剔除可能因为行业分类调整可能因为退市风险也可能因为这家公司主动剥离了AI业务。这几种原因对应完全不同的处理动作。import pandas as pd prev set(pd.read_csv(ai_pool_2024Q4.csv)[code]) curr set(pd.read_csv(ai_pool_2025Q1.csv)[code]) added curr - prev removed prev - curr print(新增标的:, len(added)) print(剔除标的:, len(removed)) pd.DataFrame({新增代码: list(added)}).to_csv(diff_added.csv, indexFalse)到这里整个梳理流程形成了一个可以滚动运转的闭环概念板块快筛、行业与关键词召回、产业链标签归位、专利证据校验、两期差异对比。每期维护只需要把新增和剔除两条名单做人工复核而不是把几百家公司重新过一遍。把这份差异清单直接追加到梳理文档的附录页下期维护时先读附录再决定要不要重新拉全量数据。本文还有配套的精品资源点击获取