997 lines
37 KiB
Python
997 lines
37 KiB
Python
"""
|
||
新闻流量智能分析代理模块
|
||
使用DeepSeek进行AI驱动的分析
|
||
包含:板块影响分析、股票推荐、风险评估、投资建议
|
||
"""
|
||
import json
|
||
import logging
|
||
import time
|
||
from datetime import datetime
|
||
from typing import Dict, List, Optional
|
||
|
||
logging.basicConfig(level=logging.INFO)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class NewsFlowAgents:
|
||
"""新闻流量智能分析代理"""
|
||
|
||
def __init__(self, model: str = "deepseek-chat"):
|
||
"""
|
||
初始化代理
|
||
|
||
Args:
|
||
model: 使用的模型,默认 deepseek-chat
|
||
"""
|
||
self.model = model
|
||
self.deepseek_client = None
|
||
self._init_client()
|
||
|
||
def _init_client(self):
|
||
"""初始化DeepSeek客户端"""
|
||
try:
|
||
from deepseek_client import DeepSeekClient
|
||
self.deepseek_client = DeepSeekClient(model=self.model)
|
||
logger.info(f"✅ DeepSeek客户端初始化成功,模型: {self.model}")
|
||
except Exception as e:
|
||
logger.error(f"❌ DeepSeek客户端初始化失败: {e}")
|
||
self.deepseek_client = None
|
||
|
||
def is_available(self) -> bool:
|
||
"""检查AI是否可用"""
|
||
return self.deepseek_client is not None
|
||
|
||
def sector_impact_agent(self, hot_topics: List[Dict],
|
||
stock_news: List[Dict],
|
||
flow_data: Dict = None) -> Dict:
|
||
"""
|
||
板块影响分析代理
|
||
|
||
分析热点可能影响的板块
|
||
|
||
Returns:
|
||
{
|
||
'affected_sectors': List[Dict],
|
||
'analysis': str,
|
||
'success': bool,
|
||
}
|
||
"""
|
||
if not self.is_available():
|
||
return self._fallback_sector_analysis(hot_topics, stock_news)
|
||
|
||
# 准备数据
|
||
topics_text = '\n'.join([
|
||
f"- {t['topic']} (热度:{t.get('heat', 0)}, 跨{t.get('cross_platform', 0)}平台)"
|
||
for t in hot_topics[:20]
|
||
])
|
||
|
||
news_text = '\n'.join([
|
||
f"- [{n.get('platform_name', '')}] {n.get('title', '')}"
|
||
for n in stock_news[:15]
|
||
])
|
||
|
||
flow_info = ""
|
||
if flow_data:
|
||
flow_info = f"""
|
||
当前流量状态:
|
||
- 流量得分: {flow_data.get('total_score', 'N/A')}/1000
|
||
- 流量等级: {flow_data.get('level', 'N/A')}
|
||
- 社交媒体热度: {flow_data.get('social_score', 'N/A')}
|
||
- 财经平台热度: {flow_data.get('finance_score', 'N/A')}
|
||
"""
|
||
|
||
prompt = f"""你是一名资深的A股短线投资分析师,专注于热点题材挖掘和板块轮动分析。
|
||
|
||
【重要】请根据以下全网热点数据,进行深度的A股题材分析:
|
||
|
||
=== 全网热门话题TOP20 ===
|
||
{topics_text}
|
||
|
||
=== 股票相关新闻TOP15 ===
|
||
{news_text}
|
||
{flow_info}
|
||
|
||
请完成以下分析任务:
|
||
|
||
1. **题材挖掘**:从以上热点中挖掘出可能引爆A股的核心题材概念
|
||
2. **板块分析**:分析最可能受益的A股板块(要具体到申万行业或同花顺概念板块)
|
||
3. **热度评估**:评估每个板块的潜在炒作热度和持续性
|
||
4. **龙头预判**:推测可能的龙头股特征
|
||
|
||
请以JSON格式输出:
|
||
{{
|
||
"hot_themes": [
|
||
{{"theme": "题材名称", "source": "来源热点", "heat_level": "极高/高/中", "sustainability": "持续性评估"}}
|
||
],
|
||
"benefited_sectors": [
|
||
{{
|
||
"name": "板块名称(要具体如:AI算力、低空经济、机器人等)",
|
||
"impact": "利好",
|
||
"confidence": 85,
|
||
"reason": "详细分析原因",
|
||
"related_concepts": ["相关概念1", "相关概念2"],
|
||
"leader_characteristics": "龙头股特征描述"
|
||
}}
|
||
],
|
||
"damaged_sectors": [
|
||
{{"name": "板块名称", "impact": "利空", "confidence": 60, "reason": "原因"}}
|
||
],
|
||
"opportunity_assessment": "今日A股投资机会综合评估(100字以内)",
|
||
"trading_suggestion": "短线操作建议",
|
||
"key_points": ["核心要点1", "核心要点2", "核心要点3"]
|
||
}}
|
||
|
||
只输出JSON,不要其他文字。"""
|
||
|
||
try:
|
||
messages = [
|
||
{"role": "system", "content": "你是专业的A股市场分析师,输出必须是纯JSON格式。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
response = self.deepseek_client.call_api(messages, temperature=0.5, max_tokens=2000)
|
||
|
||
# 解析JSON
|
||
result = self._parse_json_response(response)
|
||
|
||
if result:
|
||
return {
|
||
'hot_themes': result.get('hot_themes', []),
|
||
'affected_sectors': result.get('benefited_sectors', []) + result.get('damaged_sectors', []),
|
||
'benefited_sectors': result.get('benefited_sectors', []),
|
||
'damaged_sectors': result.get('damaged_sectors', []),
|
||
'opportunity_assessment': result.get('opportunity_assessment', ''),
|
||
'trading_suggestion': result.get('trading_suggestion', ''),
|
||
'key_points': result.get('key_points', []),
|
||
'success': True,
|
||
'raw_response': response,
|
||
}
|
||
else:
|
||
return self._fallback_sector_analysis(hot_topics, stock_news)
|
||
|
||
except Exception as e:
|
||
logger.error(f"板块分析失败: {e}")
|
||
return self._fallback_sector_analysis(hot_topics, stock_news)
|
||
|
||
def stock_recommend_agent(self, hot_sectors: List[Dict],
|
||
flow_stage: str,
|
||
sentiment_class: str) -> Dict:
|
||
"""
|
||
股票推荐代理
|
||
|
||
基于热门板块和市场状态推荐股票
|
||
|
||
Returns:
|
||
{
|
||
'recommended_stocks': List[Dict],
|
||
'strategy': str,
|
||
'success': bool,
|
||
}
|
||
"""
|
||
if not self.is_available():
|
||
return self._fallback_stock_recommend(hot_sectors)
|
||
|
||
sectors_text = '\n'.join([
|
||
f"- {s.get('name', '')}:{s.get('impact', '利好')},置信度{s.get('confidence', 50)}%\n 原因:{s.get('reason', '')}\n 龙头特征:{s.get('leader_characteristics', 'N/A')}"
|
||
for s in hot_sectors[:5]
|
||
])
|
||
|
||
related_concepts = []
|
||
for s in hot_sectors[:5]:
|
||
related_concepts.extend(s.get('related_concepts', []))
|
||
concepts_text = ', '.join(list(set(related_concepts))[:10]) if related_concepts else '无'
|
||
|
||
prompt = f"""你是一名资深的A股短线游资操盘手,专注于热点题材龙头股挖掘。
|
||
|
||
=== 当前市场状态 ===
|
||
- 流量阶段: {flow_stage}
|
||
- 情绪状态: {sentiment_class}
|
||
- 相关概念: {concepts_text}
|
||
|
||
=== 热门受益板块分析 ===
|
||
{sectors_text}
|
||
|
||
=== 选股要求 ===
|
||
请根据"流量为王"理念,推荐5-8只A股短线标的:
|
||
|
||
选股法则(必须遵循):
|
||
1. **先涨为王**:优先选择已经启动、走势强势的股票
|
||
2. **名字为王**:股票名称与热点高度相关(如AI概念选"智"字头)
|
||
3. **龙头优先**:选择板块内最强势的龙头或人气股
|
||
4. **题材纯正**:主业与热点题材高度相关
|
||
5. **流通盘适中**:30-150亿市值为佳,便于资金操作
|
||
|
||
请以JSON格式输出:
|
||
{{
|
||
"recommended_stocks": [
|
||
{{
|
||
"code": "股票代码(6位数字,如000001或600001)",
|
||
"name": "股票名称",
|
||
"sector": "所属板块",
|
||
"market": "沪市/深市/创业板/科创板",
|
||
"market_cap": "市值(亿)",
|
||
"reason": "推荐理由(与热点的关联性)",
|
||
"catalyst": "催化剂/驱动因素",
|
||
"strategy": "操作策略(进场/加仓/止损建议)",
|
||
"target_space": "目标空间(如15-20%)",
|
||
"risk_level": "低/中/高",
|
||
"attention_points": ["注意事项1", "注意事项2"]
|
||
}}
|
||
],
|
||
"overall_strategy": "整体操作策略和仓位建议",
|
||
"timing_advice": "最佳介入时机判断",
|
||
"risk_warning": "风险提示(必须包含投资风险提醒)"
|
||
}}
|
||
|
||
【重要】只推荐真实存在的A股股票,代码必须正确。只输出JSON。"""
|
||
|
||
try:
|
||
messages = [
|
||
{"role": "system", "content": "你是专业的A股投资顾问,只输出纯JSON格式。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
response = self.deepseek_client.call_api(messages, temperature=0.6, max_tokens=2000)
|
||
result = self._parse_json_response(response)
|
||
|
||
if result:
|
||
return {
|
||
'recommended_stocks': result.get('recommended_stocks', []),
|
||
'overall_strategy': result.get('overall_strategy', ''),
|
||
'timing_advice': result.get('timing_advice', ''),
|
||
'risk_warning': result.get('risk_warning', ''),
|
||
'success': True,
|
||
'raw_response': response,
|
||
}
|
||
else:
|
||
return self._fallback_stock_recommend(hot_sectors)
|
||
|
||
except Exception as e:
|
||
logger.error(f"股票推荐失败: {e}")
|
||
return self._fallback_stock_recommend(hot_sectors)
|
||
|
||
def risk_assess_agent(self, flow_stage: str,
|
||
sentiment_data: Dict,
|
||
viral_k: float,
|
||
flow_type: str) -> Dict:
|
||
"""
|
||
风险评估代理
|
||
|
||
评估当前市场风险
|
||
|
||
Returns:
|
||
{
|
||
'risk_level': str,
|
||
'risk_factors': List[str],
|
||
'risk_score': int,
|
||
'analysis': str,
|
||
'success': bool,
|
||
}
|
||
"""
|
||
if not self.is_available():
|
||
return self._fallback_risk_assess(flow_stage, sentiment_data, viral_k)
|
||
|
||
prompt = f"""你是一名专业的风险管理分析师。
|
||
|
||
请根据以下市场数据评估当前投资风险:
|
||
|
||
市场状态:
|
||
- 流量阶段: {flow_stage}
|
||
- 情绪指数: {sentiment_data.get('sentiment_index', 50)}
|
||
- 情绪分类: {sentiment_data.get('sentiment_class', '中性')}
|
||
- K值(病毒系数): {viral_k}
|
||
- 流量类型: {flow_type}
|
||
|
||
核心理念:
|
||
- 流量高潮 = 价格高潮 = 逃命时刻
|
||
- K值>1.5表示指数型爆发,风险上升
|
||
- 情绪极端(>85或<20)都意味着风险
|
||
|
||
请分析:
|
||
1. 当前风险等级(极低/低/中等/高/极高)
|
||
2. 主要风险因素
|
||
3. 风险分数(0-100)
|
||
4. 详细分析
|
||
|
||
以JSON格式输出:
|
||
{{
|
||
"risk_level": "高",
|
||
"risk_score": 75,
|
||
"risk_factors": ["风险因素1", "风险因素2", ...],
|
||
"opportunities": ["机会1", "机会2", ...],
|
||
"analysis": "详细分析文字",
|
||
"key_warning": "最重要的警告"
|
||
}}
|
||
|
||
只输出JSON。"""
|
||
|
||
try:
|
||
messages = [
|
||
{"role": "system", "content": "你是专业的风险管理分析师,只输出纯JSON格式。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
response = self.deepseek_client.call_api(messages, temperature=0.4, max_tokens=1500)
|
||
result = self._parse_json_response(response)
|
||
|
||
if result:
|
||
return {
|
||
'risk_level': result.get('risk_level', '中等'),
|
||
'risk_score': result.get('risk_score', 50),
|
||
'risk_factors': result.get('risk_factors', []),
|
||
'opportunities': result.get('opportunities', []),
|
||
'analysis': result.get('analysis', ''),
|
||
'key_warning': result.get('key_warning', ''),
|
||
'success': True,
|
||
'raw_response': response,
|
||
}
|
||
else:
|
||
return self._fallback_risk_assess(flow_stage, sentiment_data, viral_k)
|
||
|
||
except Exception as e:
|
||
logger.error(f"风险评估失败: {e}")
|
||
return self._fallback_risk_assess(flow_stage, sentiment_data, viral_k)
|
||
|
||
def investment_advisor_agent(self, sector_analysis: Dict,
|
||
stock_recommend: Dict,
|
||
risk_assess: Dict,
|
||
flow_data: Dict,
|
||
sentiment_data: Dict) -> Dict:
|
||
"""
|
||
投资建议代理(综合)
|
||
|
||
综合所有分析给出最终投资建议
|
||
|
||
Returns:
|
||
{
|
||
'advice': str, # 买入/持有/观望/回避
|
||
'confidence': int,
|
||
'summary': str,
|
||
'action_plan': List[str],
|
||
'success': bool,
|
||
}
|
||
"""
|
||
if not self.is_available():
|
||
return self._fallback_investment_advice(risk_assess, flow_data)
|
||
|
||
# 构建综合信息
|
||
sectors_text = ', '.join([s.get('name', '') for s in sector_analysis.get('benefited_sectors', [])[:3]])
|
||
stocks_text = ', '.join([f"{s.get('name', '')}({s.get('code', '')})"
|
||
for s in stock_recommend.get('recommended_stocks', [])[:3]])
|
||
|
||
prompt = f"""你是一名首席投资策略师,需要给出最终的投资建议。
|
||
|
||
综合分析数据:
|
||
|
||
【流量分析】
|
||
- 流量得分: {flow_data.get('total_score', 'N/A')}
|
||
- 流量等级: {flow_data.get('level', 'N/A')}
|
||
|
||
【情绪分析】
|
||
- 情绪指数: {sentiment_data.get('sentiment_index', 50)}
|
||
- 情绪分类: {sentiment_data.get('sentiment_class', '中性')}
|
||
- 流量阶段: {sentiment_data.get('flow_stage', '未知')}
|
||
|
||
【板块分析】
|
||
- 受益板块: {sectors_text}
|
||
- 机会评估: {sector_analysis.get('opportunity_assessment', 'N/A')}
|
||
|
||
【股票推荐】
|
||
- 推荐股票: {stocks_text}
|
||
|
||
【风险评估】
|
||
- 风险等级: {risk_assess.get('risk_level', '中等')}
|
||
- 风险分数: {risk_assess.get('risk_score', 50)}
|
||
- 主要风险: {', '.join(risk_assess.get('risk_factors', [])[:3])}
|
||
|
||
核心原则(流量为王):
|
||
- 流量高潮 = 价格高潮 = 逃命时刻
|
||
- 当热搜、媒体报道、KOL转发同时达到高潮时,就是出货时机
|
||
- 短线操作:快进快出,紧跟龙头
|
||
|
||
请给出最终投资建议:
|
||
1. 操作建议(买入/持有/观望/回避)
|
||
2. 置信度(0-100)
|
||
3. 综合总结
|
||
4. 具体行动计划
|
||
|
||
以JSON格式输出:
|
||
{{
|
||
"advice": "观望",
|
||
"confidence": 75,
|
||
"summary": "综合总结文字",
|
||
"action_plan": [
|
||
"行动1",
|
||
"行动2",
|
||
...
|
||
],
|
||
"position_suggestion": "仓位建议",
|
||
"timing": "时机判断",
|
||
"key_message": "最重要的一句话"
|
||
}}
|
||
|
||
只输出JSON。"""
|
||
|
||
try:
|
||
start_time = time.time()
|
||
|
||
messages = [
|
||
{"role": "system", "content": "你是首席投资策略师,必须给出明确的投资建议,只输出纯JSON格式。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
response = self.deepseek_client.call_api(messages, temperature=0.5, max_tokens=2000)
|
||
result = self._parse_json_response(response)
|
||
|
||
analysis_time = time.time() - start_time
|
||
|
||
if result:
|
||
return {
|
||
'advice': result.get('advice', '观望'),
|
||
'confidence': result.get('confidence', 50),
|
||
'summary': result.get('summary', ''),
|
||
'action_plan': result.get('action_plan', []),
|
||
'position_suggestion': result.get('position_suggestion', ''),
|
||
'timing': result.get('timing', ''),
|
||
'key_message': result.get('key_message', ''),
|
||
'success': True,
|
||
'analysis_time': round(analysis_time, 2),
|
||
'raw_response': response,
|
||
}
|
||
else:
|
||
return self._fallback_investment_advice(risk_assess, flow_data)
|
||
|
||
except Exception as e:
|
||
logger.error(f"投资建议生成失败: {e}")
|
||
return self._fallback_investment_advice(risk_assess, flow_data)
|
||
|
||
def run_full_analysis(self, hot_topics: List[Dict],
|
||
stock_news: List[Dict],
|
||
flow_data: Dict,
|
||
sentiment_data: Dict,
|
||
viral_k: float = 1.0,
|
||
flow_type: str = "未知") -> Dict:
|
||
"""
|
||
运行完整的AI分析
|
||
|
||
Returns:
|
||
{
|
||
'sector_analysis': Dict,
|
||
'stock_recommend': Dict,
|
||
'risk_assess': Dict,
|
||
'investment_advice': Dict,
|
||
'success': bool,
|
||
'analysis_time': float,
|
||
}
|
||
"""
|
||
start_time = time.time()
|
||
|
||
logger.info("🤖 开始AI分析...")
|
||
|
||
# 1. 板块影响分析
|
||
logger.info(" 📊 分析板块影响...")
|
||
sector_analysis = self.sector_impact_agent(hot_topics, stock_news, flow_data)
|
||
|
||
# 2. 股票推荐
|
||
logger.info(" 📈 生成股票推荐...")
|
||
flow_stage = sentiment_data.get('flow_stage', {}).get('stage_name', '未知')
|
||
sentiment_class = sentiment_data.get('sentiment', {}).get('sentiment_class', '中性')
|
||
stock_recommend = self.stock_recommend_agent(
|
||
sector_analysis.get('benefited_sectors', []),
|
||
flow_stage,
|
||
sentiment_class
|
||
)
|
||
|
||
# 3. 风险评估
|
||
logger.info(" ⚠️ 评估风险...")
|
||
risk_assess = self.risk_assess_agent(
|
||
flow_stage,
|
||
sentiment_data.get('sentiment', {}),
|
||
viral_k,
|
||
flow_type
|
||
)
|
||
|
||
# 4. 综合投资建议
|
||
logger.info(" 💡 生成投资建议...")
|
||
investment_advice = self.investment_advisor_agent(
|
||
sector_analysis,
|
||
stock_recommend,
|
||
risk_assess,
|
||
flow_data,
|
||
sentiment_data.get('sentiment', {})
|
||
)
|
||
|
||
total_time = time.time() - start_time
|
||
logger.info(f"✅ AI分析完成,耗时 {total_time:.2f} 秒")
|
||
|
||
# 汇总结果
|
||
return {
|
||
'sector_analysis': sector_analysis,
|
||
'stock_recommend': stock_recommend,
|
||
'risk_assess': risk_assess,
|
||
'investment_advice': investment_advice,
|
||
'success': all([
|
||
sector_analysis.get('success', False),
|
||
stock_recommend.get('success', False),
|
||
risk_assess.get('success', False),
|
||
investment_advice.get('success', False),
|
||
]),
|
||
'analysis_time': round(total_time, 2),
|
||
'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
|
||
}
|
||
|
||
def analyze_sector_deep(self, sector_name: str, related_news: List[Dict],
|
||
hot_topics: List[Dict]) -> Dict:
|
||
"""
|
||
深度分析单个板块
|
||
|
||
为每个热门板块单独调用DeepSeek进行深度分析
|
||
"""
|
||
if not self.is_available():
|
||
return {'success': False, 'error': 'AI不可用'}
|
||
|
||
news_text = '\n'.join([
|
||
f"- [{n.get('platform_name', '')}] {n.get('title', '')}"
|
||
for n in related_news[:20]
|
||
])
|
||
|
||
topics_text = '\n'.join([
|
||
f"- {t['topic']} (热度:{t.get('heat', 0)})"
|
||
for t in hot_topics[:10]
|
||
])
|
||
|
||
prompt = f"""你是{sector_name}板块的专业分析师。
|
||
|
||
请对以下与{sector_name}相关的新闻进行深度分析:
|
||
|
||
【相关新闻】
|
||
{news_text}
|
||
|
||
【相关热点话题】
|
||
{topics_text}
|
||
|
||
请分析:
|
||
1. {sector_name}板块当前的市场热度和关注度
|
||
2. 驱动因素分析(政策/技术/资金/事件)
|
||
3. 短期(1-3天)走势预判
|
||
4. 核心龙头股分析(至少3只)
|
||
5. 投资建议和风险提示
|
||
|
||
以JSON格式输出:
|
||
{{
|
||
"sector_name": "{sector_name}",
|
||
"heat_level": "极高/高/中/低",
|
||
"heat_score": 85,
|
||
"drivers": [
|
||
{{"type": "政策", "content": "具体驱动因素", "impact": "正面/负面"}}
|
||
],
|
||
"short_term_outlook": "看涨/震荡/看跌",
|
||
"outlook_reason": "预判理由",
|
||
"leader_stocks": [
|
||
{{
|
||
"code": "600000",
|
||
"name": "股票名称",
|
||
"reason": "龙头理由",
|
||
"strategy": "操作策略"
|
||
}}
|
||
],
|
||
"investment_advice": "具体投资建议",
|
||
"risk_warning": "风险提示",
|
||
"key_indicators": {{
|
||
"关注度": "高",
|
||
"资金流向": "净流入",
|
||
"情绪指数": 75
|
||
}}
|
||
}}
|
||
|
||
只输出JSON。"""
|
||
|
||
try:
|
||
messages = [
|
||
{"role": "system", "content": f"你是{sector_name}板块专业分析师,只输出JSON格式。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
response = self.deepseek_client.call_api(messages, temperature=0.5, max_tokens=2000)
|
||
result = self._parse_json_response(response)
|
||
|
||
if result:
|
||
result['success'] = True
|
||
return result
|
||
else:
|
||
return {'success': False, 'sector_name': sector_name}
|
||
|
||
except Exception as e:
|
||
logger.error(f"{sector_name}板块分析失败: {e}")
|
||
return {'success': False, 'sector_name': sector_name, 'error': str(e)}
|
||
|
||
def run_multi_sector_analysis(self, hot_topics: List[Dict],
|
||
stock_news: List[Dict],
|
||
target_sectors: List[str] = None) -> Dict:
|
||
"""
|
||
多板块并行分析
|
||
|
||
对多个热门板块分别调用DeepSeek进行深度分析
|
||
|
||
Args:
|
||
hot_topics: 热门话题列表
|
||
stock_news: 股票相关新闻
|
||
target_sectors: 指定分析的板块列表,为None则自动识别
|
||
|
||
Returns:
|
||
{
|
||
'sector_analyses': List[Dict], # 各板块分析结果
|
||
'summary': str, # 综合总结
|
||
'top_sectors': List[str], # 最热门板块
|
||
'success': bool
|
||
}
|
||
"""
|
||
if not self.is_available():
|
||
return {'success': False, 'error': 'AI不可用', 'sector_analyses': []}
|
||
|
||
start_time = time.time()
|
||
|
||
# 如果没有指定板块,先识别热门板块
|
||
if not target_sectors:
|
||
target_sectors = self._identify_hot_sectors(hot_topics, stock_news)
|
||
|
||
logger.info(f"🔍 开始分析 {len(target_sectors)} 个热门板块: {target_sectors}")
|
||
|
||
# 对每个板块进行深度分析
|
||
sector_analyses = []
|
||
for sector in target_sectors[:5]: # 最多分析5个板块
|
||
logger.info(f" 📊 分析板块: {sector}")
|
||
|
||
# 筛选与该板块相关的新闻
|
||
related_news = self._filter_news_by_sector(stock_news, sector)
|
||
related_topics = self._filter_topics_by_sector(hot_topics, sector)
|
||
|
||
analysis = self.analyze_sector_deep(sector, related_news, related_topics)
|
||
if analysis.get('success'):
|
||
sector_analyses.append(analysis)
|
||
|
||
# 生成综合总结
|
||
summary = self._generate_multi_sector_summary(sector_analyses)
|
||
|
||
total_time = time.time() - start_time
|
||
logger.info(f"✅ 多板块分析完成,耗时 {total_time:.2f} 秒")
|
||
|
||
return {
|
||
'sector_analyses': sector_analyses,
|
||
'summary': summary,
|
||
'top_sectors': target_sectors[:5],
|
||
'analysis_count': len(sector_analyses),
|
||
'analysis_time': round(total_time, 2),
|
||
'success': len(sector_analyses) > 0
|
||
}
|
||
|
||
def _identify_hot_sectors(self, hot_topics: List[Dict], stock_news: List[Dict]) -> List[str]:
|
||
"""识别热门板块"""
|
||
# 板块关键词映射
|
||
sector_keywords = {
|
||
'AI人工智能': ['AI', '人工智能', '大模型', 'ChatGPT', '算力', '智能', 'DeepSeek', '机器人'],
|
||
'新能源': ['新能源', '光伏', '锂电', '储能', '电池', '充电桩', '风电'],
|
||
'半导体芯片': ['芯片', '半导体', '光刻', '封装', '晶圆', '国产替代'],
|
||
'医药生物': ['医药', '生物', '疫苗', '创新药', '医疗', 'CXO'],
|
||
'消费': ['消费', '白酒', '食品', '零售', '餐饮', '旅游'],
|
||
'金融': ['银行', '保险', '券商', '证券', '金融'],
|
||
'房地产': ['房地产', '地产', '楼市', '房价'],
|
||
'军工': ['军工', '国防', '航空', '航天', '武器'],
|
||
'汽车': ['汽车', '新能源车', '智能驾驶', '无人驾驶'],
|
||
'低空经济': ['低空', '无人机', '飞行汽车', 'eVTOL'],
|
||
'机器人': ['机器人', '人形机器人', '工业机器人', '减速器'],
|
||
'数据要素': ['数据', '数据要素', '数据交易', '数字经济'],
|
||
}
|
||
|
||
# 统计各板块的热度
|
||
sector_scores = {}
|
||
|
||
# 从话题中统计
|
||
for topic in hot_topics:
|
||
topic_text = topic.get('topic', '')
|
||
for sector, keywords in sector_keywords.items():
|
||
for kw in keywords:
|
||
if kw in topic_text:
|
||
sector_scores[sector] = sector_scores.get(sector, 0) + topic.get('heat', 1)
|
||
break
|
||
|
||
# 从新闻中统计
|
||
for news in stock_news:
|
||
news_text = (news.get('title') or '') + (news.get('content') or '')
|
||
for sector, keywords in sector_keywords.items():
|
||
for kw in keywords:
|
||
if kw in news_text:
|
||
sector_scores[sector] = sector_scores.get(sector, 0) + news.get('weight', 1)
|
||
break
|
||
|
||
# 按热度排序
|
||
sorted_sectors = sorted(sector_scores.items(), key=lambda x: x[1], reverse=True)
|
||
return [s[0] for s in sorted_sectors[:5]]
|
||
|
||
def _filter_news_by_sector(self, news_list: List[Dict], sector: str) -> List[Dict]:
|
||
"""筛选与板块相关的新闻"""
|
||
sector_keywords = {
|
||
'AI人工智能': ['AI', '人工智能', '大模型', 'ChatGPT', '算力', '智能', 'DeepSeek', '机器人'],
|
||
'新能源': ['新能源', '光伏', '锂电', '储能', '电池', '充电桩', '风电'],
|
||
'半导体芯片': ['芯片', '半导体', '光刻', '封装', '晶圆'],
|
||
'医药生物': ['医药', '生物', '疫苗', '创新药', '医疗'],
|
||
'消费': ['消费', '白酒', '食品', '零售', '餐饮'],
|
||
'金融': ['银行', '保险', '券商', '证券', '金融'],
|
||
'房地产': ['房地产', '地产', '楼市'],
|
||
'军工': ['军工', '国防', '航空', '航天'],
|
||
'汽车': ['汽车', '新能源车', '智能驾驶'],
|
||
'低空经济': ['低空', '无人机', '飞行汽车'],
|
||
'机器人': ['机器人', '人形机器人', '减速器'],
|
||
'数据要素': ['数据', '数据要素', '数字经济'],
|
||
}
|
||
|
||
keywords = sector_keywords.get(sector, [sector])
|
||
related = []
|
||
|
||
for news in news_list:
|
||
text = (news.get('title') or '') + (news.get('content') or '')
|
||
for kw in keywords:
|
||
if kw in text:
|
||
related.append(news)
|
||
break
|
||
|
||
return related[:20]
|
||
|
||
def _filter_topics_by_sector(self, topics: List[Dict], sector: str) -> List[Dict]:
|
||
"""筛选与板块相关的话题"""
|
||
sector_keywords = {
|
||
'AI人工智能': ['AI', '人工智能', '大模型', 'ChatGPT', '算力', '智能'],
|
||
'新能源': ['新能源', '光伏', '锂电', '储能', '电池'],
|
||
'半导体芯片': ['芯片', '半导体', '光刻'],
|
||
'医药生物': ['医药', '生物', '疫苗', '医疗'],
|
||
'消费': ['消费', '白酒', '食品', '餐饮'],
|
||
}
|
||
|
||
keywords = sector_keywords.get(sector, [sector])
|
||
related = []
|
||
|
||
for topic in topics:
|
||
text = topic.get('topic', '')
|
||
for kw in keywords:
|
||
if kw in text:
|
||
related.append(topic)
|
||
break
|
||
|
||
return related[:10]
|
||
|
||
def _generate_multi_sector_summary(self, sector_analyses: List[Dict]) -> str:
|
||
"""生成多板块分析总结"""
|
||
if not sector_analyses:
|
||
return "暂无板块分析数据"
|
||
|
||
# 按热度排序
|
||
sorted_analyses = sorted(
|
||
sector_analyses,
|
||
key=lambda x: x.get('heat_score', 0),
|
||
reverse=True
|
||
)
|
||
|
||
summary_parts = []
|
||
summary_parts.append(f"共分析{len(sector_analyses)}个热门板块:")
|
||
|
||
for i, analysis in enumerate(sorted_analyses[:3], 1):
|
||
sector = analysis.get('sector_name', '未知')
|
||
heat = analysis.get('heat_level', '中')
|
||
outlook = analysis.get('short_term_outlook', '震荡')
|
||
summary_parts.append(f"{i}. {sector}(热度{heat},{outlook})")
|
||
|
||
return ' '.join(summary_parts)
|
||
|
||
def _parse_json_response(self, response: str) -> Optional[Dict]:
|
||
"""解析JSON响应"""
|
||
try:
|
||
# 清理响应文本
|
||
text = response.strip()
|
||
|
||
# 处理markdown代码块
|
||
if '```json' in text:
|
||
text = text.split('```json')[1].split('```')[0]
|
||
elif '```' in text:
|
||
text = text.split('```')[1].split('```')[0]
|
||
|
||
# 移除可能的推理过程
|
||
if '【推理过程】' in text:
|
||
parts = text.split('【推理过程】')
|
||
text = parts[-1] if len(parts) > 1 else parts[0]
|
||
|
||
# 查找JSON部分
|
||
start = text.find('{')
|
||
end = text.rfind('}') + 1
|
||
|
||
if start >= 0 and end > start:
|
||
json_text = text[start:end]
|
||
return json.loads(json_text)
|
||
|
||
return None
|
||
|
||
except json.JSONDecodeError as e:
|
||
logger.error(f"JSON解析失败: {e}")
|
||
return None
|
||
|
||
# ==================== 降级方法 ====================
|
||
|
||
def _fallback_sector_analysis(self, hot_topics: List[Dict],
|
||
stock_news: List[Dict]) -> Dict:
|
||
"""板块分析降级方法"""
|
||
# 基于关键词的简单分析
|
||
sector_keywords = {
|
||
'AI人工智能': ['AI', '人工智能', 'ChatGPT', '大模型', '算力', 'GPT'],
|
||
'新能源': ['新能源', '锂电', '光伏', '风电', '储能', '充电桩'],
|
||
'半导体': ['芯片', '半导体', '光刻机', '集成电路', '封测'],
|
||
'医药生物': ['医药', '疫苗', '创新药', '医疗', '生物'],
|
||
'消费': ['消费', '白酒', '食品', '零售', '餐饮'],
|
||
'金融': ['银行', '保险', '券商', '金融', '信托'],
|
||
}
|
||
|
||
sector_hits = {}
|
||
for topic in hot_topics:
|
||
topic_text = topic.get('topic', '')
|
||
heat = topic.get('heat', 0)
|
||
for sector, keywords in sector_keywords.items():
|
||
if any(kw in topic_text for kw in keywords):
|
||
if sector not in sector_hits:
|
||
sector_hits[sector] = 0
|
||
sector_hits[sector] += heat
|
||
|
||
# 排序获取TOP板块
|
||
sorted_sectors = sorted(sector_hits.items(), key=lambda x: x[1], reverse=True)
|
||
|
||
benefited_sectors = [
|
||
{
|
||
'name': sector,
|
||
'impact': '利好',
|
||
'confidence': min(60, score // 2),
|
||
'reason': f'热点话题关联度较高,热度得分{score}'
|
||
}
|
||
for sector, score in sorted_sectors[:5]
|
||
]
|
||
|
||
return {
|
||
'affected_sectors': benefited_sectors,
|
||
'benefited_sectors': benefited_sectors,
|
||
'damaged_sectors': [],
|
||
'opportunity_assessment': '基于关键词匹配的简单分析,建议参考AI深度分析结果。',
|
||
'key_points': ['AI分析不可用,使用降级方法'],
|
||
'success': True,
|
||
'fallback': True,
|
||
}
|
||
|
||
def _fallback_stock_recommend(self, hot_sectors: List[Dict]) -> Dict:
|
||
"""股票推荐降级方法"""
|
||
return {
|
||
'recommended_stocks': [],
|
||
'overall_strategy': 'AI分析不可用,建议自行研究热门板块龙头股。',
|
||
'risk_warning': '此为降级结果,请谨慎参考。',
|
||
'success': True,
|
||
'fallback': True,
|
||
}
|
||
|
||
def _fallback_risk_assess(self, flow_stage: str,
|
||
sentiment_data: Dict,
|
||
viral_k: float) -> Dict:
|
||
"""风险评估降级方法"""
|
||
risk_score = 50
|
||
risk_factors = []
|
||
|
||
# 基于规则的简单风险评估
|
||
if flow_stage in ['一致', 'consensus']:
|
||
risk_score += 30
|
||
risk_factors.append('流量处于一致阶段,可能是顶部')
|
||
elif flow_stage in ['退潮', 'decline']:
|
||
risk_score += 20
|
||
risk_factors.append('流量正在退潮')
|
||
|
||
sentiment_index = sentiment_data.get('sentiment_index', 50)
|
||
if sentiment_index > 85:
|
||
risk_score += 15
|
||
risk_factors.append('情绪过度乐观')
|
||
elif sentiment_index < 20:
|
||
risk_score += 10
|
||
risk_factors.append('情绪过度悲观')
|
||
|
||
if viral_k > 1.5:
|
||
risk_score += 15
|
||
risk_factors.append(f'K值={viral_k},流量指数型增长')
|
||
|
||
risk_score = min(100, risk_score)
|
||
|
||
if risk_score >= 80:
|
||
risk_level = '极高'
|
||
elif risk_score >= 60:
|
||
risk_level = '高'
|
||
elif risk_score >= 40:
|
||
risk_level = '中等'
|
||
elif risk_score >= 20:
|
||
risk_level = '低'
|
||
else:
|
||
risk_level = '极低'
|
||
|
||
return {
|
||
'risk_level': risk_level,
|
||
'risk_score': risk_score,
|
||
'risk_factors': risk_factors,
|
||
'opportunities': [],
|
||
'analysis': '基于规则的简单风险评估,AI分析不可用。',
|
||
'key_warning': '请谨慎参考,建议开启AI分析获取更准确的评估。',
|
||
'success': True,
|
||
'fallback': True,
|
||
}
|
||
|
||
def _fallback_investment_advice(self, risk_assess: Dict,
|
||
flow_data: Dict) -> Dict:
|
||
"""投资建议降级方法"""
|
||
risk_level = risk_assess.get('risk_level', '中等')
|
||
|
||
if risk_level in ['极高', '高']:
|
||
advice = '回避'
|
||
confidence = 70
|
||
summary = '当前风险较高,建议保持观望或减仓。'
|
||
elif risk_level == '中等':
|
||
advice = '观望'
|
||
confidence = 60
|
||
summary = '市场状态中性,建议观望等待更明确的信号。'
|
||
else:
|
||
advice = '关注'
|
||
confidence = 55
|
||
summary = '风险较低,可关注热点板块机会。'
|
||
|
||
return {
|
||
'advice': advice,
|
||
'confidence': confidence,
|
||
'summary': summary,
|
||
'action_plan': ['AI分析不可用,请自行判断'],
|
||
'position_suggestion': '建议仓位不超过30%',
|
||
'timing': '等待确认信号',
|
||
'key_message': '此为降级结果,请谨慎参考。',
|
||
'success': True,
|
||
'fallback': True,
|
||
}
|
||
|
||
|
||
# 全局实例
|
||
news_flow_agents = NewsFlowAgents()
|
||
|
||
|
||
# 测试代码
|
||
if __name__ == "__main__":
|
||
print("=== 测试新闻流量智能分析代理 ===")
|
||
|
||
# 检查AI是否可用
|
||
if news_flow_agents.is_available():
|
||
print("✅ AI客户端可用")
|
||
else:
|
||
print("⚠️ AI客户端不可用,将使用降级方法")
|
||
|
||
# 模拟数据
|
||
hot_topics = [
|
||
{'topic': 'AI芯片', 'heat': 95, 'cross_platform': 5},
|
||
{'topic': '新能源汽车', 'heat': 80, 'cross_platform': 4},
|
||
{'topic': '涨停板', 'heat': 75, 'cross_platform': 3},
|
||
]
|
||
|
||
stock_news = [
|
||
{'platform_name': '东方财富', 'title': 'AI概念股集体大涨,龙头股涨停'},
|
||
{'platform_name': '雪球', 'title': '新能源板块反弹,锂电池领涨'},
|
||
]
|
||
|
||
flow_data = {
|
||
'total_score': 650,
|
||
'level': '高',
|
||
}
|
||
|
||
sentiment_data = {
|
||
'sentiment': {'sentiment_index': 72, 'sentiment_class': '乐观'},
|
||
'flow_stage': {'stage_name': '加速'},
|
||
}
|
||
|
||
# 运行板块分析
|
||
print("\n--- 板块影响分析 ---")
|
||
sector_result = news_flow_agents.sector_impact_agent(hot_topics, stock_news, flow_data)
|
||
print(f"受益板块: {[s.get('name', '') for s in sector_result.get('benefited_sectors', [])]}")
|
||
print(f"是否降级: {sector_result.get('fallback', False)}")
|