☰
上市公司百度指数数据清洗与实证研究全攻略
2026/10/25 9:03:19 网站建设 项目流程

简介:本资源是一套覆盖2011—2022年十年跨度的上市公司百度指数面板数据集,面向金融学、信息经济学、传播学及数字营销领域的研究者与高年级本科生/研究生,用于实证分析企业舆情热度、媒体关注度与股价波动、财务绩效或创新行为之间的关联性。压缩包共4个文件(2.69MB),含核心数据文件(Excel与Stata格式.dta,便于多软件兼容处理)、数据来源说明HTML文档(明确采集逻辑与清洗方法)及使用指南PDF(含字段释义与常见问题)。已有43人学习下载,适合开展面板回归、事件研究法或文本热度指标构建等实证任务。数据已结构化整理,时间粒度为日度,匹配A股上市公司代码与名称,可直接导入计量软件进行时序对齐与模型估计,显著降低数据获取与预处理门槛。

1. 项目背景:这一包数据到底能干什么

如果你手上刚好拿到一份名为"上市公司-百度指数(2011-2022年).zip"的压缩包,大概率你不是在随便整理素材,而是正在做与投资者关注度、市场情绪、公司热度或行为金融学相关的实证研究。百度指数这个东西,做量化的人叫它"注意力代理变量",做会计研究的人叫它"投资者关注度指标",做新闻传播的人可能单纯把它当舆论热度的度量。

不管你怎么称呼它,这个zip包的核心价值在于:它把2011到2022年这12年间,中国A股市场上市公司在百度搜索引擎上的搜索行为数据按公司维度做了切分。这12年恰好覆盖了移动互联网从崛起到完全普及的完整周期,也覆盖了A股从慢牛、疯牛、股灾、震荡到结构性行情的多个阶段。用这一份数据,你可以回答很多有意思的问题:上市公司被搜索得多,股价是不是真的会涨?负面新闻出来之后,搜索热度飙升是抄底信号还是逃命信号?小公司的搜索量和机构持仓之间有没有关联?

这篇文章我按实际使用的角度来拆解这份数据——不扯数据抓取的反爬细节,也不讲怎么用Python批量合并csv这种过于基础的操作,重点放在拿到这份数据之后,如何清洗、匹配、应用到实证模型里,以及那些文档里永远查不到但实操中一定会踩的坑。无论你是写毕业论文的金融硕士、做学术研究的博士生,还是想用注意力因子做增强策略的量化研究员,这篇文章应该都能帮你省下一周的摸索时间。

2. 核心变量拆解与数据口径

2.1 百度指数的指标含义,别搞混了

百度指数后台最常用的指标是"搜索指数",它表示关键词在百度网页搜索中被搜索的频次加权值。对于上市公司这个场景,最常见的关键词就是公司简称、公司全称或者股票代码。但这里有个关键的细节:同样叫"搜索指数",后台还有"搜索指数-整体"和"搜索指数-移动"的区分。整体值等于PC端加移动端的合计,2013年以前移动端的数据基本可以忽略不计,2015年之后移动端占比快速攀升。如果你做的是2011到2022年的长面板,我建议优先使用"整体"口径,因为移动端的单独序列在早期缺失太严重,硬拼在一起会人为制造断点。

资讯指数和媒体指数是另外两个容易被混淆的指标。资讯指数衡量的是关键词被资讯文章提及后的传播效果,本质上反映的是内容分发平台的推荐力度,不完全是用户主动搜索行为。媒体指数则是百度新闻收录的标题中包含该关键词的文章数量。做事件研究的时候,这三者可以配合起来用:搜索指数代表散户的主动关注,资讯指数代表信息扩散的覆盖面,媒体指数代表传统媒体的报道强度。三者一起放进模型里做稳健性检验,比单用搜索指数要扎实得多。

2.2 时间粒度的选择要从研究设计倒推

很多同学一打开zip包里的csv文件,发现每一行是公司代码+年月+四个指数值,就觉得"月度数据够用了"。月度均值确实是最常见的粒度,因为大部分公司财务数据都是季度或年度的,匹配起来天然对齐。但你如果做短线异象或者事件窗口分析,月度数据完全不够用。搜索热度在事件发生后的衰减非常快,公告后一周的热度和一个月均值体现的完全是两回事。

