1. 获取股票新闻标题并计算情绪得分
任务目标
使用新闻API获取指定股票(以苹果公司 AAPL 为例)的最新新闻标题,调用预训练情感分析模型计算每条标题的情绪得分(范围 -1 到 1),并输出全部标题的平均情绪值,用于快速判断近期市场舆论倾向。
环境与依赖
需要 Python 3.8+,并安装以下库:
pip install requests transformers torch
新闻数据源使用 Alpha Vantage 的免费新闻API(需在 alphavantage.co 申请免费)。情感模型使用 Hugging Face 的 distilbert-base-uncased-finetuned-sst-2-english,该模型针对英文情感分类微调,输出正面/负面概率,本案例将其映射为 -1 到 1 的连续情绪分数。
完整实现代码
import requests
from transformers import pipeline
# ========== 配置 ==========
= "YOUR_ALPHA_VANTAGE_" # 替换为你的真实Key
SYMBOL = "AAPL"
NEWS_URL = "https://www.alphavantage.co/query"
# ========== 1. 获取新闻标题 ==========
params = {
"function": "NEWS_SENTIMENT",
"tickers": SYMBOL,
"": ,
"limit": 20 # 取最近20条新闻
}
resp = requests.get(NEWS_URL, params=params)
data = resp.json()
if "feed" not in data:
raise RuntimeError(f"API请求失败: {data}")
titles = [item["title"] for item in data["feed"]]
print(f"获取到 {len(titles)} 条新闻标题\n")
# ========== 2. 加载情感分析模型 ==========
# 该pipeline自动下载并缓存模型(首次运行需联网)
sentiment_pipeline = pipeline(
"sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english"
)
# ========== 3. 逐条计算情绪得分并汇总 ==========
def to_score(result):
"""将模型的 (label, score) 映射为 -1 到 1 的连续值"""
label = result["label"]
prob = result["score"]
return prob if label == "POSITIVE" else -prob
scores = []
for title in titles:
res = sentiment_pipeline(title)[0]
score = to_score(res)
scores.append(score)
print(f"{score:+.3f} | {title}")
# ========== 4. 输出平均情绪值 ==========
avg_score = sum(scores) / len(scores)
print(f"\n===== 平均情绪得分: {avg_score:+.3f} =====")
print("(范围 -1 到 1,正值为偏正面,负值为偏负面)")
运行方式
- 将代码中
替换为你自己的 Alpha Vantage Key。 - 保存为
stock_sentiment.py,在终端执行:
python stock_sentiment.py
验证方法与通过标准
- API连通性验证:程序能打印出“获取到 N 条新闻标题”(N 为实际返回条数,通常为 20),说明网络与Key配置正确。
- 模型推理验证:每条标题前出现带正负号的分数,且分数值在 0 到 1 之间。若某条标题明显为正面措辞(如“Apple beats earnings expectations”),其分数应为正值。
- 结果合理性验证:最终输出的平均情绪值应落在 -1 到 1 区间内。若某日新闻整体偏正面,平均值应大于 0;若偏负面则小于 0。可多次运行观察不同日期的均值波动。
- 异常排查:若 API 返回错误,程序会抛出
RuntimeError并打印返回内容,此时检查 Key 是否有效或网络是否可达。
常见问题
- 首次运行下载模型较慢:transformers 会自动下载约 250MB 的模型文件到本地缓存,需保持网络畅通,后续运行将直接使用缓存。
- API 免费额度限制:Alpha Vantage 免费Key 每分钟最多 5 次请求,本程序单次运行仅请求 1 次,不会触发限制。
- 英文标题为主:所选模型仅支持英文,若新闻标题为其他语言,情绪判断可能不准确。如需处理中文,可替换为
uer/roberta-base-finetuned-jd-binary-chinese等中文情感模型。