3、情绪量化指标(上):基于文本的情绪指标——新闻情感分析、社交媒体情绪(Twitter/微博)

各位同学,今天我们来聊聊情绪量化指标中最接地气的一块——基于文本的情绪分析

说白了,就是让机器去读新闻、刷微博、看推特,然后告诉我们:市场现在到底是乐观还是悲观?

我在做量化策略的时候,一开始其实不太信这个。觉得K线、成交量这些硬数据才靠谱。直到有一次,我跑了一个基于新闻情绪的短线策略,回测效果居然比单纯的技术指标好不少。嗯,从那以后,我再也不敢小看文本情绪了。

核心观点:文本情绪指标,本质上是将非结构化的自然语言,转化为结构化的数值信号。它捕捉的是市场参与者的「心理温度」。

3.1 为什么文本情绪如此重要?

你想想看,市场是由人组成的。人的决策,很大程度上受情绪影响。行为金融学告诉我们,恐惧和贪婪是驱动价格短期波动的两大引擎。

传统的财务数据(比如PE、PB)是滞后的。等财报出来,黄花菜都凉了。但新闻和社交媒体是实时的。一条突发新闻,一条大V的微博,可能在几分钟内就改变了市场情绪。

我个人习惯把文本情绪比作「市场的脉搏」。它跳得快还是慢,直接反映了市场的健康状况。

  • 新闻情绪:偏向理性、权威、滞后性稍强。适合做中长线趋势判断。
  • 社交媒体情绪:偏向感性、散户化、即时性极强。适合做短线情绪博弈。

3.2 新闻情感分析:从标题到信号

新闻情感分析,是文本情绪里最成熟的技术。我最早接触这个,是在做「事件驱动策略」的时候。

核心流程其实不复杂,就三步:

  1. 数据获取:爬取财经新闻、公司公告、宏观数据发布。
  2. 文本预处理:分词、去停用词、词干提取。
  3. 情感打分:用词典或模型给每篇文章打分。

3.2.1 基于词典的方法

这是最经典的方法。说白了,就是准备一个「正面词库」和一个「负面词库」。然后数一数文章里正面词和负面词各出现了多少次。

举个例子:

# 伪代码示例
positive_words = ['上涨', '突破', '利好', '盈利', '增长']
negative_words = ['下跌', '崩盘', '利空', '亏损', '衰退']

def sentiment_score(text):
    pos_count = sum(1 for word in text if word in positive_words)
    neg_count = sum(1 for word in text if word in negative_words)
    return (pos_count - neg_count) / (pos_count + neg_count + 1)

我在项目中遇到过一个问题:「超预期下跌」这个词,词典法会把它识别为负面。但实际语境中,如果市场预期是「暴跌」,结果只是「下跌」,那其实是利好。这就是词典法的局限性——它不理解上下文。

避坑指南:我曾经因为词典法误判「业绩爆雷」中的「爆」字(它被识别为正面词),导致策略在财报季连续亏损。后来我加了一个否定词处理模块,才把这个问题解决。

3.2.2 基于机器学习的方法

为了解决词典法的缺陷,现在主流做法是用预训练模型,比如BERT、FinBERT。

这些模型能理解上下文。比如:

  • 「这家公司终于盈利了」—— 正面
  • 「这家公司勉强盈利了」—— 中性偏负面

模型能捕捉到「终于」和「勉强」这种细微差别。这是词典法做不到的。

我的建议:如果你刚开始做,先用词典法快速验证想法。等策略跑通了,再换成BERT模型来提升精度。别一上来就搞大模型,容易陷入「调参地狱」。

3.3 社交媒体情绪:Twitter与微博的「情绪放大器」

社交媒体情绪,跟新闻情绪完全是两码事。

新闻是「发生了什么」,社交媒体是「大家怎么看待这件事」。后者更情绪化,更极端,也更难量化。

3.3.1 Twitter情绪分析

Twitter上的数据,特点是短、快、噪。一条推文最多280个字符,但信息密度极高。

我常用的方法是:

  • 关键词过滤:只抓取包含 $AAPL、$BTC 这类股票/币种标签的推文。
  • 情感极性分类:用VADER(一个专门针对社交媒体的情感分析工具)打分。
  • 聚合指标:计算每小时的平均情感得分、推文数量(热度)、极端情绪占比。

举个例子,VADER的打分范围是 -1(极度负面)到 +1(极度正面)。

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

analyzer = SentimentIntensityAnalyzer()
text = "Bitcoin is going to the moon! 🚀"
score = analyzer.polarity_scores(text)
print(score)  # {'neg': 0.0, 'neu': 0.0, 'pos': 1.0, 'compound': 0.999}

你看,一条推文就能给出一个非常明确的情绪信号。

关键洞察:社交媒体情绪有一个特点——「群体极化」。当市场上涨时,大家会越来越乐观;当市场下跌时,恐慌情绪会自我强化。这种情绪的正反馈效应,往往预示着趋势的加速或反转。

3.3.2 微博情绪分析

微博跟Twitter类似,但有几个本土化的特点:

  • 表情包文化:「狗头」「吃瓜」等表情,往往带有反讽或调侃意味。
  • 长文转评:微博的评论区经常比正文更有价值。
  • 大V效应:几个头部财经博主的态度,可能影响整个散户群体的情绪。

我在做A股情绪指标时,发现一个有意思的现象:当「李大霄」的微博开始频繁使用「婴儿底」「钻石底」这类词时,往往意味着市场情绪已经极度悲观,底部可能不远了。这就是行为金融学里的「反向指标」逻辑。

3.4 知识体系与核心逻辑

下面这张图,是我自己梳理的文本情绪分析框架。你可以把它当作本章的「地图」。

文本情绪量化指标:知识体系 数据源 数据源 财经新闻 / 公司公告 Twitter / 微博 / 论坛 处理方法 词典法(词库匹配) 机器学习(BERT等) 专用工具(VADER) 输出指标 情感得分(-1 ~ +1) 情绪热度(推文数量) 极端情绪占比

3.5 实战中的注意事项

最后,分享几个我在实战中踩过的坑:

问题 表现 我的解决方案
数据延迟 新闻API有15分钟延迟,策略信号滞后 改用WebSocket实时流,或结合社交媒体情绪做「提前量」
情感歧义 「暴跌后反弹」被识别为正面,实际是负面 引入时间窗口,分析情绪的变化趋势而非绝对值
噪音干扰 水军刷屏导致情绪指标失真 过滤掉粉丝数<100的账号,或使用「影响力加权」
过拟合 回测效果极好,实盘一塌糊涂 用滚动窗口验证,避免「未来函数」

一个小技巧:我个人习惯把文本情绪指标跟技术指标(如RSI、成交量)结合起来用。比如:当RSI超卖 + 社交媒体情绪极度悲观,这时候做多,胜率会明显提高。这就是「情绪+技术」的双重确认。

好了,关于基于文本的情绪指标,我们就先聊到这里。下一节我们会继续深入,看看如何把这些情绪信号真正用到策略里。


公众号:蓝海资料掘金营,微信deep3321