我个人的经验是:如果zip包里的数据只有月度均值,建议先确认一下原始文件名的来源。有些数据商提供的zip包里面实际上是"上市公司股票代码+日期(日度)+百度指数"这样的长表,只是文件名起得比较模糊。拆开以后先看列名,如果出现2011-01-01这样的日度时间戳,那恭喜你,你可以做的事情多得多。如果确定只有月度数据,那就把研究窗口设定在月频或季频,不要强行做日度分析。量纲对不上,结果必然是错的。

注意:拿到zip先不要急着写循环合并,第一步永远是打开一个样本文件,确认三件事——时间粒度是日还是月、指数口径是整体还是分PC/移动、证券代码格式是不是带交易所后缀。这三件事决定了后续所有处理方向。

2.3 文件命名和表格结构的常见形态

根据我拆过的类似zip经验,"上市公司-百度指数(2011-2022年).zip"内部文件命名通常有几种形态。第一种是按年度拆分,比如"2011.xlsx"、"2012.xlsx";第二种是按行业板块拆分,比如"银行.csv"、"医药.csv";第三种是比较理想的情况,一个大的csv文件直接包含所有年份全部公司。如果是前两种形态,你需要先写一个文件清单来梳理目录,再决定是按年度纵向拼接还是按行业横向拼接。若打开表格后看到列为"股票代码、股票简称、年份、月份、百度指数-整体、百度指数-移动、资讯指数、媒体指数",那这就是最标准的宽表结构,后面做面板回归非常顺手。

3. 数据清洗与匹配,我建议按这个链路走

3.1 证券代码的标准化处理

这部分看起来基础,但80%的匹配错误都出在这里。A股市场上,同一家公司在不同数据库里可能显示为"000001"(平安银行)、"000001.SZ"或"000001.SZ 平安银行"。百度指数数据里,如果原始抓取用的是股票简称做关键词,那么匹配到上市公司财务数据时需要用证券代码做主键。这里的关键操作是把股票代码统一成6位数字,再根据交易所规则补上后缀——以60开头的上交所主板补.SH,以00开头的深交所主板补.SZ,以30开头的创业板补.SZ,以68开头的科创板补.SH。北交所的股票代码是8开头或4开头,有些数据库不支持,建议先剔除或者单独处理,否则后续join的时候会出现大量空值。

另一个常被忽视的坑是股票简称变更。2011到2022年之间,很多公司改过名,有些一年内改两次都不奇怪。如果原始数据是以"股票简称"这个字段存的,你在不同年份的文件里看到同一家公司显示为"海康威视"和"海康威视"这种完全一样的倒还好,但"神州信息"改成"神州数码"、"乐视网"变成"乐视退"这类变更,会直接导致匹配断裂。处理方式是先用上市公司证券代码映射表把简称统一替换掉,而不是依赖简称本身去做关联。我自己常用的做法是先从CSMAR或Wind导出一份包含"证券代码-证券简称-变更日期"的参考表,再用代码做主键做一次lookup,把规范简称回填到百度指数数据里,这样即使原数据里只有简称也能通过多期映射恢复身份。

3.2 缺失值和零值怎么区分

百度指数数据最大的特点是"搜索量少的长期停牌股或冷门股会有大量缺失"。这里必须搞清楚一个概念:缺失不是零,零也不是缺失。在百度指数数据中,如果某只股票在某个月根本没有人搜,通常不会显示为0,而是直接没有这条记录,这是爬虫抓取时由接口返回空值导致的现象。而某些情况下你可能会看到数值为0,这往往是因为关键词设置太具体导致搜索量被系统隐私保护规则抹掉了,比如搜索量低于某个阈值就会被记作0。所以清洗时不能简单地把NA填成0,也不能把所有0都当成真实零搜索量。建议先做分年份统计缺失率,如果某一年超过30%的个股没有数据,这一年的样本量就要警惕是否受到接口限制的影响,最好在回归中对该年份单独加虚拟变量做稳健性检验。

