情绪Alpha这个词过去几年从量化研究的小圈子一步步走到了因子库的标配位置。我最早接触它时觉得有点玄后来真正把新闻、社交媒体、卖方报告里的情绪分数接进信号之后才发现它背后有非常扎实的行为金融学机制而且和动量、反转、基本面因子的相关性低得出乎意料。这篇文章是“情绪与新闻Alpha”系列的第一章先把情绪Alpha本身拆开讲清楚它从哪里来、为什么能产生超额收益、用哪些数据源去度量、构建因子时会踩哪些坑。后面两章会分别讲新闻Alpha的实战提取以及两者如何组合。想把情绪数据从“能看”变成“能交易”的读者按这条主线往下走就对了。1. 情绪Alpha到底是什么从集体共识到定价偏差1.1 价格不是“客观信息”而是集体情绪的成交结果我们在教科书里最早接触的假设是市场价格充分反映了所有已知信息所以没人能稳定跑赢指数。但做交易时间久了你会发现这个假设有一个很大的漏洞——它假设所有人在同一时刻对同一信息做出一致的理性反应。现实中的价格只是所有参与者在某一时点愿意成交的结果而成交意愿里混着大量情绪。同一份盈利公告乐观者看到的是增长空间悲观者看到的是估值透支谁在盘中出价更坚决价格就往哪边偏一点。情绪Alpha想抓的恰恰是这种由集体情绪造成的短暂定价偏差而不是去预测基本面本身。我常用一个菜市场类比来解释这件事。雨天小贩不会根据天气预报涨价而是根据现场抢购人数涨价。如果你能提前看到“更多人正在涌入菜市场”这个信号就可以在价格完全反映之前先动手。股票市场也一样新闻文本的措辞变化、社交平台上的讨论热度、卖方报告里那些看似中性的形容词都是“人群流入”的早期迹象。情绪Alpha的核心工作就是把这种早期迹象量化为可交易的信号。1.2 情绪因子和传统因子的本质区别传统多因子模型里的价值、动量、质量因子度量的是公司和交易层面的“慢变量”估值便宜还是贵、过去半年涨得多还是少、盈利质量高还是低。这些信号一个月更新一次都来得及甚至季度更新也能用。情绪因子完全不一样。情绪因子的最大特征是它来自非结构化文本和高频行为数据而不是来自财务报表和行情快照。这带来三个直接影响信号频率高通常按日甚至按小时变化衰减速度快超额收益集中在事件发生后的几天内容量小可容纳的资金规模远小于基本面因子。因子类型典型数据源信息类型典型调仓频率信号衰减速度资金容量价值因子财报、宏观数据结构化月频或季频慢大动量因子行情数据结构化月频中大情绪因子新闻、社交媒体、研报非结构化日频或事件驱动快小容量小不是指策略本身不能赚钱而是指当资金规模大到一定程度时自己就成了对手盘。原因很简单情绪数据覆盖的标的有限当新闻覆盖度不足时信号噪声会快速上升加上日频换手极高流动性不够的股票根本进不来。理解了这些差异你就知道为什么情绪因子不能照搬传统因子的回测框架和分析方法。2. 情绪数据的来源与清洗Alpha生死的头一道分水岭2.1 数据源怎么选先看交易场景再看覆盖度做情绪因子第一道分水岭不是模型而是数据。很多人在NLP模型上花了大量时间结果发现输入的数据本身就脏得没法看后面的一切都白费。情绪数据源五花八门我的做法是先想清楚交易场景再选数据源。如果你做的是事件驱动想抓财报公告、重大合同、高管变动这些消息带来的短期脉冲新闻流是最核心的数据源。新闻的特点是信噪比相对高、有明确发布主体和时间戳但滞后问题也比较明显同一个事件会被不同媒体反复转载需要做合并去重。如果你做的是短线反转想抓散户情绪的过度反应社交媒体和股吧讨论更合适。这类数据的优势是反应极快往往新闻还没发出来讨论热度已经先起来了缺点是噪音极大水军、复制粘贴、极端情绪到处可见。我的经验是社交数据适合做“热度的边际变化”不适合直接做情感方向的强信号。卖方研报和搜索指数也值得关注。研报覆盖面窄、更新频率低但观点结构完整措辞变化能反映卖方情绪的微妙转向搜索指数则是一个很好的关注度指标它不区分多空但能提示一只股票是否正在被资金注意。数据源优点缺点适合场景新闻流信噪比高时间戳清晰滞后、重复转载多事件驱动、公告后漂移社交媒体/股吧反应快散户情绪集中噪音大、水军多短线反转、热度突增卖方研报观点结构完整方向明确更新频率低、偏大盘月度配置、预期差搜索指数测度关注度抬升无法区分多空流动性溢价、波动预测期权隐含偏度反映专业投资者情绪仅覆盖有期权的标的市场级择时2.2 从文本到情绪分数NLP标准化处理流程数据源确定后下面是标准化处理流程。不管用什么模型我通常按这个顺序走抓取解析、清洗去重、主体匹配、情感打分、映射分数。第一步抓取与解析。从API或合规数据商拿到原始数据后先解析标题、正文、发布时间、公司主体这些核心字段。注意发布时间和抓取时间必须分开记录这是后面防止前视偏差的关键。第二步清洗去重。把广告、链接、无意义字符去掉然后把同一个事件的多家转载合并成一条。合并很重要否则新闻权重会被重复计数扭曲。比如同一份业绩公告被五家媒体发了五条新闻如果不合并这条信息的权重就是一条单独新闻的五倍会严重污染情绪得分。第三步主体匹配。这一步最繁琐也最容易被新手忽略。新闻正文里提到的公司可能是全称、简称、股票代码、历史曾用名甚至可能是“某券商”这种模糊表述。你需要建一张别名表把所有指代都统一到证券代码上。我的做法是同时做规则匹配和模型匹配先按关键词锁定候选公司再用模型做消歧。第四步情感打分。主流方法分两类词典法和模型法。词典法用Loughran-McDonald金融情感词典这类已经针对金融文本校准的词表速度快、可解释性强模型法用FinBERT一类预训练模型对整条文本做分类准确率更高但需要针对金融语料做微调。第五步映射到分数。正面映射为正值负面映射为负值中性为零。如果是模型输出的概率再乘上正负符号就行。这里我贴一段类似实际工作的伪代码方便理解# 伪代码用金融预训练模型给新闻标题打情绪分 from transformers import pipeline sentiment_model pipeline( text-classification, modelProsusAI/finbert, tokenizerProsusAI/finbert, ) def score_news(text, ticker): # 先把与当前股票无关的新闻过滤掉 if ticker not in text and ticker_alias(ticker) not in text: return None pred sentiment_model(text[:512])[0] label_to_sign {positive: 1, negative: -1, neutral: 0} return label_to_sign[pred[label]] * pred[score]为什么输入文本只取前512个字符因为预训练模型有最大长度限制而新闻标题和开头段落往往已经包含了情感判断的核心信息强行截断正文反而不稳定。为什么不用通用情感模型因为金融语言里的“下调”“承压”“减持”等词在通用情感模型里常常被错判成中性甚至正面情感方向完全错误。金融预训练模型或者专门微调过的模型在这类场景下要可靠得多。2.3 情绪聚合与降噪单条文本不叫Alpha单条文本的情绪得分没有稳定超额收益它只是一条噪声很大的数据点。真正成为Alpha的是经过聚合后的情绪状态。我习惯按“主体—时间—来源”三个维度做聚合。主体维度解决“这条新闻说的是谁”的问题时间维度解决“情绪事件发生在多久之前”的问题来源维度解决“不同渠道的信息可信度不一样”的问题。具体聚合公式可以写成这样score_{i,t} Σ_k w_k * s_k * e^{-λΔt_k} / Σ_k w_k * e^{-λΔt_k}其中 w_k 是来源权重s_k 是单条文本的情感得分Δt_k 是这条文本距离聚合时点的小时数λ 是时间衰减系数。也就是说越早发布的文本权重越低来源越可信的文本权重越高。这个公式的好处是可以把任意时间段内的情绪汇总成一个可比较的分数。实际操作中还有三个细节。第一新闻和社交数据不要混在一起计算因为发布主体和信息质量完全不同分开计算后再合成都比直接混在一起好。第二一定要先做主体过滤否则行业新闻会算到行业里所有个股头上等于给同一个板块的所有股票加了同一个信号后面做行业中性化时很难处理干净。第三覆盖度过滤不能省。某只股票一周内没有任何新闻和讨论情绪得分就是缺失值不要填0。填0等于告诉模型“这只股票情绪中性”但实际上我们只是没有数据两者含义完全不同。3. 情绪因子的构建从情绪分数到可交易信号3.1 三种典型因子形态水平、变化、分歧情绪分数做出来以后直接拿去选股往往效果一般因为你没有把情绪翻译成交易逻辑。我通常把情绪因子拆成三种形态水平值、边际变化、分歧度。水平值就是个股在某个时间段内情绪分数的均值。它适合回答“市场对这只股票最近的整体态度是好是坏”这个问题比较适合周频或月频调仓和基本面因子可以平滑搭配。边际变化是当前情绪相对历史均值的偏离比如今天的情绪分数过去20天均值高了多少个标准差。交易逻辑是价格里已经反映了市场已知的情绪只有情绪的边际变化才能带来新的定价压力。这个形态适合事件驱动和日频调仓也是我最常用的形态。分歧度衡量的是正面新闻和负面新闻之间的离散程度。分歧越大意味着市场对同一事件的解读越不一致后续走势的不确定性和潜在反转概率都更高。这个形态更适合做波动率预测和风险控制而不是单纯选股。因子形态算的是什么交易逻辑适合频率水平值情绪均值态度好则买入周频/月频边际变化相对历史均值的偏离情绪改善才买入日频/事件驱动分歧度情绪得分的离散程度分歧大则回避或做多波动日频/风控三种形态没有绝对优劣关键看你的调仓周期。日频交易重点看变化和分歧因为一周前的情绪状态已经被价格消化得差不多了周频以上的调仓水平值反而更稳定。3.2 一个可直接运行的日频情绪因子雏形把理论落到实践我给出一个非常接近实盘雏形的日频情绪因子构建示例。假设你已经拿到了清洗好的新闻数据字段包括日期、股票代码、情绪分数、来源类型、文本时间距今的小时数。import numpy as np import pandas as pd DECAY_HOURS 24 SOURCE_WEIGHT {news: 1.0, social: 0.5, research: 1.5} def build_daily_sentiment(news_df): # 1. 计算单条文本的权重来源权重 * 时间衰减 news_df[weight] news_df[source].map(SOURCE_WEIGHT) * \ np.exp(-np.log(2) * news_df[age_hours] / DECAY_HOURS) # 2. 按日期和股票聚合得到当日情绪分数 daily news_df.groupby([date, stock]).apply( lambda g: np.average(g[score], weightsg[weight]) ).rename(sentiment).reset_index() # 3. 转成宽表做5日滚动平均降噪 pivot daily.pivot(indexdate, columnsstock, valuessentiment) factor pivot.rolling(5, min_periods1).mean() return factor为什么要做5日滚动平均而不是直接用当日值因为当日值受单条极端文本影响太大一条标题党新闻就能把分数打上天。5日滚动平均相当于给信号做了一次低通滤波把噪声压下来同时和5天调仓周期的节奏匹配。如果你做的是事件驱动那就不该用长周期平均而应该单独识别事件窗口在T0到T3之间使用当日强度信号。宽表得到后常规做法是做横截面标准化# 按交易日做横截面z-score消除市场整体情绪波动的影响 zs factor.sub(factor.mean(axis1), axis0).div(factor.std(axis1), axis0)标准化之后因子就能用于分组测试或排序打分。需要特别注意缺失值处理不要用0填充。我建议设置一个覆盖度门槛比如最近5天新闻条数少于5条的股票直接不参与打分宁可少选股票也不要选进一堆靠0撑起来的“伪中性”标的。3.3 为什么中性化和正交化是必选项情绪数据有一个极其隐蔽的偏差新闻覆盖度天然偏向头部公司。大市值、高关注度的科技股和消费股一天能有好几条新闻银行、公用事业、小市值股票可能一周都没人报道。如果不做处理我们选出来的其实不是“情绪最好的股票”而是“被新闻覆盖最多的股票”。解决方式就是做中性化。最基础的是对行业和市值做中性化用回归剥离掉这两类系统性影响r_{i,t} β_0 β_ind * C_ind β_size * ln(MktCap){i,t} γ * sentiment{i,t} ε实际使用时取回归的残差作为中性化后的情绪因子。如果组合里已经有价值、动量等因子还要再做一次正交化因为情绪因子和短期动量因子的相关性往往不低——情绪改善的股票短期通常已经有价格上涨的苗头。不剥离这个重叠部分后面做组合优化时会出现多重共线性风险模型也没法正确归因。这一步不是锦上添花而是雪中送炭。我见过很多情绪因子单独回测时IC很高放进多因子组合后贡献骤降绝大多数原因就是没做正交化新增信号的大部分信息已经被既有因子覆盖了。4. 情绪Alpha回测中的坑别让收益曲线骗了你4.1 时区、时戳和可交易时点隐形未来函数情绪因子回测最大的坑不是模型而是时间戳。新闻发布和实际数据抓取之间往往有时间差社交媒体帖子虽然显示发布时间但平台展示的时间和接口返回的时间经常不一致。如果不仔细处理很容易在回测中用到“当时根本不可能拿到”的数据。经典场景是财报公告。公司盘后发布业绩新闻NLP模型瞬间就给出情绪得分但这时市场已经收盘你根本不能在当天以收盘价成交。如果你在回测里用当天收盘价买入就是在用未来信息赚过去的钱这个“Alpha”是彻头彻尾的幻觉。我的处理原则很简单所有信号必须使用“数据源能够最早获取并且完成加工的时间”成交价使用信号出现后第一个可交易时点的价格。A股场景下盘后新闻统一用次日开盘价成交盘中新闻至少延迟一分钟到几分钟处理视数据管道耗时而定。代码里可以按交易日做一次日期前移# 伪代码把信号日期映射到实际可成交日期 # 假设 news_ts 已经统一到目标时区 signal_df[signal_time] signal_df[news_ts].dt.tz_convert(Asia/Shanghai) signal_df[exec_date] signal_df[signal_time].apply(next_trading_date) # 盘后信号→次日这里最关键的是“统一时区”。如果新闻源给出的UTC时间你直接按北京时间处理会导致少数在23点发布的新闻被算到次日整个信号错位一天。别问我是怎么知道的。4.2 情绪信号衰减极快持有周期和信号周期必须匹配情绪因子赚的是认知反应差。当消息在人群中扩散价格迅速完成重定价超额收益就消失了。用事件研究法看情绪信号的时间结构通常是这样的模式信号出现后第一天反应最强烈第三天边际递减第五天基本耗尽之后反而有可能出现均值回归。持有天数多空组合收益表现观察T1正收益最集中主要Alpha来源T3正收益但明显减弱信号边际递减T5接近零信息耗散T10可能转负过度反应后反转这个表格只是我基于经验画出的示意模式不代表任何具体策略承诺但足够说明问题如果你用日频情绪信号却用20日持有期的回测曲线来判断有效性结果大概率会让你误判。正确的做法是分别统计T1、T3、T5的收益表现看信号的能量主要集中在哪一段再决定持有周期。4.3 成本和换手情绪因子最大的隐形杀手情绪因子天然高换手。假设你按5天调仓每次调仓换手50%一年大约调仓50次单边年换手等于50×0.525倍。双边交易成本按万三计算总成本大约是25 × 2 × 0.0003 1.5%这还只是理想情况。如果调仓周期缩短到2天每次换手率提高到80%年换手会冲到100倍以上双边成本超过6%。而情绪因子的毛超额收益通常并没有想象中那么充裕扣除成本后可能所剩无几。所以我在构建日频情绪因子时一定做两件事一是用5日滚动平均平滑信号减少单日情绪波动带来的无谓换手二是在调仓权重上额外设置换手率上限比如单次调仓换手超过50%的部分全部按比例截断。宁可牺牲一点理论上的超额收益也要保证实盘成本和回测成本一致。很多情绪策略样本内曲线漂亮样本外却做不出钱成本估算是头号嫌疑。4.4 市场结构差异同样的信号在不同市场表现完全不同情绪Alpha在不同市场上的表现差异比很多人想象中要大。A股市场散户成交占比相对更高消息驱动的追涨杀跌行为更明显情绪信号在事件初期的反应速度更快幅度也更大但随后发生的反转往往同样剧烈。这意味着A股的情绪因子更适合做事件驱动的短线交易持有周期要短止损要明确。美股市场机构投资者占比高套利资金更充足情绪Alpha整体上更加微弱多数时间信号出来后很快被消化掉。我自己的观察是美股市场里情绪因子单独使用的性价比偏低反而是在市场级极端恐慌时用情绪极值做逆向择时更有效。这不是说哪个市场更好而是说情绪因子必须适配本地市场的交易结构和投资者画像。同一个NLP模型、同一套聚合公式在不同市场里的最优参数可能完全不同不能照搬。5. 实操心得把情绪Alpha放进组合的正确姿势5.1 情绪因子和新闻Alpha的分工这个系列后面两章会详细展开新闻Alpha这里先给一个框架性的区分。情绪Alpha度量的是交易者的状态市场有多兴奋、多恐慌、多分歧新闻Alpha度量的是事件本身的信息含量这条新闻里的数字到底是不是超出预期。同样一篇盈利预增新闻新闻Alpha看的是“预增幅度是否超过一致预期”情绪Alpha看的是“市场读到新闻后是兴奋还是麻痹”。这两个信号相关性中等但在极端情况下会共振既超预期又引发高度兴奋的消息往往是最强的交易信号。组合使用的时候建议先各自正交化再看增量贡献不要简单把两个分数相加当新因子。5.2 把情绪因子做成卫星仓位而不是全部做了几年情绪因子我的整体感受是它是一个需要不断维护的雷达不是一个可以长期躺赢的压舱石。在组合管理中我更倾向于把情绪因子作为卫星仓位占总风险预算的20%到30%核心仓位仍然来自基本面和量价因子。原因说过很多次容量有限、换手高、样本外衰减快。具体权重可以用滚动ICIR来动态调整。ICIR就是近一段时间内IC的均值除以标准差它衡量信号稳定性。当ICIR明显下降时降低情绪因子权重当ICIR恢复时再逐步加回来。公式上可以这样约束w_sent,t max(0, min(w_max, target_te * IR_t / (σ_sent,t * √N)))这里 target_te 是目标跟踪误差IR_t 是滚动ICIRσ_sent 是情绪因子组合收益的历史波动率N 是调仓频率相关的时间项。实际使用中我会给权重设置一个上限比如总风险的30%防止某一小段样本内最优的区间把情绪因子捧上天结果一实盘就失效。5.3 三个最容易犯的错以及我的应对方式第一个错误用全样本做标准化和选参。情绪数据本身非平稳新闻覆盖度、平台活跃度、市场环境每年都在变。如果用全样本计算均值、标准差和最优参数等于把未来信息放进了历史信号里回测曲线当然漂亮。我的应对是所有均值、标准差、衰减系数只用滚动窗口计算参数筛选必须做walk-forward分析每一期的参数只能使用当期之前的信息。第二个错误把中性股评和缺失信号混为一谈。没有新闻不等于情绪中性可能只是覆盖度不够。强行把缺失值填成0会让策略不断选到“不被关注”的股票这本质上是在赌被市场遗忘的标的而不是在做情绪Alpha。我的应对是先设定覆盖度门槛比如最近5天至少5条相关新闻或讨论不达标的股票不进入情绪因子打分池。第三个错误直接套用通用NLP情感模型。金融语言里“下调”“承压”“扭亏为盈”“符合预期”这些词在通用情感模型下经常被误判。把“业绩承压”识别成负面可能没问题但把“下调目标价但维持买入评级”这种混合信号识别成单一情绪方向就会出大问题。我的应对是使用金融语料微调过的模型或者至少结合金融情感词典做二次校验把模型输出和关键词规则互相印证。这三个错误我都踩过每一个都让回测收益曲线虚高了。把这些问题处理干净之后情绪因子才算真正能拿去实盘验证。我个人越来越觉得情绪Alpha不是用来替代传统因子的它是用来在市场情绪极端时最早亮灯的预警系统也是用来捕捉那些传统因子反应不过来的短期定价偏差的补充工具。把它和新闻事件、量价信号放在一起看比单独使用更有价值。