finlight Logo

Wednesday, September 23, 2026

为你的自选股构建新闻情绪信号

Kevin Bartsch

为你的自选股构建新闻情绪信号

单篇文章的情绪很有用,但你往往想要的是每家公司一个数字:现在的新闻流是偏正面还是偏负面?在本教程中, 你将用 Python 和 pandas,把 finlight 的情绪和置信度转化为每只股票一个按置信度加权的分数,覆盖整个 自选股清单。

思路

每篇文章都带有一个 sentiment(正面、中性、负面)和一个 confidence。我们将:

  1. 为每只股票拉取近期文章。
  2. 把情绪映射为数字:+10-1
  3. 按置信度对每篇文章加权,并按股票求平均。

结果是一个介于 -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 实时更新信号。

一个提醒

情绪是一种输入,而不是价格预测。市场可能无视坏消息,也可能对好消息反应过度。请把这个分数当作一个要与 数量、来源以及你自己的模型结合的特征,而不是一个独立的交易规则。

接下来去哪里

获取免费 API 密钥 →