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 却可能因为“减”字带有“减少”的正面倾向而误判。

避坑指南: 我曾经用 SnowNLP 直接分析财经新闻,结果发现“公司宣布回购股票”这种大利好,得分只有 0.6 左右。原因很简单——SnowNLP 的训练语料是电影评论、购物评价,它没见过“回购”这个词。

所以,通用词典只能当“地基”,不能直接拿来盖楼。你需要在此基础上,叠加金融领域的专业词典。

4.2 金融领域情感词典:Loughran-McDonald 的定制

Loughran-McDonald 词典(简称 LM 词典)是金融情感分析的“圣经”。它由两位教授从上市公司年报中提炼出来,专门针对金融文本。词典把词汇分成六类:正面、负面、不确定性、诉讼、强语气、弱语气

我个人的习惯是,重点使用其中的正面和负面词表。因为对于选股策略来说,我们最关心的是“利好”还是“利空”。

LM 词典是英文的,但我们可以把它翻译并适配到中文场景。下面是我整理的一个简化版中文金融情感词典示例:

类别 示例词汇 权重
正面 增长、盈利、突破、创新高、超预期、回购 +1
负面 亏损、下跌、违约、暴雷、减持、立案调查 -1
不确定性 可能、或许、不确定、风险、波动 0(但需标记)
诉讼 起诉、仲裁、罚款、赔偿、违规 -1.5(加重)

你可能会问:为什么“诉讼”类词汇的权重是 -1.5?因为我在回测中发现,涉及诉讼的新闻对股价的冲击往往比普通负面消息更大。这就是定制化的意义——根据你的策略需求调整权重。

4.3 如何构建你自己的情感词典

光靠现成的词典是不够的。我建议你按照以下步骤,构建一套属于自己的情感词典:

  1. 收集基础词表:从 SnowNLP、LM 词典、知网情感词典等来源,合并去重。
  2. 标注金融领域特有词汇:比如“放量上涨”、“缩量下跌”、“金叉”、“死叉”等。这些词通用词典里大概率没有。
  3. 人工校验:找 500 条财经新闻,用词典打分,然后人工检查误判的案例。我做过一次,发现“扭亏为盈”这种复合词,词典拆成“扭亏”(负面)和“为盈”(正面),结果得分接近 0,但实际是大利好。
  4. 迭代优化:把误判的词汇加入词典,或者调整权重。这个过程可能要重复 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 左右。这就是定制词典的价值。

小技巧: 权重不要设太大。我刚开始做的时候,给“暴雷”设了 -0.5,结果所有带“雷”字的新闻都被判为负面,连“雷军”都躺枪。后来改成 -0.2,效果就好多了。

4.5 情感词典构建的整体流程

为了让你看得更清楚,我画了一张流程图,展示从原始文本到情感得分的完整链路:

情感词典构建与打分流程 原始财经新闻文本 中文分词(Jieba) SnowNLP 通用打分 金融词典匹配打分 加权融合得到最终得分

这个流程看起来简单,但每一步都有坑。比如分词阶段,如果没把“超预期”作为一个整体词,就会被拆成“超”和“预期”,导致情感判断完全错误。我建议你直接用 Jieba 的精确模式,并加载自定义词典。

4.6 避坑总结

  • 不要迷信通用词典:SnowNLP 在金融领域准确率不到 60%,必须叠加金融词典。
  • 权重需要反复调:我一开始给所有负面词都设 -0.3,结果策略过于保守,错过了很多反弹机会。后来改成 -0.15 到 -0.25 的动态权重,效果才好。
  • 注意否定词:“没有暴雷”其实是正面,但词典会匹配到“暴雷”而判为负面。需要加否定词检测逻辑。
  • 定期更新词典:2023 年“量化交易”还是中性词,2024 年监管收紧后,这个词在新闻里往往带负面情绪。词典得跟上时代。

好了,情感词典这块就聊到这儿。记住,词典是死的,市场是活的。多跑回测,多调参数,你才能找到最适合自己策略的那套词典。


公众号:蓝海数据掘金营,微信 deep3321