另一个需要注意的场景是新股与次新股。公司上市之前的年份里,它没有证券代码也没有百度搜索热度,这是系统性的前置缺失。处理办法是保留这些行但不填充数值,后续做面板分析时让非平衡面板自然处理,不要让Stata或pandas强行把缺失值补齐。金融研究里有个隐蔽的坑:很多merge操作会把"没有数据"和"数据缺失"当成一回事,结果导致买入信号被误判为搜索热度为0。实际上,新股上市前没有数据是物理上不存在,和新股上市但没人搜索完全不一样,这决定了你的事件研究窗口到底是写"上市前无数据"还是"上市后低关注"。

3.3 面板数据对齐操作的完整案例

假设你已经把所有csv文件读进了内存,代码结构大致长这样:

import pandas as pd files = ["2011.csv", "2012.csv", ..., "2022.csv"] df_list = [] for f in files: tmp = pd.read_csv(f, encoding="gbk") # 百度指数的导出文件经常是gbk编码 df_list.append(tmp) df = pd.concat(df_list, ignore_index=True) # 统一证券代码格式 df["code6"] = df["股票代码"].astype(str).str.zfill(6) df["exchange"] = df["code6"].str[:2].map( lambda x: "SH" if x.startswith(("60", "68")) else "SZ" ) df["symbol"] = df["code6"] + "." + df["exchange"] # 构造年月字段 df["yearmonth"] = df["年份"].astype(str) + "-" + df["月份"].astype(str).str.zfill(2) # 透视成面板宽表 pivot = df.pivot_table( index=["symbol", "yearmonth"], values=["百度指数-整体", "百度指数-移动"], aggfunc="mean" ) pivot.to_csv("baidu_index_panel.csv", encoding="utf-8-sig")

这里有个细节:读取csv时如果直接指定utf-8经常报错,因为很多百度指数导出的文件是GBK或GB2312编码。建议直接用encoding="gbk",读不了再换"gb18030",它兼容GBK且能处理生僻字。如果打开文件看到乱码或者第一个字段名是"锟斤拷"这种经典乱码,不用怀疑,就是编码问题。合并完成之后,强烈建议做一个重复值检查,还是那句话:df.duplicated(subset=["symbol", "yearmonth"]).sum(),因为多个来源的文件拼接时经常会出现同一家公司同一个月出现两次的情况,一旦有重复,后面所有聚合值都会偏高。

4. 应用场景:从"数据能跑"到"结论能打"

4.1 投资者关注度与股票收益的实证设计

用百度指数做投资者关注度的代理变量,是行为金融学领域很成熟的做法。最经典的设定是把个股月度的百度搜索量增长率作为解释变量,把同期的股票月度收益率或被关注度溢价作为被解释变量,控制市值、账面市值比、换手率、机构持股比例等常规因子之后,观察系数的符号和显著性。逻辑基础在于:搜索行为反映了散户的关注程度,关注度的提升会推动股票被买入,在短期内产生价格压力,从而带来正收益。这里有个操作细节值得注意——搜索量的绝对值和增长率要做区分。用绝对值做解释变量,本质上衡量的是股票的规模效应,大公司搜索量天然高;用环比增长率做解释变量,捕捉的才是"关注度的变化"。实证中建议两个都做,用增长率做基准回归,用绝对值做稳健性检验,很多审稿人关心这一点。

4.2 情绪冲击与事件研究法的结合

另一个高频场景是事件研究法。假设你想研究交易所问询函、业绩预告暴雷或股权质押公告发布后,市场关注度变化对超额收益的影响。这时你可以把百度指数作为"信息扩散速度"的代理变量——事件发生当周的搜索指数激增幅度越高,说明信息传播越快,股价反应也会更剧烈。一个可以落地的做法是把事件日设为公告日T,取[T-30, T+30]的日度搜索量数据,计算出事件期的累积异常搜索量(Cumulative Abnormal Search Volume, CASV),然后按CASV的高低分组成对照组和实验组,比较两组之间的累计异常收益(CAR)差异。这个设计比你单纯做市场调整模型更能识别出"信息关注度"这个渠道的独立作用。

