第十一章:新闻与舆情信息
做量化交易这些年,我越来越觉得——市场不只是数字的游戏,更是人心的博弈。新闻和舆情,说白了就是市场情绪的体温计。你想想看,一条突发新闻能让股价瞬间跳水,一条推特能让币圈翻天。这些信息里到底藏着多少交易价值?今天我们就来拆解一下。
11.1 新闻情绪分析
新闻情绪分析,就是把文字变成数字。我刚开始做的时候,以为这玩意儿很简单——正面词加分,负面词减分呗。后来发现,事情远没那么简单。
11.1.1 情感词典法
最基础的做法,是用情感词典。比如Loughran-McDonald词典,专门为金融文本设计的。我习惯把它作为基线模型,快速验证想法。
# 一个简单的新闻情绪打分
import pandas as pd
from nltk.sentiment import SentimentIntensityAnalyzer
def news_sentiment_score(text):
sia = SentimentIntensityAnalyzer()
scores = sia.polarity_scores(text)
return scores['compound'] # -1到1之间
嗯,这里要注意:词典法对反讽、否定句的处理很差。比如“这家公司业绩没有下滑”——词典可能给出负面评分,但实际是正面消息。
11.1.2 深度学习法
现在主流做法是用预训练模型,比如BERT、FinBERT。我个人偏好FinBERT,它在金融语料上微调过,对专业术语的理解更准。
from transformers import pipeline
# 加载FinBERT模型
sentiment_pipeline = pipeline(
"sentiment-analysis",
model="ProsusAI/finbert"
)
result = sentiment_pipeline("公司Q3营收超预期,同比增长30%")
print(result) # 输出: [{'label': 'positive', 'score': 0.98}]
深度学习模型的好处是能理解上下文。比如“这家公司被做空机构盯上了”——词典法可能只看到“做空”是负面,但模型能结合“盯上”这个动词,判断出整体情绪确实偏空。
11.2 社交媒体舆情指标
社交媒体这块,我重点看三个维度:量、情绪、异常。
| 指标 | 含义 | 我常用的阈值 |
|---|---|---|
| 讨论量 | 特定标的的帖子数量 | 超过5日均值3倍为异常 |
| 情绪得分 | 正面/负面帖子比例 | 低于0.3为极度悲观 |
| 分歧度 | 情绪得分的标准差 | 高于0.6说明市场分歧大 |
| 传播速度 | 每小时新增帖子数 | 超过100条/小时需关注 |
我记得有一次,某只股票在Reddit上的讨论量突然暴增,但情绪得分很低。我当时觉得是散户在发泄不满,没当回事。结果第二天开盘暴跌12%——原来是有内部消息提前泄露了。从那以后,我把“讨论量+情绪得分”的组合指标作为必看项。
11.3 新闻事件驱动的交易策略
事件驱动策略,核心就一句话:市场对新闻的反应,比新闻本身更重要。
11.3.1 事件分类与响应模式
我一般把事件分成三类:
- 预期内事件:比如财报发布,市场已有预期。这时候“利好出尽是利空”很常见。
- 超预期事件:比如突然宣布收购。这类事件往往有持续影响。
- 黑天鹅事件:比如监管突袭。这类事件需要快速止损。
举个例子。某公司财报超预期,但股价反而跌了。为什么?因为市场预期的是“超预期20%”,实际只超了5%。这就是预期差。我习惯用“实际值 vs 分析师预期”的差值来量化这种偏差。
# 事件驱动策略的简单框架
def event_driven_strategy(news_event, market_data):
# 计算预期差
surprise = (news_event['actual'] - news_event['expected']) / news_event['expected']
# 判断市场反应
if surprise > 0.1 and market_data['volume'] > 1.5 * market_data['avg_volume']:
# 超预期且放量,做多
return 'long'
elif surprise < -0.1 and market_data['volume'] > 1.5 * market_data['avg_volume']:
# 低于预期且放量,做空
return 'short'
else:
# 预期内,观望
return 'hold'
11.3.2 事件衰减模型
新闻的影响力会随时间衰减。我常用的衰减函数是指数衰减:
import numpy as np
def news_decay_weight(t, half_life=60):
"""
t: 新闻发生后的分钟数
half_life: 半衰期,默认60分钟
"""
return np.exp(-np.log(2) * t / half_life)
嗯,这里有个坑:不同事件的半衰期不一样。财报影响可能持续几天,而一条推特可能半小时就失效了。我建议根据事件类型动态调整半衰期。
11.4 新闻信息衰减速度
信息衰减速度,说白了就是“这条新闻还能管多久”。我做过一个实验:统计了1000条新闻对股价的影响时长。
| 新闻类型 | 平均影响时长 | 半衰期 |
|---|---|---|
| 财报新闻 | 3-5天 | 120分钟 |
| 行业政策 | 1-2周 | 240分钟 |
| 公司公告 | 1-2天 | 60分钟 |
| 社交媒体传闻 | 30分钟-2小时 | 15分钟 |
| 宏观数据 | 1-3天 | 90分钟 |
你看,社交媒体传闻的半衰期只有15分钟。这意味着什么?如果你看到一条推特后5分钟才下单,可能已经错过了最佳时机。所以我做舆情策略时,对社交数据的延迟要求特别高——最好在1秒内完成采集和分析。
知识体系总览
下面这张图,是我对本章内容的总结。你可以把它当作一个快速索引。
这张图把四个模块串起来了。从左到右看:先做情绪分析,再结合社交媒体指标,然后设计事件驱动策略,最后别忘了考虑信息衰减。每一步都有坑,但每一步也都有机会。
好了,这一章的内容就到这里。新闻和舆情这块,说白了就是跟市场情绪打交道。你如果能比别人早5分钟读懂情绪,早5分钟判断衰减速度,那这5分钟就是你的超额收益来源。