FinBERT 是一个专门针对金融文本进行情绪分析的 BERT 模型,能够分析新闻标题和摘要,判断市场情绪(正面/中性/负面)。
本系统已将 FinBERT 整合到交易信号生成系统中,可以为买入/卖出决策提供额外的市场情绪支持。
-
finbert_sentiment.py- FinBERT 情绪分析核心模块FinBERTAnalyzer类:初始化和使用 FinBERT 模型fetch_news_via_rss(): 从 Yahoo Finance RSS 抓取新闻get_sentiment_score(): 计算单条新闻的情绪分数analyze_stock_sentiment(): 分析股票的整体市场情绪
-
finbert_enhanced_scoring.py- 增强评分模块calculate_sentiment_score(): 计算情绪分数并转换为评分调整值calculate_enhanced_buy_score_with_sentiment(): 整合 FinBERT 的买入评分系统format_sentiment_output(): 格式化情绪分析结果输出
get_trading_signal_nvda_finbert.py- 整合 FinBERT 的 NVDA 交易信号示例
首次使用需要安装以下依赖包:
pip install transformers torch nltk注意: 首次运行时,FinBERT 模型(约 400MB)会自动下载,请耐心等待。
from finbert_sentiment import FinBERTAnalyzer
# 初始化分析器
analyzer = FinBERTAnalyzer()
# 分析单只股票
result = analyzer.analyze_stock_sentiment('NVDA', verbose=True)
# 输出结果
print(f"情绪分数: {result['sentiment_score']}")
print(f"情绪判断: {result['sentiment_label']}")
print(f"新闻数量: {result['news_count']}")修改你的 get_trading_signal_xxx.py 文件:
# 在文件开头添加
from finbert_enhanced_scoring import calculate_enhanced_buy_score_with_sentiment, format_sentiment_output将原有的:
buy_score, signal_override, buy_reasons, buy_warnings, buy_metadata = calculate_enhanced_buy_score(
rsi=rsi,
macd=macd,
# ... 其他参数
)改为:
buy_score, signal_override, buy_reasons, buy_warnings, buy_metadata, sentiment_result = calculate_enhanced_buy_score_with_sentiment(
rsi=rsi,
macd=macd,
# ... 其他参数
symbol='NVDA' # 添加股票代码参数
)在买入建议输出后添加:
# 显示FinBERT情绪分析结果
if sentiment_result and sentiment_result['news_count'] > 0:
print("\n" + format_sentiment_output(sentiment_result))FinBERT 返回的情绪分数会自动转换为评分调整值:
| 情绪分数 | 情绪标签 | 评分调整 |
|---|---|---|
| > +0.30 | 强烈正面 | +20 分 |
| +0.15 ~ +0.30 | 正面 | +10 分 |
| +0.05 ~ +0.15 | 轻微正面 | +5 分 |
| -0.05 ~ +0.05 | 中性 | 0 分 |
| -0.15 ~ -0.05 | 轻微负面 | -5 分 |
| -0.30 ~ -0.15 | 负面 | -10 分 |
| < -0.30 | 强烈负面 | -20 分 |
示例:
- 原始技术评分:45/100
- FinBERT 情绪分数:+0.25(正面)
- 评分调整:+10 分
- 最终评分:55/100 ✅
系统会根据股票代码自动选择合适的搜索关键字:
NVDA→ 搜索 "NVDA"AAPL→ 搜索 "AAPL"GOOGL→ 搜索 "GOOGL"
RHM.DE→ 搜索 "RHM.DE" + 过滤 "Rheinmetall"
2330.TW(台积电) → 搜索 "TSM" (ADR)3711.TW(日月光) → 搜索 "ASX" (ADR)2308.TW(台达电) → 搜索 "2308.TW" + 过滤 "Delta"6442.TW(兆丰金) → 搜索 "6442.TW" + 过滤 "Mega Financial"
修改映射表:
编辑 finbert_sentiment.py 中的 SEARCH_MAPPING 字典:
SEARCH_MAPPING = {
'你的股票代码': ('搜索关键字', '可选过滤关键字'),
# 示例
'2451.TW': ('2451.TW', 'Transcend'),
}================================================================================
🗞️ 市场情绪分析 (FinBERT)
================================================================================
新闻数量: 8 则
情绪分数: +0.245
情绪判断: 📈 正面
评分调整: +10 分
📰 热点新闻:
1. Nvidia Stock Surges on AI Chip Demand Forecast
2. NVDA Beats Q4 Earnings Expectations, Raises Guidance
3. Analysts Upgrade Nvidia Price Target to $180
# 在 finbert_sentiment.py 中
news_items = self.fetch_news_via_rss(
search_term,
filter_kw,
max_news=10 # 改为 5 或 15
)如果 FinBERT 模型加载失败或不想使用,系统会自动回退:
# 自动返回
{
'sentiment_score': 0.0,
'sentiment_label': '未启用',
'news_count': 0,
'score_adjustment': 0
}技术面:
- RSI: 71.1 (超买)
- MACD: 金叉
- 量比: 1.7x (放量)
- 技术评分: 52/100
FinBERT 情绪分析:
- 新闻数量: 6 则
- 情绪分数: +0.32 (强烈正面)
- 评分调整: +20 分
最终评分: 72/100 → 强力买入 🟢
技术面:
- RSI: 53.89 (中性)
- MACD: 金叉(负值区)
- 量比: 0.54x (缩量)
- 技术评分: 9/100
FinBERT 情绪分析:
- 新闻数量: 10 则
- 情绪分数: +0.28 (正面,地缘政治利好)
- 评分调整: +10 分
最终评分: 19/100 → 仍为观望 🟡
分析: 虽然情绪正面,但技术面过弱,评分调整后仍低于买入阈值(20分),系统正确拒绝买入。
- 网络要求: 需要访问 Yahoo Finance RSS (可能需要代理)
- 首次运行: 模型下载需要 5-10 分钟
- 台股限制: 台股新闻较少,建议使用 ADR 代码搜索
- 非交易时段: 可能抓不到最新新闻
- 不可过度依赖: 情绪分析作为辅助参考,不应单独决策
解决:
pip install transformers torch原因: 网络连接问题或 Yahoo Finance 限制
解决:
- 检查网络连接
- 使用代理
- 修改搜索关键字映射
解决:
# 手动下载模型
python -c "from transformers import BertTokenizer, BertForSequenceClassification; BertForSequenceClassification.from_pretrained('yiyanghkust/finbert-tone')"- FinBERT 模型: https://huggingface.co/yiyanghkust/finbert-tone
- Yahoo Finance RSS: https://feeds.finance.yahoo.com/
- Transformers 文档: https://huggingface.co/docs/transformers/
v1.0 (2025-12-31)
- ✅ 初始版本发布
- ✅ 支持美股/欧股/台股新闻抓取
- ✅ 整合到交易信号评分系统
- ✅ 自动评分调整 (-20 ~ +20 分)
有问题? 查看 finbert_sentiment.py 和 finbert_enhanced_scoring.py 的代码注释 📖