增加新闻分析agent,增强情绪分析师mcp

This commit is contained in:
oficcejo
2025-10-07 11:20:03 +08:00
parent 90716f5c78
commit 54ef44cf22
5 changed files with 1403 additions and 46 deletions
+121 -17
View File
@@ -379,8 +379,8 @@ def main():
**AI分析流程**
1. 数据获取 → 2. 技术分析
3. 基本面分析 → 4. 资金分析
5. 情绪数据(ARBR) → 6. 风险评估
7. 情绪分析 → 8. 团队讨论 → 9. 决策
5. 情绪数据(ARBR) → 6. 新闻公告
7. AI团队分析 → 8. 团队讨论 → 9. 决策
""")
# 检查是否显示历史记录
@@ -416,11 +416,70 @@ def main():
st.cache_data.clear()
st.success("缓存已清除")
# 分析师团队选择
st.markdown("---")
st.subheader("👥 选择分析师团队")
col1, col2, col3 = st.columns(3)
with col1:
enable_technical = st.checkbox("📊 技术分析师", value=True,
help="负责技术指标分析、图表形态识别、趋势判断")
enable_fundamental = st.checkbox("💼 基本面分析师", value=True,
help="负责公司财务分析、行业研究、估值分析")
with col2:
enable_fund_flow = st.checkbox("💰 资金面分析师", value=True,
help="负责资金流向分析、主力行为研究")
enable_risk = st.checkbox("⚠️ 风险管理师", value=True,
help="负责风险识别、风险评估、风险控制策略制定")
with col3:
enable_sentiment = st.checkbox("📈 市场情绪分析师", value=False,
help="负责市场情绪研究、ARBR指标分析(仅A股)")
enable_news = st.checkbox("📰 新闻公告分析师", value=False,
help="负责新闻事件分析、公司公告解读(仅A股)")
# 显示已选择的分析师
selected_analysts = []
if enable_technical:
selected_analysts.append("技术分析师")
if enable_fundamental:
selected_analysts.append("基本面分析师")
if enable_fund_flow:
selected_analysts.append("资金面分析师")
if enable_risk:
selected_analysts.append("风险管理师")
if enable_sentiment:
selected_analysts.append("市场情绪分析师")
if enable_news:
selected_analysts.append("新闻公告分析师")
if selected_analysts:
st.info(f"✅ 已选择 {len(selected_analysts)} 位分析师: {', '.join(selected_analysts)}")
else:
st.warning("⚠️ 请至少选择一位分析师")
# 保存选择到session_state
st.session_state.enable_technical = enable_technical
st.session_state.enable_fundamental = enable_fundamental
st.session_state.enable_fund_flow = enable_fund_flow
st.session_state.enable_risk = enable_risk
st.session_state.enable_sentiment = enable_sentiment
st.session_state.enable_news = enable_news
st.markdown("---")
if analyze_button and stock_input:
if not api_key_status:
st.error("❌ 请先配置 DeepSeek API Key")
return
# 检查是否至少选择了一位分析师
if not selected_analysts:
st.error("❌ 请至少选择一位分析师参与分析")
return
# 清除之前的分析结果
if 'analysis_completed' in st.session_state:
del st.session_state.analysis_completed
@@ -525,9 +584,14 @@ def run_stock_analysis(symbol, period):
financial_data = fetcher.get_financial_data(symbol)
progress_bar.progress(35)
# 3. 获取资金流向数据(仅A股)
# 获取分析师选择状态
enable_fund_flow = st.session_state.get('enable_fund_flow', True)
enable_sentiment = st.session_state.get('enable_sentiment', False)
enable_news = st.session_state.get('enable_news', False)
# 3. 获取资金流向数据(仅在选择了资金面分析师时)
fund_flow_data = None
if fetcher._is_chinese_stock(symbol):
if enable_fund_flow and fetcher._is_chinese_stock(symbol):
status_text.text("💰 正在获取资金流向数据(主力)...")
try:
fund_flow_data = fetcher.get_fund_flow_data(symbol)
@@ -538,13 +602,13 @@ def run_stock_analysis(symbol, period):
except Exception as e:
st.warning(f"⚠️ 获取资金流向数据时出错: {str(e)}")
fund_flow_data = None
else:
elif enable_fund_flow and not fetcher._is_chinese_stock(symbol):
st.info("️ 美股暂不支持资金流向数据")
progress_bar.progress(40)
# 4. 获取市场情绪数据(仅A股
# 4. 获取市场情绪数据(仅在选择了市场情绪分析师时
sentiment_data = None
if fetcher._is_chinese_stock(symbol):
if enable_sentiment and fetcher._is_chinese_stock(symbol):
status_text.text("📊 正在获取市场情绪数据(ARBR等指标)...")
try:
from market_sentiment_data import MarketSentimentDataFetcher
@@ -557,34 +621,74 @@ def run_stock_analysis(symbol, period):
except Exception as e:
st.warning(f"⚠️ 获取市场情绪数据时出错: {str(e)}")
sentiment_data = None
else:
elif enable_sentiment and not fetcher._is_chinese_stock(symbol):
st.info("ℹ️ 美股暂不支持市场情绪数据(ARBR等指标)")
progress_bar.progress(45)
# 5. 初始化AI分析系统
# 5. 获取新闻公告数据(仅在选择了新闻公告分析师时)
news_announcement_data = None
if enable_news and fetcher._is_chinese_stock(symbol):
status_text.text("📰 正在获取新闻公告数据(问财)...")
try:
from news_announcement_data import NewsAnnouncementDataFetcher
news_fetcher = NewsAnnouncementDataFetcher()
news_announcement_data = news_fetcher.get_news_and_announcements(symbol)
if news_announcement_data and news_announcement_data.get('data_success'):
news_count = news_announcement_data.get('news_data', {}).get('count', 0) if news_announcement_data.get('news_data') else 0
announcement_count = news_announcement_data.get('announcement_data', {}).get('count', 0) if news_announcement_data.get('announcement_data') else 0
st.info(f"✅ 成功获取 {news_count} 条新闻,{announcement_count} 条公告")
else:
st.warning("⚠️ 未能获取新闻公告数据,将基于基本信息进行分析")
except Exception as e:
st.warning(f"⚠️ 获取新闻公告数据时出错: {str(e)}")
news_announcement_data = None
elif enable_news and not fetcher._is_chinese_stock(symbol):
st.info("️ 美股暂不支持新闻公告数据")
progress_bar.progress(50)
# 6. 初始化AI分析系统
status_text.text("🤖 正在初始化AI分析系统...")
# 使用选择的模型
selected_model = st.session_state.get('selected_model', 'deepseek-chat')
agents = StockAnalysisAgents(model=selected_model)
progress_bar.progress(50)
progress_bar.progress(55)
# 6. 运行多智能体分析(传入资金流向数据和市场情绪数据)
status_text.text("🔍 AI分析师团队正在分析...")
agents_results = agents.run_multi_agent_analysis(stock_info, stock_data, indicators, financial_data, fund_flow_data, sentiment_data)
progress_bar.progress(70)
# 获取所有分析师选择状态
enable_technical = st.session_state.get('enable_technical', True)
enable_fundamental = st.session_state.get('enable_fundamental', True)
enable_risk = st.session_state.get('enable_risk', True)
# 创建分析师启用字典
enabled_analysts = {
'technical': enable_technical,
'fundamental': enable_fundamental,
'fund_flow': enable_fund_flow,
'risk': enable_risk,
'sentiment': enable_sentiment,
'news': enable_news
}
# 7. 运行多智能体分析(传入所有数据和分析师选择)
status_text.text("🔍 AI分析师团队正在分析,请耐心等待几分钟...")
agents_results = agents.run_multi_agent_analysis(
stock_info, stock_data, indicators, financial_data,
fund_flow_data, sentiment_data, news_announcement_data,
enabled_analysts=enabled_analysts
)
progress_bar.progress(75)
# 显示各分析师报告
display_agents_analysis(agents_results)
# 7. 团队讨论
# 8. 团队讨论
status_text.text("🤝 分析团队正在讨论...")
discussion_result = agents.conduct_team_discussion(agents_results, stock_info)
progress_bar.progress(85)
progress_bar.progress(88)
# 显示团队讨论
display_team_discussion(discussion_result)
# 8. 最终决策
# 9. 最终决策
status_text.text("📋 正在制定最终投资决策...")
final_decision = agents.make_final_decision(discussion_result, stock_info, indicators)
progress_bar.progress(100)