Wednesday, September 23, 2026
为你的自选股构建新闻情绪信号
为你的自选股构建新闻情绪信号
单篇文章的情绪很有用,但你往往想要的是每家公司一个数字:现在的新闻流是偏正面还是偏负面?在本教程中, 你将用 Python 和 pandas,把 finlight 的情绪和置信度转化为每只股票一个按置信度加权的分数,覆盖整个 自选股清单。
思路
每篇文章都带有一个 sentiment(正面、中性、负面)和一个 confidence。我们将:
- 为每只股票拉取近期文章。
- 把情绪映射为数字:
+1、0、-1。 - 按置信度对每篇文章加权,并按股票求平均。
结果是一个介于 -1 和 +1 之间的分数,概括每家公司的新闻语气。
代码
import pandas as pd
from finlight_client import FinlightApi, ApiConfig
from finlight_client.models import GetArticlesParams
client = FinlightApi(config=ApiConfig(api_key="YOUR_API_KEY"))
WATCHLIST = ["AAPL", "NVDA", "TSLA"]
SCORE = {"positive": 1, "neutral": 0, "negative": -1}
rows = []
for ticker in WATCHLIST:
response = client.articles.fetch_articles(
GetArticlesParams(tickers=[ticker], from_="2026-06-01", pageSize=100)
)
for article in response.articles:
if article.sentiment is None:
continue
rows.append({
"ticker": ticker,
"score": SCORE.get(article.sentiment, 0),
"confidence": article.confidence or 0.0,
})
df = pd.DataFrame(rows)
# 每只股票的置信度加权平均情绪
df["weighted"] = df["score"] * df["confidence"]
signal = df.groupby("ticker").apply(
lambda g: g["weighted"].sum() / g["confidence"].sum()
)
print(signal.sort_values(ascending=False))
你会得到什么
signal 是每只股票一个数字:
ticker
NVDA 0.62
AAPL 0.18
TSLA -0.34
正分表示近期新闻流偏正面,负分表示偏负面,而数值大小反映这种倾向有多强、多确信。按 confidence
加权意味着一批高置信度的报道比一堆不确定的报道更能撼动分数。
让它更好
- 加入时间衰减: 乘以一个时间衰减因子,让今天的新闻比上周的权重更高。
- 加入数量: 在分数旁记录文章数量,因为基于两篇文章的强分数,比基于五十篇的同样分数证据更弱。
- 改为增量更新: 定时重新运行,或改用 WebSocket 实时更新信号。
一个提醒
情绪是一种输入,而不是价格预测。市场可能无视坏消息,也可能对好消息反应过度。请把这个分数当作一个要与 数量、来源以及你自己的模型结合的特征,而不是一个独立的交易规则。
接下来去哪里
- 什么是金融新闻情绪分析?
- 高级过滤,精确界定信号范围。
- 完整文档。
