3、情绪量化指标(上):基于文本的情绪指标——新闻情感分析、社交媒体情绪(Twitter/微博)
各位同学,今天我们来聊聊情绪量化指标中最接地气的一块——基于文本的情绪分析。
说白了,就是让机器去读新闻、刷微博、看推特,然后告诉我们:市场现在到底是乐观还是悲观?
我在做量化策略的时候,一开始其实不太信这个。觉得K线、成交量这些硬数据才靠谱。直到有一次,我跑了一个基于新闻情绪的短线策略,回测效果居然比单纯的技术指标好不少。嗯,从那以后,我再也不敢小看文本情绪了。
核心观点:文本情绪指标,本质上是将非结构化的自然语言,转化为结构化的数值信号。它捕捉的是市场参与者的「心理温度」。
3.1 为什么文本情绪如此重要?
你想想看,市场是由人组成的。人的决策,很大程度上受情绪影响。行为金融学告诉我们,恐惧和贪婪是驱动价格短期波动的两大引擎。
传统的财务数据(比如PE、PB)是滞后的。等财报出来,黄花菜都凉了。但新闻和社交媒体是实时的。一条突发新闻,一条大V的微博,可能在几分钟内就改变了市场情绪。
我个人习惯把文本情绪比作「市场的脉搏」。它跳得快还是慢,直接反映了市场的健康状况。
- 新闻情绪:偏向理性、权威、滞后性稍强。适合做中长线趋势判断。
- 社交媒体情绪:偏向感性、散户化、即时性极强。适合做短线情绪博弈。
3.2 新闻情感分析:从标题到信号
新闻情感分析,是文本情绪里最成熟的技术。我最早接触这个,是在做「事件驱动策略」的时候。
核心流程其实不复杂,就三步:
- 数据获取:爬取财经新闻、公司公告、宏观数据发布。
- 文本预处理:分词、去停用词、词干提取。
- 情感打分:用词典或模型给每篇文章打分。
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 知识体系与核心逻辑
下面这张图,是我自己梳理的文本情绪分析框架。你可以把它当作本章的「地图」。
3.5 实战中的注意事项
最后,分享几个我在实战中踩过的坑:
| 问题 | 表现 | 我的解决方案 |
|---|---|---|
| 数据延迟 | 新闻API有15分钟延迟,策略信号滞后 | 改用WebSocket实时流,或结合社交媒体情绪做「提前量」 |
| 情感歧义 | 「暴跌后反弹」被识别为正面,实际是负面 | 引入时间窗口,分析情绪的变化趋势而非绝对值 |
| 噪音干扰 | 水军刷屏导致情绪指标失真 | 过滤掉粉丝数<100的账号,或使用「影响力加权」 |
| 过拟合 | 回测效果极好,实盘一塌糊涂 | 用滚动窗口验证,避免「未来函数」 |
一个小技巧:我个人习惯把文本情绪指标跟技术指标(如RSI、成交量)结合起来用。比如:当RSI超卖 + 社交媒体情绪极度悲观,这时候做多,胜率会明显提高。这就是「情绪+技术」的双重确认。
好了,关于基于文本的情绪指标,我们就先聊到这里。下一节我们会继续深入,看看如何把这些情绪信号真正用到策略里。
公众号:蓝海资料掘金营,微信deep3321