我做过一个统计。
2019年到2023年,我每天早上花在“看消息”上的时间,平均是47分钟。
看什么?三大报头条、隔夜美股、券商晨会纪要、财联社快讯、雪球热帖、微博热搜里的财经话题。看完觉得心里有谱了,才敢打开交易软件。
我一直以为这47分钟是值得的。直到去年,我终于鼓起勇气问了一个我早就该问的问题:
这些新闻,到底对第二天的涨跌有多准的预测力?
我写了一个爬虫,拉了10万条财经新闻。又写了一套标注程序,把每条新闻的“利好/利空”方向和对应标的第二天的实际走势做了匹配。
结果出来的时候,我觉得过去五年的47分钟,有35分钟是白花的。
一、实验设计:把新闻变成可验证的预测
第一步:获取新闻。
我爬了三类来源:
- 财联社快讯(短讯、盘中推送)
- 三大证券报网站(政策解读、行业分析)
- 雪球热帖标题(散户情绪)
时间跨度:2020年1月 - 2023年12月,四年。总共10.7万条。
第二步:标注方向。
我用了一套最简单的关键词规则,把新闻分成三类:
- 利好:提及“增长”“超预期”“政策支持”“中标”“涨价”
- 利空:提及“下滑”“不及预期”“监管”“处罚”“降价”
- 中性:没有明确方向
第三步:关联标的。
如果新闻明确提及某只股票或某个ETF可以直接对应的行业,记录对应的股票代码;如果是宏观新闻,记录对应的大盘指数(沪深300)。
第四步:计算预测准确率。
对于每一条被标注为“利好”或“利空”的新闻,记录它发布后下一个交易日的标的涨跌。利好新闻,如果第二天涨了,算“命中”;如果跌了,算“失误”。利空则反过来。
二、核心代码:新闻爬取与准确率计算
下面是完整可运行的核心代码逻辑。为了合规和可行性,我用了AkShare获取财联社电报作为示例数据源,你也可以替换成自己的新闻数据。
import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')
# ========== 第一步:获取财联社电报数据(示例)==========
# 获取2023年全年的财联社电报
news_df = pd.DataFrame()
for month inrange(1,13):
try:
start =f"2023-{month:02d}-01"
end =f"2023-{month:02d}-28"if month !=12else"2023-12-31"
# 财联社电报接口(AkShare 免费)
df = ak.stock_info_global_cls( start_date=start, end_date=end)
news_df = pd.concat([news_df, df], ignore_index=True)
except:
continue
print(f"共获取新闻{len(news_df)}条")
# ========== 第二步:关键词标注利好/利空 ==========
positive_words =['增长','超预期','政策支持','中标','涨价','翻倍','创新高',
'利好','复苏','突破','扩大','签约','获批','增持','回购']
negative_words =['下滑','不及预期','监管','处罚','降价','暴跌','亏损',
'利空','减持','退市','违约','警示','调查','停产']
deflabel_news(title):
title =str(title)
pos_count =sum(1for w in positive_words if w in title)
neg_count =sum(1for w in negative_words if w in title)
if pos_count > neg_count:
return'利好'
elif neg_count > pos_count:
return'利空'
else:
return'中性'
news_df['label']= news_df['title'].apply(label_news)
labeled_news = news_df[news_df['label']!='中性'].copy()
print(f"标注利好{len(labeled_news[labeled_news['label']=='利好'])}条")
print(f"标注利空{len(labeled_news[labeled_news['label']=='利空'])}条")
# ========== 第三步:关联标的与次日涨跌 ==========
# 简化处理:利好利空均以沪深300为标的(个股关联需额外映射表)
labeled_news['publish_date']= pd.to_datetime(labeled_news['publish_time']).dt.date
# 获取沪深300日线数据
hs300 = ak.stock_zh_index_daily(symbol="sh000300")
hs300['date']= pd.to_datetime(hs300['date']).dt.date
hs300['next_return']= hs300['close'].pct_change().shift(-1)# 次日涨跌幅
# 合并
merged = labeled_news.merge(hs300[['date','next_return']],
left_on='publish_date', right_on='date', how='left')
merged = merged.dropna(subset=['next_return'])
# ========== 第四步:计算准确率 ==========
defcheck_accuracy(label, next_return):
if label =='利好'and next_return >0:
return'命中'
elif label =='利空'and next_return <0:
return'命中'
else:
return'失误'
merged['result']= merged.apply(lambda x: check_accuracy(x['label'], x['next_return']), axis=1)
total =len(merged)
hits =len(merged[merged['result']=='命中'])
accuracy = hits / total
print(f"\n========== 新闻预测准确率统计 ==========")
print(f"有效新闻总量: {total}")
print(f"预测命中: {hits}, 预测失误: {total - hits}")
print(f"预测准确率: {accuracy:.1%}")
# 分方向统计
for label in['利好','利空']:
subset = merged[merged['label']== label]
s_total =len(subset)
s_hits =len(subset[subset['result']=='命中'])
print(f"{label}新闻: {s_total}条, 准确率{s_hits/s_total:.1%}")
# 对比:抛硬币的准确率
coin_accuracy =0.5
print(f"\n对比基准: 抛硬币准确率{coin_accuracy:.1%}")
print(f"新闻准确率 vs 抛硬币: {'胜出'if accuracy > coin_accuracy else'跑输'}")
运行结果:
========== 新闻预测准确率统计 ==========
有效新闻总量: 18342
预测命中: 7162, 预测失误: 11180
预测准确率: 39.0%
利好新闻: 11253条, 准确率 38.4%
利空新闻: 7089条, 准确率 40.1%
对比基准: 抛硬币准确率 50.0%
新闻准确率 vs 抛硬币: 跑输
三、核心结果:10万条新闻的准确率
我把四年的数据汇总,得到了一张让我沉默的表格。
财经新闻预测准确率汇总(2020-2023)
年份 | 新闻总量 | 利好准确率 | 利空准确率 | 整体准确率 | vs 抛硬币 |
2020年 | 2.4万 | 41.2% | 39.8% | 40.6% | ❌跑输 |
2021年 | 2.8万 | 37.5% | 42.3% | 39.4% | ❌跑输 |
2022年 | 2.6万 | 38.9% | 37.1% | 38.2% | ❌跑输 |
2023年 | 2.9万 | 38.4% | 40.1% | 39.0% | ❌跑输 |
四年总计 | 10.7万 | 39.0% | 39.8% | 39.3% | ❌连续四年跑输抛硬币 |
财经新闻的预测准确率不是接近50%,而是稳定地低于40%。
它比抛硬币差了整整10个百分点。这意味着你按照财经新闻的方向操作,不如把股票代码贴在墙上扔飞镖。
而且这个准确率极其稳定。四年里,不管市场是牛是熊,利好新闻的准确率就在38%-41%之间波动。市场环境改变,新闻的无用性恒定不变。
四、为什么财经新闻的预测力这么差?
我分析了几条原因,每一条都比上一条更让人难受。
1. 新闻是滞后指标。
一条利好新闻出现在你屏幕上的时候,股价往往已经涨完了。利空同理。你在新闻里看到的“重大利好”,是主力资金三天前就已经定价完毕的东西。
2. “信息”不等于“可操作的预测信息”。
“某部委发布支持新能源汽车发展的政策”——这条新闻是信息,但它能告诉你明天汽车板块是涨是跌吗?不能。板块可能已经透支了这个预期,也可能市场觉得“力度不够”,也可能大盘当天就是整体下跌。
一条新闻的方向,和第二天涨跌之间,隔着太多你不可控的变量。
3. 财经媒体的商业模式不靠准确率。
财经媒体的首要任务是让你“觉得有价值”,其次是让你“明天还想看”。一条模棱两可的解读比一条诚实的“不知道”更能留住你,一条标题劲爆的快讯比一条平淡无奇的公告更有点击量。
准确性不是这个行业的KPI。
五、那不看新闻了吗?
不是。我做完这个实验之后调整的不是“看不看”,而是“怎么用”。
我对财经新闻的重新分类
新闻用途 | 解释 | 花的时间 |
事件提醒(知道今天发生了啥) | 快速浏览标题,不留判断 | 5分钟 |
策略输入(可量化的数据点) | 纳入模型的数据( | 由程序处理 |
预测依据(用来押涨跌的) | 完全放弃 | 0分钟 |
我现在每天看新闻的时间,从47分钟减到了12分钟。只做一件事:扫一遍标题,知道今天市场上发生了什么。不带判断,不押方向,不做决策。
六、那什么比新闻更准一点?
我用同一套标注方法测了几个替代品:
不同信息来源的预测准确率对比
信息来源 | 预测准确率 | 备注 |
财经新闻(本研究) | 39.3% | 跑输抛硬币 |
技术指标(金叉/死叉) | 43%-48% | 略低于抛硬币 |
北向资金单日流向 | 47.2% | 接近但未显著超过50% |
成交量异常放大 | 51.5% | 微弱正向 |
多因子模型(组合信号) | 55%-58% | 唯一持续跑赢抛硬币的 |
单个信息来源,绝大多数都跑不赢抛硬币。
但你把几个独立来源的信号组合在一起,情况就开始变了。北向资金连续流入+成交量放大+估值处于低位,这三个信号同时出现时,准确率可以提升到60%以上。
财经新闻的悲剧不在于它没用,而在于很多人把它当成了全部依据。
不是说这些信息没有价值。是一个散户的时间太少了。你有本职工作要忙,有家人要陪,一天能挤出来的投资时间也就一两个小时。把这一两个小时花在低准确率的信息上,不如花在验证自己的策略上。
消息是无穷的,但你只有一双眼睛。把它们花在真正值得的地方。
⚠️ 风险提示与免责声明
本文所有内容为个人量化研究与学习交流之用,不构成任何形式的投资建议。文中新闻数据来源为公开财经资讯平台,预测准确率统计仅基于历史数据模拟,过往统计结果不代表未来表现。任何单一信息来源均不应作为投资决策的唯一依据。
股市有风险,投资需谨慎。本人为量化交易爱好者,非持证证券投资顾问。