在这个场景中,数据的日度粒度就变得至关重要了。如果你手里只有月度均值,事件窗口的分析精度会受到很大影响。月度均值会平滑掉事件冲击的日内峰值,导致你观察到的"事件后热度上升"看起来像是一个缓慢抬升的斜坡,而不是一个尖锐的尖峰。实操中我的建议是:如果zip包里没有日度数据,应对办法是用"事件当月搜索量/过去三个月均值搜索量"构造一个相对关注度指标,虽然时间精度差一些,但至少能捕捉到"异于常态的关注度异常"。

4.3 多因子模型里的注意力因子构建

量化方向的朋友可能更关心怎么把这个数据用进因子模型。可以构建一个"注意力因子",每月底按个股过去20个交易日的百度搜索量增量排序,做多高注意力组、做空低注意力组,观察这个多空组合的收益表现。学术文献里有个成熟的发现是:高注意力股票往往短期内跑赢、长期跑输,因为散户的过度关注会推动价格短暂高于内在价值,随后发生反转。基于这个原理,你可以把它做成一个反转因子或者风险提示因子,放进Barra风格的多因子模型里做正交化处理。具体到操作层面,因为原始的百度指数数据很多是按自然月统计的,直接生成日频因子会面临频率不匹配的问题。可行的折中方案是按月换仓:每月末用当月搜索量相对前三个月的均值增幅做因子值,次月持有,看看组合的超额收益和夏普比率是否显著。

4.4 公司基本面分析与信息不对称研究

除了资产定价视角,百度指数还可以用于公司金融领域的交叉验证。比如研究分析师覆盖度与信息不对称的关系时,可以把百度指数当作散户获取信息的渠道来补充CFO问卷调查的不足。分析师覆盖度高但百度搜索量低的公司,可能说明机构投资者关注和信息传播之间存在断层,这种公司的信息不对称程度可能更高,买卖价差也更大。这类研究需要把百度指数数据和控制变量对齐到公司-年度层面,然后再结合盈余预告的市场反应做回归。这里有个实操经验:在直接使用互联网搜索数据时,建议在稳健性检验中剔除金融类上市公司,因为银行、保险等金融企业的搜索量受到行业政策影响较大,不确定性强,且金融企业的财务指标口径和其他行业差异明显,混合在一起容易遮蔽真正的因果关系。

5. 常见问题速查:踩过的坑都在这里

5.1 数据文件打不开或乱码怎么办

百度指数相关的zip文件里,Excel格式和csv格式混用的情况非常常见。如果打开csv文件是乱码,首先考虑编码问题,在Excel里用"数据-自文本"方式导入,选择编码为"简体中文(GBK)",一般能解决问题。如果是Python读取,用pd.read_csv(path, encoding="gbk")。如果还是乱码,再考虑文件本身是不是用UTF-8-BOM编码写的,这种情况下读的时候加utf-8-sig试试。还有一种可能:文件扩展名是.csv但实际内容是用tab分隔的文本,这时候需要换sep="\t"。这类问题没有统一解法,最稳妥的做法是先用文本编辑器打开原始文件,肉眼确认分隔符、编码、表头结构再动手写代码。

5.2 数据量级异常,指数值动辄几十万正常吗

百度指数本身是一个加权值,不是精确的搜索次数,所以数值非常大是正常的。个别热门股票或者处于风口浪尖的股票,日搜索指数破十万并不稀奇。但如果你发现某只股票某个月的搜索指数超过千万级别,这就已经不正常了,大概率是因为关键词设置有问题。比如你用的关键词是"比亚迪",那搜索结果里可能混入大量关于比亚迪其他业务、品牌活动甚至竞争对手的讨论。百度指数做关键词匹配时,不会做精确的"公司与关键词"的一一对应,它只认字符串。因此,研究中的关键词应以"股票简称+公司全称"两个候选词分别跑一遍,然后取相关度更高的一组。实操中,有的学者还会用"证券简称"和"证券代码"做交叉验证,例如搜索"000001"的用户大概率是在关注平安银行,而不是招商银行(它的代码是600036)。这是一个很实用的降噪技巧。

