diff --git a/backend/app/news_agent/analyzer.py b/backend/app/news_agent/analyzer.py index b02824b..3186d7e 100644 --- a/backend/app/news_agent/analyzer.py +++ b/backend/app/news_agent/analyzer.py @@ -60,17 +60,32 @@ class NewsAnalyzer: **分析要求**: 1. market_impact: 对市场的潜在影响(high/medium/low) - - **high**: 对市场或公司有**实质性、深远影响**的事件 - * 改变行业格局或公司生存状态 - * 监管政策重大变化(批准、禁止、调查) - * 系统性风险事件(破产、退市、重大欺诈) - - **medium**: 对价格有**短期影响**但不会改变长期趋势的事件 - * 财报业绩、管理层变动、一般并购 - * 评级调整、业务合作或重组 - - **low**: 常规信息,影响有限 - * 分析师观点、价格波动、一般评论 - **判断原则**: 问自己"这条新闻会改变市场/公司的长期格局吗?" 如果会→high,如果只是短期波动→medium,如果无关紧要→low + ⚠️ **high(重大影响)- 请严格判断,只有以下情况才标记为 high**: + - 监管层面:ETF批准/拒绝、交易所封禁/解禁、央行政策重大变化 + - 企业层面:破产/退市/重大并购(>100亿美元)、财务造假 + - 技术层面:严重安全漏洞(被盗>1亿美元)、网络暂停 + - 宏观层面:重大地缘政治事件、经济数据远超预期 + + ❌ **以下情况不应该标记为 high**: + - 普通价格波动(涨跌<10%) + - 分析师观点/评级调整 + - CEO发表常规评论 + - 一般业务合作/投资 + - 常规财报发布(非意外业绩) + + - **medium**: 对价格有**短期影响**但不会改变长期趋势的事件 + * 财报业绩、管理层变动、一般并购、机构评级调整 + * 业务合作、技术升级、普通投资新闻 + + - **low**: 常规信息,影响有限 + * 分析师观点、一般评论、价格波动、市场常规动态 + + **判断原则**: + 1. 问自己"这条新闻会改变市场/公司的长期格局吗?" + 2. 如果会→high,如果只是短期波动→medium,如果无关紧要→low + 3. 宁可判断为 medium,也不要过度判断为 high + 4. 价格波动类新闻,除非涨跌>15%,否则不应是 high 2. impact_type: 对价格的影响方向(bullish=利好, bearish=利空, neutral=中性) 3. sentiment: 新闻情绪(positive=正面, negative=负面, neutral=中性) @@ -120,12 +135,25 @@ class NewsAnalyzer: ] ``` -**market_impact 判断标准**: -- **high**: 对市场或公司有**实质性、深远影响**的事件(改变行业格局或公司生存状态) -- **medium**: 对价格有**短期影响**但不会改变长期趋势的事件(财报、管理层变动、一般并购等) +**market_impact 判断标准(严格)**: + +⚠️ **high(重大影响)- 请严格判断**: +- 监管:ETF批准/拒绝、交易所封禁/解禁、央行政策重大变化 +- 企业:破产/退市、重大并购(>100亿美元)、财务造假 +- 技术:严重安全漏洞(被盗>1亿美元)、网络暂停 +- 宏观:重大地缘政治事件、经济数据远超预期 + +❌ **以下情况不应该标记为 high**: +- 普通价格波动(涨跌<10%) +- 分析师观点/评级调整 +- CEO发表常规评论 +- 一般业务合作/投资 +- 常规财报发布(非意外业绩) + +- **medium**: 对价格有**短期影响**但不会改变长期趋势 - **low**: 常规信息,影响有限 -**判断原则**: 问自己"这条新闻会改变市场/公司的长期格局吗?" 如果会→high,如果只是短期波动→medium。 +**判断原则**: 问自己"这条新闻会改变市场/公司的长期格局吗?" 如果会→high,否则→medium/low 请只输出 JSON 数组,不要包含其他解释。 """ @@ -359,23 +387,23 @@ class NewsAnalyzer: """ score = 0.0 - # 市场影响 - impact_weights = {'high': 50, 'medium': 30, 'low': 10} - score += impact_weights.get(analysis.get('market_impact', 'low'), 10) + # 市场影响(更严格的权重) + impact_weights = {'high': 50, 'medium': 25, 'low': 5} # 降低 low 和 medium 的权重 + score += impact_weights.get(analysis.get('market_impact', 'low'), 5) # 方向性(利空利好比中性重要) if analysis.get('impact_type') in ['bullish', 'bearish']: - score += 15 + score += 10 # 从 15 降低到 10 - # 置信度 - score += (analysis.get('confidence', 50) / 100) * 10 + # 置信度(降低权重) + score += (analysis.get('confidence', 50) / 100) * 8 # 从 10 降低到 8 - # 质量分数 - score += quality_score * 20 + # 质量分数(保持) + score += quality_score * 15 # 从 20 降低到 15 - # 是否有相关代码 + # 是否有相关代码(提高重要性) if analysis.get('relevant_symbols'): - score += 5 + score += 12 # 从 5 提高到 12 return score diff --git a/backend/app/news_agent/news_agent.py b/backend/app/news_agent/news_agent.py index 96a53ac..72aad0d 100644 --- a/backend/app/news_agent/news_agent.py +++ b/backend/app/news_agent/news_agent.py @@ -243,7 +243,7 @@ class NewsAgent: self.stats['total_analyzed'] += analyzed_count logger.info(f"分析了 {analyzed_count} 条文章") - # 6. 发送通知(仅批量发送) + # 6. 发送通知(仅批量发送)- 增加过滤条件 if high_priority_articles: # 按优先级排序 high_priority_articles.sort( @@ -251,11 +251,36 @@ class NewsAgent: reverse=True ) + # 额外过滤:只推送真正重要的新闻 + truly_important_articles = [] + for article in high_priority_articles: + impact = article.get('market_impact', 'low') + priority = article.get('priority', 0) + confidence = article.get('llm_analyzed', False) and article.get('relevant_symbols') + + # 推送条件(满足其一即可): + # 1. high 影响 + 优先级 >= 55 + # 2. high 影响 + 有明确相关代码 + # 3. 优先级 >= 60(特别重要) + should_notify = ( + (impact == 'high' and priority >= 55) or + (impact == 'high' and confidence) or + (priority >= 60) + ) + + if should_notify: + truly_important_articles.append(article) + # 批量发送最多10条 - await self.notifier.notify_news_batch(high_priority_articles[:10]) - for article in high_priority_articles[:10]: - self.db_service.mark_as_notified(article['id']) - self.stats['total_notified'] += 1 + if truly_important_articles: + await self.notifier.notify_news_batch(trulyy_important_articles[:10]) + for article in truly_important_articles[:10]: + self.db_service.mark_as_notified(article['id']) + self.stats['total_notified'] += 1 + + logger.info(f"推送了 {len(trulyy_important_articles)} 条真正重要的新闻(从 {len(high_priority_articles)} 条 high 中筛选)") + else: + logger.info(f"没有达到推送标准的新闻({len(high_priority_articles)} 条 high 但不够重要)") self.stats['last_notify_time'] = datetime.utcnow().isoformat() diff --git a/backend/app/news_agent/sources.py b/backend/app/news_agent/sources.py index 72b0bc2..8ae2bb2 100644 --- a/backend/app/news_agent/sources.py +++ b/backend/app/news_agent/sources.py @@ -193,30 +193,47 @@ def get_enabled_sources(category: str = None) -> list: # 关键词配置 - 用于第一级过滤 CRYPTO_KEYWORDS = { 'high_impact': [ - # 监管相关 - 'SEC', 'regulation', 'ban', 'approve', 'ETF', 'legal', - '监管', '批准', '合法化', '禁令', + # 监管相关(只保留真正重大的) + 'SEC ETF', 'ETF approved', 'ETF rejected', 'regulation ban', + '监管禁令', 'ETF批准', 'ETF拒绝', - # 重大事件 - 'hack', 'exploit', 'bankruptcy', 'acquisition', 'merger', - 'blackrock', 'grayscale', 'fidelity', '比特大陆', '币安', + # 重大事件(只保留真正重大的) + 'hack $', 'exploit $', ' $ billion hack', # 需要金额上下文,避免普通新闻 + 'bankruptcy', '破产', 'shut down', '暂停交易', + 'exchange collapse', '交易所倒闭', - # 市场动态 - 'all-time high', ' ATH ', 'crash', 'surge', 'plunge', + # 超级机构(重大新闻才推送) + 'BlackRock ETF', 'Grayscale ETF', 'Fidelity ETF', + '贝莱德ETF', '灰度ETF', + + # 重大安全事故 + 'bridge exploit', 'smart contract hack', '$ million stolen', + '跨链桥攻击', '智能合约漏洞', + ], + 'medium_impact': [ + # 一般监管 + 'SEC', 'regulation', 'legal', '合规', '监管', + 'approve', 'ban', '禁令', + + # 市场动态(常见的价格波动) + 'ATH', 'all-time high', 'crash', 'surge', 'plunge', '历史新高', '暴跌', '暴涨', '突破', # 技术更新 'upgrade', 'fork', 'airdrop', 'launch', '升级', '分叉', '空投', '上线', + # 并购/合作 + 'partnership', 'acquisition', 'merger', + '合作', '并购', '收购', + # 宏观经济 'fed', 'inflation', 'recession', 'interest rate', '美联储', '通胀', '加息', '降息', - ], - 'medium_impact': [ - 'partnership', 'integration', 'listing', 'delisting', - '合作', '上线', '下架', + + # 机构和钱包 'whale', 'wallet', 'exchange', + '巨鲸', '钱包', '交易所', ] }