拓冰建站拓冰建站
首页 / 资讯中心 / 正文

A股个股投资者情绪面板数据构建思路(2007-2024)

研究个股横截面收益的时候我长期被一个问题卡住市场整体情绪指数能解释大盘的疯狂和恐慌可一旦落到为什么这两只基本面差不多的公司一只天天涨停有人抢另一只无人问津传统情绪指标就完全失灵了。后来我花了一段时间系统整理了A股2007到2024年的个股交易数据用代理指标加主成分分析的思路构建了一套上市公司投资者情绪2007-2024面板数据算是把公司层面的情绪这个变量真正落到了可计算的层面。这套数据覆盖了近18年的历史跨度包含A股正常交易股票在日频和月频两个粒度的情绪评分可以用在行为金融学术研究、个股异象分析、多因子模型诊断等场景中。如果你也在做类似的量化研究或者对情绪怎么度量这个问题感兴趣这篇文章会把我的完整构建思路、指标选型、清洗细节、主成分合成过程、有效性验证以及踩过的坑都摊开讲清楚。1. 为什么非要做公司层面而不是继续用市场情绪指数1.1 市场情绪解决不了个股定价差异如果你看过Baker和Wurgler在2006年那篇经典论文一定会对市场层面的情绪指数印象深刻。它把封闭基金折价、换手率、IPO首日收益、新股发行数量等指标压缩成一个时间序列用来解释整个市场的情绪周期。这个思路很优雅但用到个股上就尴尬了同一时刻所有股票共享同一个市场情绪值完全没有横截面上的区分度。现实情况却是A股的情绪分布极度不均衡。2017年那轮极端分化的行情里大市值蓝筹稳步上行小市值公司却持续阴跌两个群体内部的交易热度、投资者关注度完全是两个世界。再比如2021年前后的赛道股行情新能源和半导体板块内部的情绪温度可以和银行地产差出好几条街。如果你只能用一个全局情绪变量根本无法刻画这种结构性的情绪冷热。行为金融里的很多经典异象本身就发生在公司层面高换手率的彩票型股票未来收益偏低、散户追捧的股票崩盘风险更高、极端收益后的反转效应……这些问题都需要一个能够区分哪只股票情绪高、哪只股票情绪低的个体度量而不是一个统一的市场读数。这是我做这套数据的第一个动机。1.2 2007-2024这个样本区间的含金量在哪选定2007到2024年并不是随意划的而是因为这段区间几乎包含了一个研究情绪所必需的全部极端场景。首先是2007年末到2008年市场从亢奋到崩溃的完整周期这是检验情绪指标是否能在极端乐观和极端恐慌之间快速切换的绝佳样本。接着是2014到2015年成交额和杠杆资金快速放大随后出现剧烈调整情绪指标的波动剧烈程度在整个样本里都数一数二。2016到2017年的分化行情、2019到2021年的结构性行情、2024年初小微盘的流动性冲击这些场景对情绪指数来说都是天然的压力测试。简单说一个情绪指标如果在这段区间里还能保持合理的行为模式——暴涨时冲高、急跌时探底、分化时拉开个股差异——那它大概率是可靠的。如果它只在平稳行情里表现正常一到极端情况就失真那这套数据就没有实用价值。样本够长、够极端是这套数据最重要的底气。2. 情绪代理指标的选型哪些指标真正刻画了情绪而不是价值情绪是潜变量根本没法直接观测所以必须找代理。我这里的出发点是所有代理指标必须在个股层面可得、日度或周度高频、且与投资者的非理性交易行为直接相关。基于这三条标准我筛掉了问卷类数据只有市场层面、资金流数据2010年前覆盖太差、机构仓位数据频率太低且滞后严重最终留下了五个核心候选。2.1 换手率偏离最便宜也最有效的情绪温度计换手率是情绪研究里最经典的代理之一逻辑很直接情绪高亢时人更爱交易换手率自然放大。但我没有直接用换手率绝对值而是用了异常换手率——当日换手率减去过去一段时间我用的120个交易日的滚动均值再除以滚动标准差。为什么用偏离值而不是绝对值因为A股不同行业、不同市值区间的换手率天然差异很大银行股常年低换手题材股常年高换手绝对值的横截面差异早就被流动性属性污染了。但偏离值捕捉的是这只股票相对于常态今天突然活跃了多少这才是情绪冲击的部分。Baker和Stein2004讨论流动性作为情绪代理时也强调过这个角度实操中偏离值的效果确实比绝对值干净不少。2.2 收益偏度彩票偏好的一面镜子第二个指标是过去60个交易日收益分布的偏度也叫已实现偏度realized skewness。行为金融里有个很成熟的概念叫彩票偏好很多散户投资者愿意买入收益分布极度右偏、有极小概率暴涨的彩票型股票为此不惜承担大概率亏钱的风险。而这种股票恰恰是情绪推动的重灾区。偏度的计算不复杂用日收益率序列的三阶矩除以标准差的立方即可。之所以放进情绪代理是因为高偏度股票在情绪高亢期更容易被资金追捧而情绪退潮时这类股票的杀跌也往往更猛。它捕捉的是投机性偏好的强弱和换手率提供的是互补信息。2.3 杠杆资金活跃度2010年之后的情绪放大器融资融券在2010年3月才开始正式交易所以两融类指标天然只能覆盖后半段样本。我用的是融资买入额占当日成交额的比例以及融资余额的变化率。逻辑也不难理解愿意加杠杆买入的资金通常对后市有比较强的乐观预期杠杆资金的活跃度越高说明交易者的情绪温度越高。这个指标的短板很明显在2010年之前完全没有而且只有两融标的池内的股票才有数据。不过它的长处是干净——杠杆资金比普通散户更敏感它的进场和离场往往领先于价格变化是情绪放大器角色。我在做主成分时把它作为2010年后的稳健性验证变量而不是核心变量后面会说原因。2.4 分析师调整与文本情绪两个补充视角分析师评级调整方向上调次数减下调次数再除以覆盖分析师数代表机构端的情绪温度。它的优点是频率适中、覆盖面在2010年后逐渐扩大缺点是早期分析师覆盖太少样本偏差大。它衡量的是专业投资者的预期修正和散户情绪是不同维度但两者会互相传染。文本情绪股吧帖子、新闻标题是最贴近情绪本身的指标但它的成本实在太高了2015年之前的文本数据覆盖率低、清洗难度大、真假评论混杂直接作为主成分基础变量会让数据面板严重残缺。所以我的处理策略是文本情绪不做基础代理只做交叉验证的参照系。后面验证部分会提到怎么用。3. 2007-2024的面板数据工程口径、缺失值和幸存者偏差的取舍很多人拿到数据后直接开始算指标但我的经验是面板数据的质量控制决定了最终结果的可信度。这一节可能是全篇最不性感但最值得认真看的部分。3.1 换手率的三套口径从2007到2024怎么统一A股换手率在数据库里通常有三个口径总股本口径、流通股本口径、自由流通股本口径。不同口径下同一只股票同一时期的换手率差异非常大尤其2007到2010年很多公司的限售股尚未完全解禁流通股本占总股本的比例很低流通口径的换手率会异常偏高。我最后的选择是2007到2012年用流通股本口径2013年以后逐步切换到自由流通股本口径并在衔接处做了倍数对齐。具体做法是以2013年两类口径都完整可得的股票为样本计算两个口径的中位数比值用这个比值对早期数据做了整体校准。这个方法不完美但比不加处理直接用一套口径硬算要可靠得多。有条件的同行可以直接购买带自由流通口径的数据库但多数情况下还是得自己做一次手工校准。3.2 停牌、涨跌停和ST哪些日子必须被剔除这一块是最容易踩坑的地方。停牌股票的换手率天然为0但它是无法交易的0不是没人关注的0直接纳入计算会把情绪分数压出假低谷。一字涨停或一字跌停日同理当天成交极少但这恰恰是情绪极端高涨或恐慌的表现简单用换手率偏离去刻画会把它们误判成冷清。我的清洗规则是停牌日直接剔除一字涨跌停日标记为极端情绪值但不参与换手率偏离的计算ST股票的常规交易日单独建立样本标记在部分验证场景里会把ST整体剔除避免退市风险偏好污染情绪分数。这些判断看起来都是细节但你如果直接跑一套数据出来会发现情绪指数里混进大量假冷清日和真实市场感受严重背离。3.3 幸存者偏差构建当期股票池的细节这是面板数据里我最在意的问题。如果只用截至2024年仍然存续的股票去回溯2007年以来的交易记录早期样本就只剩下了后来的幸存者那些在2010年退市的股票、2015年之后被ST多次的股票全都会被漏掉——但这批股票的极端情绪恰恰是研究中最有信息量的部分。正确处理方式其实不复杂在每个报告期我按月切分记录当期交易状态正常的全部股票代码形成一个当期股票池所有指标都在当期股票池内计算。退市股票要保留到它实际退市前的最后一个交易月这样情绪指数的下跌段才能真实覆盖这个群体的完整情绪变化。数据库里下载数据时如果直接按股票代码筛选大概率会带回幸存者偏差这一点必须自己处理。3.4 极端值清洗MAD比Z-score更抗造换手率、偏度这类指标的分布是高度重尾的用均值加标准差的Z-score方法做缩尾很容易被极端值拖着走。我自己在试算时发现直接用Z-score处理2015年高峰期的换手率很多正常活跃股的得分会被压到负数——因为少数天量股票的极值把标准差拉得过大。后来换成了MAD中位数绝对偏差缩尾以中位数为基准超过中位数加减k倍MAD的值截断这个办法在重尾分布下稳健得多。缩尾比例我用的1%和99%分位数但底层检验用的是MAD逻辑。具体操作时先做横截面分位数缩尾再做时序列标准化顺序不要反。4. 主成分情绪指数从5个代理变成1个分数的全流程数据清洗做完就到了核心合成步骤。我的目标是把多个代理变量综合成一个可解释、可复现、且没有前视偏差的个股情绪分数。4.1 为什么不用等权平均而用主成分最简单的做法当然是把几个标准化后的代理变量做个平均省事直观。但问题在于代理指标之间存在信息重叠换手率抬高的时候偏度大的股票通常也在被资金追捧杠杆资金活跃的时候换手率也差不了等权平均等于把这些共同成分反复计算放大了重复信息。主成分分析的意义在于把变量之间的共同变异提取出来第一主成分恰好就对应着多个情绪指标共同变化的那个驱动力也就是我们真正想要的情绪成分。它允许代理指标各自贡献不同权重而不是一视同仁。实践中第一主成分的解释率大概在30%到45%之间这个水平足够说明它提取到了一个稳定且真实的共同因子又不会高到让人觉得是重复计算。4.2 滚动PCA防前视偏差的实操细节这里有一个新手很容易踩的大坑如果直接用全样本数据做PCA得到的载荷矩阵其实包含了未来的全部信息。用这个载荷去计算历史某个时点的情绪分数相当于用未来数据给过去打分——这在学术研究里是致命的前视偏差回测出来的结果完全不可信。正确做法是滚动窗口PCA。我在每个月末只用截至当月末为止的过去36个月数据重新拟合载荷矩阵然后用这个载荷计算当月每个股票的情绪分数。窗口长度我反复试过24个月、36个月和60个月24个月载荷太毛糙换一个极端月份结果就跳一次60个月反应太慢市场结构从2015年的高频交易时代切换到2018年后的机构化时代时旧载荷已经跟不上新结构36个月是相对折中的选择。4.3 核心计算流程与Python实现要点具体的计算分四步走对五个代理变量做行业中性化再在横截面内标准化减均值除以标准差。行业中性化这一步很重要因为银行和医药的换手率基准完全不同不处理的话情绪分数里会混入行业属性。在36个月滚动窗口内计算代理变量间的相关矩阵做特征值分解。提取第一主成分对应的特征向量作为载荷并做符号对齐——确保载荷方向和理论预期一致下面细说。用当期个股的代理值乘以载荷得到情绪得分再在横截面上标准化为均值0、标准差1的分数。用Python表达核心逻辑大概是这样的def rolling_pca_sentiment(panel, proxies, window36): # panel是MultiIndex DataFrame: (trade_date, stock_code) scores {} for month_end in month_ends: hist panel.loc[:month_end].tail(window * 21) # 1. 行业中性化 横截面标准化 z hist[proxies].apply(lambda x: (x - x.mean()) / x.std()) # 2. 相关矩阵的PCA corr z[proxies].corr() eigenvalues, eigenvectors np.linalg.eigh(corr) loading eigenvectors[:, -1] # 第一主成分载荷 # 3. 符号对齐保证与理论方向一致 loading align_sign(loading, theoretical_direction) # 4. 当期情绪分数 cur_z panel.loc[month_end][proxies].apply(...) scores[month_end] cur_z loading return scores实际工程里还要处理月度内交易日不足10天就直接置空、代理指标缺失过多的股票不进PCA拟合、全市场只有两融标的有margin变量的处理方式等杂活。整体框架不复杂真正花时间的都是这些边界条件和清洗逻辑。4.4 符号方向、载荷解释和解释率判断PCA第一主成分的方向不是唯一的特征向量乘以负一同样是合法解。如果不做处理可能跑出来第一主成分在换手率上是正载荷、在偏度上是负载荷方向飘忽不定情绪分数忽高忽低根本没法用。我的处理方法是预先设定理论方向高情绪时换手率偏离为正、偏度为正、杠杆活跃度为正、分析师调整为正乐观修正。然后看第一主成分载荷在这几个变量上的平均正负方向如果和理论方向一致就保留否则整体乘负一。这是个非常朴素但重要的步骤很多人直接从sklearn里拿结果就用跑出来符号反复横跳还不知道为什么。关于解释率我的观察是如果第一主成分的解释率低于25%说明代理指标之间共同信息太少情绪成分太弱这时候要先回头检查代理变量清洗环节如果高于60%就要警惕是不是某些指标其实在重复度量同一件事比如换手率和杠杆活跃度相关性太高导致共同因子被单一维度主导。5. 有效性验证情绪指数究竟是不是在刻画情绪合成完指数只是第一步最关键的问题是这个指数真的有行为金融学意义上的有效性吗我从两个方向做了验证。5.1 极端市场场景的横向对照把全市场个股情绪分数的月度均值拉成一条时间序列和几个公认的极端市场节点做对照2008年下半年全球金融危机冲击下的A股市场市场平均情绪分快速下探到全样本极低分位大量个股情绪分数进入个位数百分位区间。2015年市场成交和杠杆资金快速放大的阶段市场平均情绪分在2015年上半年冲到了样本内的极高位置三季度剧烈调整期间又快速回落到低分位情绪分数的拐点基本和市场的阶段高低点同步甚至略微领先。2017年到2018年的大盘蓝筹与小市值分化阶段市场平均情绪分变化不大但情绪分数的横截面离散度明显拉大——大市值股票情绪分中性偏低小市值股票情绪分波动剧烈。这个现象恰恰说明公司层面的情绪数据和市场整体情绪是有本质区别的。2024年初小微盘流动性冲击阶段小市值群体的情绪分数迅速塌陷之后又经历明显修复整个走势完整捕捉到了流动性收缩与恢复的过程。这些场景对照虽然没有严格的统计检验但方向上的吻合说明这套数据确实捕捉到了情绪的应有表现——在极端乐观和极端悲观之间切换、在分化行情中拉开个股差异。5.2 分位分组的月收益差异再来看横截面预测能力。我用最朴素的方法每个月末按情绪分数把全市场股票分成5组Q1最低情绪Q5最高情绪计算各组下个月的等权平均收益。在我的样本里整体规律是高情绪组Q5未来一个月的平均收益明显低于低情绪组Q1差值大致在每月0.3%到0.8%的范围内而且在情绪指数全样本高分位时这个利差会更加明显。这个结果本身并不新颖它和大量文献里高情绪股票未来收益偏低的结论是一致的。但对我而言它的意义在于验证了数据质量——如果连这个经典规律都跑不出来说明前面的构建过程一定有问题。还要加一句重要的提醒这只是一个统计规律不是可以直接交易的策略信号。高情绪组里大量是小市值、高换手的股票实盘交易的冲击成本和流动性约束往往远超这个收益差直接拿去做多空策略很容易被交易成本吞干净。5.3 在学术和策略研究里的正确打开方式这套数据最适合的场景是作为行为金融模型的解释变量。比如研究崩盘风险时控制基本面和流动性的基础上看看高情绪股票的崩盘风险是否更高研究异质波动率异象时把情绪作为调节变量看看异质波动率溢价是不是只在情绪高的时候出现。也可以用来做条件分析把样本按情绪高低切成两个子样本检验某些因子在情绪期的表现差异。很多横截面因子的有效性其实是随情绪周期变化的用这套数据就能很方便地切出市场亢奋期和市场低迷期分别回测这正是市场整体情绪指数做不到的。验证里还有一个重要步骤是相关性诊断把情绪指数和个股换手率、特质波动率、非流动性指标做Pearson相关。如果相关性高到0.8以上说明这个情绪分数本质上就是换手率的换壳没有独立信息增量。我的样本里情绪分数与换手率的相关系数大致在0.5到0.7之间说明有相关但不完全重合还有一部分是偏度、杠杆活跃度等其他维度提供的增量信息这个结果可以接受。6. 情绪指数不是万能钥匙边界、误用和几个真实教训6.1 代理变量永远是代理这套情绪指数说到底是从交易数据里反推出来的合成情绪它和真实的投资者心理情绪之间隔着一层透镜。换手率偏离里既有情绪成分也有流动性成分偏度里既有投机偏好也有基本面彩票属性分析师调整里则更多反映专业投资者的理性预期。所以严格来说这个分数应该被理解为情绪与投机性交易的综合度量而不是纯粹的心理学意义上的情绪。如果写作论文我建议在表述上留有余地叫情绪-投机综合指数speculative sentiment index或者明确说明它是基于交易行为的代理情绪。别人问起来的时候直接说这是投资者情绪的综合代理指标比拍胸脯说这就是情绪本身要严谨得多也经得起推敲。6.2 市场结构漂移会影响时序可比性A股参与者结构在过去18年变化太大了。2010年之前以散户为主换手率里情绪含量天然高2015年以后程序化交易和量化资金占比上升换手率的边际含义已经变了2020年以来社交平台的信息扩散速度和范围又明显改变了个股情绪的传播路径。同一个换手率偏离值在2009年可能在说散户情绪高涨到2023年可能包含了不少算法交易和套利资金的贡献。滚动窗口PCA在一定程度上吸收了这种结构变化但不能完全消除。最稳妥的做法是在使用这套数据做回归时加入时间固定效应或者分段做稳健性检验——比如2010年之前、2010到2015年、2015年之后各跑一遍看看结论是否一致。如果跨区间的结论差异太大就要考虑是不是情绪度量本身的结构变化造成的。6.3 文本情绪作为交叉验证参照系前面说过我没有把文本情绪放进主成分基础变量但它不该被闲置。我的做法是取2019年以后的数据用个股股吧帖子情绪和新闻正负面情绪分别构造月度文本情绪分数再和主成分情绪分数做相关性和分组对照。结果上两者相关系数大致在0.3到0.5之间方向上一致但又不是完全同步。文本情绪的优势在于它更贴近真实心理而主成分情绪的优势在于覆盖更长的历史区间。如果你有足够的文本数据预算我的建议是把两者结合起来——用文本情绪对主成分情绪做残差修正可能得到一个更纯粹的情绪偏离基本面交易行为的成分。这一块我还在尝试但方向是对的。6.4 几个值得记住的教训最后分享几个我在构建过程中真实踩过的坑供同行参考第一不要跳过行业中性化直接PCA。我第一版跑出来的情绪分数里行业属性占了很大权重银行股整体情绪永远偏低电子股整体情绪永远偏高。行业中性化之后这个偏差才基本消除。第二符号对齐一定要做。有一版我偷懒没做结果情绪分数和市场极端节点完全反着走还以为是数据源出了问题最后发现就是第一主成分的方向选反了。第三滚动窗口不要偷懒用全样本。如果你只是自己看一下趋势可能问题不大但任何涉及历史回测的研究全样本PCA就是前视偏差审稿人一眼就能看穿。第四注意退市样本的处理。保留到退市前最后一个月还是提前剔除会对高情绪组的未来收益产生不小的影响。我的建议是保留并在论文稳健性检验里说明两种处理方式的差异。我把这套数据公开放在了我的开源项目里数据文件按照月份分片存储月度情绪分数为均值0、标准差1的标准化值同时附带了情绪分数构建的全套说明和复现代码。如果你发现某个行业、某个时间段的情绪分数和你的体感偏差很大欢迎私下交流——数据这种东西越多的人挑毛病它才越可靠。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门