当前位置:首页>python>我爬了10万条财经新闻,用Python跑了它们的预测准确率

我爬了10万条财经新闻,用Python跑了它们的预测准确率

  • 2026-09-02 16:50:15
我爬了10万条财经新闻,用Python跑了它们的预测准确率

我做过一个统计。

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%以上。

财经新闻的悲剧不在于它没用,而在于很多人把它当成了全部依据。

不是说这些信息没有价值。是一个散户的时间太少了。你有本职工作要忙,有家人要陪,一天能挤出来的投资时间也就一两个小时。把这一两个小时花在低准确率的信息上,不如花在验证自己的策略上。

消息是无穷的,但你只有一双眼睛。把它们花在真正值得的地方。

⚠️ 风险提示与免责声明

本文所有内容为个人量化研究与学习交流之用,不构成任何形式的投资建议。文中新闻数据来源为公开财经资讯平台,预测准确率统计仅基于历史数据模拟,过往统计结果不代表未来表现。任何单一信息来源均不应作为投资决策的唯一依据。

股市有风险,投资需谨慎。本人为量化交易爱好者,非持证证券投资顾问。

最新文章

随机文章