
简介这份资源面向从事公司金融、区域经济或资本市场实证研究的学者与数据分析人员提供2011至2022年上市公司层面的百度指数数据可用于构建投资者关注度、网络舆情热度等代理变量支撑面板回归、事件研究等量化分析场景。压缩包共4个文件整体约2.69MB包含xlsx与dta两种数据格式便于在Excel与Stata之间灵活切换处理另附html来源说明与pdf说明文档帮助使用者追溯数据口径与采集逻辑。目前已有44人学习下载属于小众但垂直的科研数据资源。数据覆盖十二年时间跨度样本期完整适合直接导入统计软件进行清洗与建模也可作为论文附录或课程作业的实证素材减少自行爬取与整理的时间成本。1. 百度指数面板数据从“搜出来的热度”到“能跑回归的 CSV”手里有一份《上市公司-百度指数2011-2022年.zip》很多人第一反应是“这不就是一堆搜索指数吗能干嘛”。但如果你做过舆情因子、投资者关注度、散户情绪这类实证研究就会知道这类面板数据有多难凑——单只股票、单日、连续十二年还要跟上市公司代码对齐自己爬一遍大概率中途翻车。这份资源解决的就是这个脏活把百度指数里跟上市公司相关的搜索热度整理成按股票代码和时间排列的面板结构直接能进 Stata、Python、R 做回归。适合做金融实证、量化因子、传播学量化分析的研究生和从业者也适合想练面板数据处理的新手。它不是什么高深模型价值全在“省掉你三个月爬虫和清洗”这件事上。2. 先搞懂百度指数的口径PC、移动与整体到底差在哪2.1 三个终端的指数不是一回事百度指数官方给一个关键词会返回三套曲线PC 趋势、移动趋势、整体趋势。很多人默认“整体 PC 移动”直接拿整体去跑结果量纲对不上。实际口径里整体趋势是百度自己加权后的综合值并不是简单相加而且 2011 年前后移动端占比极低早期整体几乎等于 PC。这意味着如果你研究的是“移动互联网时代的投资者关注”用整体趋势会稀释掉移动端爆发的信号。常见做法是做关注度总量用整体做“注意力迁移”或“场景差异”就分别取 PC 和移动。这份资源如果只给了一列先确认它是哪一套口径再决定要不要拆。2.2 关键词选“公司简称”还是“股票代码”百度指数只对有一定搜索量的词出指数。上市公司里只有知名公司简称比如“茅台”“比亚迪”才有稳定指数冷门公司简称搜的人太少指数会大量缺失。另一个选择是用六位股票代码搜但普通用户很少直接搜代码指数更低。所以这份数据大概率是以公司简称或品牌词为主键去匹配的。你拿到手第一件事不是跑模型而是统计每只股票的非空天数如果某只股票 12 年里只有几百天有值说明它的关键词本身就没啥搜索量硬塞进面板只会引入大量插补噪声。我一般会设一个门槛比如非空天数占比低于 60% 的样本先标记出来回归时做稳健性对比。2.3 时间对齐交易日 vs 自然日百度指数是按自然日给的包括周末和节假日。但股票收益率、财务数据只在交易日有值。如果你直接把自然日指数跟交易日收益合并会出现“周末指数对不上任何交易”的错位。标准处理是把自然日指数按“向前填充”映射到下一个交易日或者对每周取均值再对齐周频。两种做法结论可能不同——日频研究用前向填充周频/月频研究用区间均值。这一步不做后面回归系数全是玄学。3. 把 zip 拆成能进模型的面板字段、频率与合并键3.1 解压后先看文件结构拿到压缩包别急着写代码先看目录。典型结构有两种一种是一堆以股票代码命名的 CSV每个文件里两列日期、指数另一种是一个大宽表行是日期列是各公司。前者要纵向拼接后者要 melt 成长表。用下面这段先探一下# 查看压缩包内文件列表不解压 unzip -l 上市公司-百度指数2011-2022年.zip # 如果文件多统计一下数量 unzip -l 上市公司-百度指数2011-2022年.zip | wc -l逻辑说明-l只列内容不落盘避免解压出一堆文件污染目录。参数上没什么可调的重点是看文件命名规律——如果文件名里带股票代码后面解析就省事如果是一堆data_001.csv那就得靠文件内的一列代码来识别。3.2 统一成长表melt 与 concat 的选择假设解压后是宽表日期 多列公司用 pandas 转长表import pandas as pd import glob # 读取宽表假设第一列是日期 df pd.read_csv(baidu_index_wide.csv, parse_dates[date]) # 宽表转长表日期不动其他列变成 company 和 index_value long_df df.melt(id_vars[date], var_namecompany, value_namebaidu_index) # 去掉指数缺失的行百度指数用 0 或空表示无数据 long_df long_df[long_df[baidu_index].notna() (long_df[baidu_index] 0)] # 按公司和日期排序方便后续滚动计算 long_df long_df.sort_values([company, date]).reset_index(dropTrue) print(long_df.head())逻辑说明melt把宽表压成长表这是面板数据的第一步。id_vars指定保持不变的列var_name是原来的列名变成的新列名这里叫 companyvalue_name是指数值列名。过滤掉 0 和空值是因为百度指数对无数据返回 0直接留着会把“没人搜”和“数据缺失”混为一谈。参数上如果你的日期列名不是date改id_vars即可如果公司列名本身就是股票代码那company这列可以直接当合并键用。3.3 跟财务数据合并代码格式是最大的坑上市公司财务数据里股票代码常见格式有000001、000001.SZ、SZ000001三种。百度指数这边如果用的是公司简称还得先建一张“简称—代码”映射表。合并前统一成六位数字字符串# 统一股票代码为六位字符串 def normalize_code(x): x str(x).strip().upper() # 去掉后缀 .SZ / .SH / .BJ x x.split(.)[0] # 去掉前缀 SZ / SH / BJ if x[:2] in [SZ, SH, BJ]: x x[2:] return x.zfill(6) long_df[code] long_df[company].apply(normalize_code) # 假设财务表 fin_df 也有 code 列 merged pd.merge(long_df, fin_df, on[code, date], howinner)逻辑说明zfill(6)保证1变成000001避免字符串和数字混用导致 merge 失败。howinner只保留两边都有的日期如果你想让指数日期为主改成howleft。参数上如果财务数据是季度频率date对不上需要先把指数按月聚合再合并或者把财务数据按季度末日期向前填充到日频。4. 指数当因子用之前必须做的平稳性与异常值处理4.1 百度指数的分布是右偏的搜索指数天然右偏大部分日子平稳遇到热点事件突然爆量。直接拿原始值做回归少数极端值会主导系数。常见做法是取对数log(1 index)加 1 是为了处理 0 值。取完对数后分布接近正态回归残差也更干净。如果你研究的是“异常关注度”那就该保留极端值改用分位数分组或事件研究法而不是一刀切缩尾。4.2 面板单位根不平稳会做出伪回归百度指数有趋势尤其是长期上升或下降的公司。两个都有趋势的变量做回归R² 很高但没意义这是伪回归。处理方式有两种一是做一阶差分研究“关注度的变化”而不是“关注度水平”二是做面板单位根检验LLC、IPS确认平稳后再回归。我一般先画几家公司的时间序列图肉眼看看有没有明显趋势再决定差分还是加时间固定效应。4.3 缺失值插补的边界前面说了非空天数少的样本要标记。对于非空天数够但中间有零星缺失的插补方式影响很大。线性插值适合短期缺口比如几天但如果是连续几个月没数据插值等于编数据。我的习惯是连续缺失超过 5 个交易日的区段不插补直接标记为缺失回归时样本量会少一点但结论更稳。这份资源如果已经做过插补你得在文档里找它的插补规则没写就默认它没插补自己重做一遍。5. 避坑与排查这份数据最容易翻车的五个地方5.1 现象合并后样本量骤降原因股票代码格式不一致或者日期一个是字符串一个是 datetimemerge 时匹配不上。 解决merge 前先print(df.dtypes)看两边的键类型统一成字符串或统一成 datetime。代码格式用上面的normalize_code过一遍。5.2 现象某只股票指数全是 0原因该公司简称在百度指数里根本没有收录或者收录的是另一个词比如用“XX科技”而不是“XX股份”。 解决换关键词重搜或者把这只股票从样本里剔除。别用 0 去填充0 在回归里是有信息的会拉低均值。5.3 现象2011 年数据大量缺失原因百度指数早期覆盖关键词少很多公司 2011 年还没被收录。 解决把样本起点调到该公司有数据的第一年做非平衡面板。如果坚持平衡面板2011 年这一截会砍掉大量样本。5.4 现象PC 和移动两列高度共线原因早期移动端占比低两列几乎一样后期虽然分化但整体趋势仍受 PC 主导。 解决做关注度总量时只用整体列做注意力迁移时用“移动占比 移动 / 整体”这个比值而不是把两列同时放进回归。5.5 现象回归系数符号跟预期相反原因没控制市场整体关注度。大盘暴涨时所有股票搜索量都涨个股指数跟大盘指数高度相关不控制就会把市场效应算到个股因子上。 解决加市场平均百度指数作为控制变量或者做去均值处理个股指数减去当日全样本均值。6. 进阶用法把百度指数做成“异常关注因子”并验证原始指数做因子太粗糙真正有区分度的是“异常关注”——超出正常水平的搜索量。做法是对每只股票用过去 60 个交易日的指数均值加减 2 倍标准差算一个正常区间当日指数超过上轨就记为异常高关注低于下轨记为异常低关注。这个因子跟收益率的关系往往比原始指数更显著。# 计算滚动均值和标准差窗口 60 个交易日 long_df[ma60] long_df.groupby(code)[baidu_index].transform( lambda x: x.rolling(60, min_periods30).mean() ) long_df[std60] long_df.groupby(code)[baidu_index].transform( lambda x: x.rolling(60, min_periods30).std() ) # 异常关注超过均值 2 倍标准差 long_df[abnormal_attention] ( long_df[baidu_index] long_df[ma60] 2 * long_df[std60] ).astype(int) # 统计每只股票出现异常关注的天数占比 ratio long_df.groupby(code)[abnormal_attention].mean() print(ratio.describe())逻辑说明groupby(code)保证滚动窗口在每只股票内部计算不会跨股票串数据。min_periods30表示前 30 天数据不够时不计算避免早期窗口噪声。abnormal_attention是 0/1 变量可以直接进回归也可以按事件研究法看异常关注后几天的收益。参数上窗口 60 和阈值 2 倍是常见起点稳健性检验可以换 30/90 天窗口和 1.5/2.5 倍阈值看结论是否一致。验证这个因子有没有用最直接的办法是分组回测按异常关注天数占比把股票分成 5 组看各组下一期收益有没有单调差异。如果单调性明显说明因子有区分度如果乱序可能是样本期太短或者市场整体关注度没控制。我一般还会把异常关注拆成“异常高”和“异常低”两个虚拟变量分别看方向因为高关注和低关注对收益的影响可能不对称。从那以后我每次拿到类似的面板数据都强制先跑一遍“非空天数统计 代码格式检查 日期对齐”这三步再动模型。这份资源省掉的是爬虫和初清洗但口径确认和因子构造的活还得自己干。希望帮到你。本文还有配套的精品资源点击获取