第四章:舆情文本因子构建
文本数据,说白了就是市场情绪的「温度计」。我做了这么多年量化,发现一个规律:价格波动之前,往往先有舆论的暗流涌动。这一章,我们就来聊聊怎么从新闻、社交媒体、研报这些文本里,挖出能赚钱的因子。
核心逻辑:文本数据 → 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 情感分析
情感分析,说白了就是判断一句话是正面还是负面。我常用的方法有两种:
- 词典法:建一个情感词典,正面词加分,负面词减分。简单粗暴,但够用。
- 模型法:用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处理,再到因子构建,最后落到策略上。每一步都有坑,但每一步也都有机会。
核心要点回顾:
- 文本数据源要选对,新闻、社交、研报各有优劣
- NLP处理要扎实,分词、情感、TF-IDF是基本功
- 因子构建要灵活,情感、热度、分歧度是三大支柱