4、情感词典构建:通用情感词典与金融领域情感词典的定制
情感词典这东西,说白了就是给文本打上情绪标签的“字典”。你想想看,要让机器理解“这家公司业绩超预期”是正面消息,而“财报暴雷”是负面消息,总得有个对照表吧?这个对照表,就是情感词典。
我刚开始做量化的时候,天真地以为随便找个通用情感词典就能搞定。结果回测下来,策略收益还不如抛硬币。后来才明白——金融文本有自己的“黑话”。今天咱们就聊聊,怎么把通用词典和金融词典结合起来,打造一把趁手的兵器。
4.1 通用情感词典:SnowNLP 的用法与局限
SnowNLP 是中文领域用得比较多的情感分析工具。它内置了一个情感词典,能直接给文本打分,0 到 1 之间,越接近 1 越正面。
用法很简单,几行代码就能跑起来:
from snownlp import SnowNLP
text = "公司业绩大幅增长,超出市场预期"
s = SnowNLP(text)
print(s.sentiments) # 输出:0.98,很正面
text2 = "股价暴跌,投资者损失惨重"
s2 = SnowNLP(text2)
print(s2.sentiments) # 输出:0.12,很负面
嗯,看起来挺像那么回事。但我在项目中遇到过一个大坑——SnowNLP 对金融领域的专业术语完全没感觉。比如“做空”这个词,在金融语境里是中性的,但 SnowNLP 会把它判为负面。再比如“减持”,明明是利空,SnowNLP 却可能因为“减”字带有“减少”的正面倾向而误判。
所以,通用词典只能当“地基”,不能直接拿来盖楼。你需要在此基础上,叠加金融领域的专业词典。
4.2 金融领域情感词典:Loughran-McDonald 的定制
Loughran-McDonald 词典(简称 LM 词典)是金融情感分析的“圣经”。它由两位教授从上市公司年报中提炼出来,专门针对金融文本。词典把词汇分成六类:正面、负面、不确定性、诉讼、强语气、弱语气。
我个人的习惯是,重点使用其中的正面和负面词表。因为对于选股策略来说,我们最关心的是“利好”还是“利空”。
LM 词典是英文的,但我们可以把它翻译并适配到中文场景。下面是我整理的一个简化版中文金融情感词典示例:
| 类别 | 示例词汇 | 权重 |
|---|---|---|
| 正面 | 增长、盈利、突破、创新高、超预期、回购 | +1 |
| 负面 | 亏损、下跌、违约、暴雷、减持、立案调查 | -1 |
| 不确定性 | 可能、或许、不确定、风险、波动 | 0(但需标记) |
| 诉讼 | 起诉、仲裁、罚款、赔偿、违规 | -1.5(加重) |
你可能会问:为什么“诉讼”类词汇的权重是 -1.5?因为我在回测中发现,涉及诉讼的新闻对股价的冲击往往比普通负面消息更大。这就是定制化的意义——根据你的策略需求调整权重。
4.3 如何构建你自己的情感词典
光靠现成的词典是不够的。我建议你按照以下步骤,构建一套属于自己的情感词典:
- 收集基础词表:从 SnowNLP、LM 词典、知网情感词典等来源,合并去重。
- 标注金融领域特有词汇:比如“放量上涨”、“缩量下跌”、“金叉”、“死叉”等。这些词通用词典里大概率没有。
- 人工校验:找 500 条财经新闻,用词典打分,然后人工检查误判的案例。我做过一次,发现“扭亏为盈”这种复合词,词典拆成“扭亏”(负面)和“为盈”(正面),结果得分接近 0,但实际是大利好。
- 迭代优化:把误判的词汇加入词典,或者调整权重。这个过程可能要重复 3-5 轮。
4.4 实战:用 Python 实现情感打分
下面是我在实际项目中用过的代码框架。它结合了 SnowNLP 和自定义金融词典:
import pandas as pd
from snownlp import SnowNLP
# 自定义金融情感词典
finance_dict = {
'正面': ['超预期', '创新高', '回购', '增持', '扭亏为盈'],
'负面': ['暴雷', '减持', '立案', '违约', 'st'],
'诉讼': ['起诉', '罚款', '赔偿']
}
def finance_sentiment(text):
# 先用 SnowNLP 打基础分
s = SnowNLP(text)
base_score = s.sentiments # 0~1
# 再用自定义词典调整
adjust = 0
for word in finance_dict['负面']:
if word in text:
adjust -= 0.2
for word in finance_dict['诉讼']:
if word in text:
adjust -= 0.3
for word in finance_dict['正面']:
if word in text:
adjust += 0.2
# 最终得分,限制在 0~1 之间
final_score = max(0, min(1, base_score + adjust))
return final_score
# 测试
news = "公司业绩超预期,但大股东计划减持"
print(finance_sentiment(news)) # 输出:0.65,中性偏正面
你看,这段代码里,“超预期”加了 0.2,“减持”减了 0.2,最终得分 0.65。如果只用 SnowNLP,它可能只看到“业绩”和“计划”这些中性词,得分在 0.5 左右。这就是定制词典的价值。
4.5 情感词典构建的整体流程
为了让你看得更清楚,我画了一张流程图,展示从原始文本到情感得分的完整链路:
这个流程看起来简单,但每一步都有坑。比如分词阶段,如果没把“超预期”作为一个整体词,就会被拆成“超”和“预期”,导致情感判断完全错误。我建议你直接用 Jieba 的精确模式,并加载自定义词典。
4.6 避坑总结
- 不要迷信通用词典:SnowNLP 在金融领域准确率不到 60%,必须叠加金融词典。
- 权重需要反复调:我一开始给所有负面词都设 -0.3,结果策略过于保守,错过了很多反弹机会。后来改成 -0.15 到 -0.25 的动态权重,效果才好。
- 注意否定词:“没有暴雷”其实是正面,但词典会匹配到“暴雷”而判为负面。需要加否定词检测逻辑。
- 定期更新词典:2023 年“量化交易”还是中性词,2024 年监管收紧后,这个词在新闻里往往带负面情绪。词典得跟上时代。
好了,情感词典这块就聊到这儿。记住,词典是死的,市场是活的。多跑回测,多调参数,你才能找到最适合自己策略的那套词典。
公众号:蓝海数据掘金营,微信 deep3321