第四章:舆情文本因子构建

文本数据,说白了就是市场情绪的「温度计」。我做了这么多年量化,发现一个规律:价格波动之前,往往先有舆论的暗流涌动。这一章,我们就来聊聊怎么从新闻、社交媒体、研报这些文本里,挖出能赚钱的因子。

核心逻辑:文本数据 → NLP处理 → 量化因子 → 策略信号

4.1 文本数据源:三大主流来源

我个人习惯把文本数据源分成三类。每一类都有自己的脾气,处理方式也不一样。

4.1.1 新闻数据

新闻是最传统的文本源。权威性高,但频率低。我一般用路透、彭博、财新这些渠道。注意一点:新闻发布到市场反应,中间有延迟。你想想看,等新闻出来再交易,黄花菜都凉了。

  • 优点:信息质量高,噪音少
  • 缺点:频率低(日频为主),覆盖不全
  • 处理重点:事件识别、主体提取

4.1.2 社交媒体数据

微博、雪球、股吧这些地方,才是情绪的「原产地」。我记得有一次做回测,发现雪球上某只股票的讨论量突然暴增,第二天股价就异动了。嗯,这就是社交媒体的价值——领先性。

  • 优点:高频(分钟级),情绪真实
  • 缺点:噪音大,水军多
  • 处理重点:去噪、情感纠偏

4.1.3 研报数据

券商研报,说白了就是「机构观点」。我建议重点关注两个东西:评级调整和关键词变化。比如「买入」变成「增持」,这背后往往有故事。

  • 优点:专业性强,有深度
  • 缺点:频率低,存在利益冲突
  • 处理重点:评级量化、观点提取

我的经验:三种数据源最好结合使用。新闻看事实,社交媒体看情绪,研报看逻辑。单一来源容易出偏差。

4.2 NLP基础:从文字到数字

文本数据不能直接用,得先转成数字。这里我挑三个最常用的技术讲讲。

4.2.1 分词

中文分词是个老大难问题。「南京市长江大桥」这句话,你让机器切,它可能切成「南京/市长/江大桥」。我在项目中遇到过这种尴尬,后来改用jieba分词,配合自定义词典,效果好了不少。

import jieba

text = "这家公司业绩超预期,市场反应积极"
words = jieba.lcut(text)
print(words)
# 输出:['这家', '公司', '业绩', '超预期', ',', '市场', '反应', '积极']

4.2.2 情感分析

情感分析,说白了就是判断一句话是正面还是负面。我常用的方法有两种:

  1. 词典法:建一个情感词典,正面词加分,负面词减分。简单粗暴,但够用。
  2. 模型法:用BERT这类预训练模型。精度高,但计算量大。

为什么会这样?因为词典法适合快速迭代,模型法适合精细场景。我一般先用词典法跑全量数据,再用模型法做关键样本的二次确认。

# 词典法示例
positive_words = ['增长', '盈利', '突破', '利好']
negative_words = ['亏损', '下滑', '风险', '利空']

def simple_sentiment(text):
    score = 0
    for word in positive_words:
        if word in text:
            score += 1
    for word in negative_words:
        if word in text:
            score -= 1
    return score

4.2.3 TF-IDF

TF-IDF用来衡量一个词在文档中的重要性。公式不复杂:TF(词频)× IDF(逆文档频率)。

我举个例子:在1000篇研报里,「业绩」出现了500次,「超预期」出现了20次。那「超预期」的IDF值就高,说明这个词更有区分度。嗯,这里要注意:TF-IDF对短文本效果一般,社交媒体这种短文本,我建议用Word2Vec或者BERT embedding。

避坑指南:我曾经在社交媒体数据上直接用TF-IDF,结果发现「涨停」这个词权重极高,但实际上一半是吹牛,一半是反话。后来加了情感权重,才把这个问题解决。

4.3 舆情因子构建:三大核心因子

有了NLP基础,我们就可以构建因子了。我个人最常用的三个因子:情感得分、热度、分歧度。

4.3.1 情感得分因子

这个最简单,就是文本情感的平均值。但要注意归一化,不同股票的情感基准线不一样。比如茅台常年正面,ST股常年负面,你得做差分处理。

def sentiment_factor(sentiment_scores, benchmark):
    # 减去基准线,得到超额情感
    excess_sentiment = sentiment_scores - benchmark
    return excess_sentiment

4.3.2 热度因子

热度,说白了就是讨论量。我一般用两个指标:

指标 计算方式 应用场景
绝对热度 文本数量 / 时间窗口 突发事件检测
相对热度 当前热度 / 历史平均热度 异常关注度识别

我建议用相对热度。因为绝对热度受市值影响太大——大盘股讨论量天然就高,小盘股稍微一讨论就是异常。

4.3.3 分歧度因子

这个因子很有意思。分歧度衡量的是市场意见是否一致。如果所有人都说好,那可能已经price in了。如果有人说好有人说坏,那才有博弈空间。

计算方式:

def disagreement_factor(sentiments):
    # 用标准差衡量分歧度
    std = np.std(sentiments)
    # 用正负比例衡量分歧度
    pos_ratio = sum(sentiments > 0) / len(sentiments)
    neg_ratio = sum(sentiments < 0) / len(sentiments)
    disagreement = 1 - abs(pos_ratio - neg_ratio)
    return disagreement

我的经验:分歧度因子在事件驱动策略里特别好用。比如财报发布后,如果市场分歧大,后续波动往往也大。这时候做多波动率,胜率不错。

4.4 知识体系总览

下面这张图,是我自己梳理的舆情因子构建流程。你看一眼,心里就有谱了。

舆情因子构建流程 新闻数据 社交媒体 研报数据 NLP处理 分词 → 情感分析 → TF-IDF → 实体识别 情感得分因子 热度因子 分歧度因子 策略应用:事件驱动 / 情绪套利 / 波动率交易

这张图把整个流程串起来了。从数据源到NLP处理,再到因子构建,最后落到策略上。每一步都有坑,但每一步也都有机会。

核心要点回顾

  • 文本数据源要选对,新闻、社交、研报各有优劣
  • NLP处理要扎实,分词、情感、TF-IDF是基本功
  • 因子构建要灵活,情感、热度、分歧度是三大支柱

专注资料整理