5.3 面板回归时遇到非平衡面板,怎么处理

很多同学把百度指数数据merge到公司财务数据之后,发现样本量缩水了一大截,第一反应是"数据质量不行"。实际情况往往是两个数据源的覆盖时间不一致造成的。上市公司财务数据一般是从上市年份开始的,百度指数数据则统一从2011年开始。如果研究区间是2011到2022年,2011年之前上市的公司两边都能覆盖到;但2015年之后上市的新股,在2011到2015年这段时间的百度指数本身就是缺失的,merge之后自然会出现大量NaN。这是正常的非平衡面板结构,不需要强行填充。固定效应模型和随机效应模型都能处理非平衡面板,不过在运行xtreg之前,建议用xtset symbol yearmonth设定面板结构,否则有些命令会默认按平衡面板处理而报错。另外要注意,如果某家公司只有一期的数据,在长差分模型里它无法提供识别信息,这类样本可以直接去除。

5.4 被解释变量是收益率,解释变量是搜索量,滞后阶怎么选

这个问题在学术答辩里几乎必被问到。百度指数和股票收益之间可能存在双向因果关系——搜索热度推动交易,交易行为本身又会带来更多讨论和搜索。为了缓解这种内生性,主流做法是使用滞后一期的搜索量做解释变量。在月度面板里,用t-1月的搜索量解释t月的收益,这样一来因果关系在时间上有了先后顺序,说服力强得多。如果你用的是日度数据,可以考虑在回归中加入同时期的市场收益率做控制,或者使用工具变量法。工具变量的选择可以参考地理邻近性——比如公司注册地所在省份的互联网用户渗透率,就具备一定的外生性,因为整体互联网渗透率影响搜索行为,但不直接决定个股收益率。这种设计在顶刊文献里出现过,步骤比较繁琐,但结论的稳健性会比普通回归好很多。

5.5 数据只到2022年,做不了2023年以后的分析怎么办

如果你现在才开始收集数据,发现百度指数的公开接口获取难度越来越大,而手上的zip只到2022年,那说明你拿到的应该是个人数据商整理的版本。公开可查的完整版百度指数需要用指数平台账号登录后才能获取,而且单次导出有数量限制,个人爬取的成本很高。我见过不少研究者的做法是用"2011-2022年"这段历史数据做训练集,再用"2023-2024年"的手工抽样数据做外样本验证,或者改用其他公开数据如"360趋势"或"微信指数"做替代性验证。如果你需要把时间延伸到未来,建议养成定期增量备份的习惯,每个季度手动导出一次,保留原始接口返回的JSON,长期下来才是真正可持续的方案。

6. 做项目时我的几个独门心得

这份数据真正用起来,我最大的感受是:百度指数数据不是标准化的金融数据,它离实证分析之间隔着一层"语义理解"的鸿沟。同样是搜索量上升,对茅台和对于一家ST公司来说,背后的投资者结构完全不同。所以在做大规模面板回归时,一定要在样本筛选阶段就对行业属性和市值规模做分层处理,而不是抱着"总样本回归+控制变量"的思路一杆子打到底。

再一个心得是:数据中的"热门公司"往往只有一小部分,真正的样本分布是高度右偏的。如果你做分位数回归,可能会发现高关注度组的搜索量对收益的边际影响和低关注度组完全相反。这种异质性恰恰是最值得写到论文里的发现。但很多同学一上来就做均值回归,结果被大量"零关注度"的冷门股稀释了信号,最后得出结论说"百度指数对收益没有解释力"——这其实是对数据的浪费。

最后建议你拿到zip之后,先不要追求分析的花哨,务必先做一套完整的描述性统计:每年有多少公司有有效的百度指数记录、月度搜索指数的均值和中位数走势、行业维度的覆盖度差异。这套统计既能帮你快速判断数据的可靠程度,又能作为论文里的Table 1展示。如果连基本样本量都有巨大波动,那后面所有复杂的计量模型都是白搭。说白了,做实证研究,数据进去了是苦劳,数据能讲出故事才是功劳。

本文还有配套的精品资源,点击获取

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

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

立即咨询