diff --git a/DEEPSEEK_REASONER_FIX.md b/DEEPSEEK_REASONER_FIX.md deleted file mode 100644 index 6c4386f..0000000 --- a/DEEPSEEK_REASONER_FIX.md +++ /dev/null @@ -1,122 +0,0 @@ -# DeepSeek Reasoner 模型输出不全问题修复说明 - -## 问题描述 - -使用 `deepseek-chat` 模型输出正常,但使用 `deepseek-reasoner` 模型进行技术面分析、基本面分析等各个分析时,输出文字不全。 - -## 问题原因 - -**deepseek-reasoner** 模型与 **deepseek-chat** 模型有重要区别: - -1. **响应结构不同**: - - `deepseek-chat`: 只返回 `content`(最终答案) - - `deepseek-reasoner`: 返回 `reasoning_content`(推理过程)+ `content`(最终答案) - -2. **Token 需求更大**: - - reasoner 模型需要输出详细的推理过程,需要更多的 tokens - - 原代码中 `max_tokens=2000` 对 reasoner 模型来说太小,导致输出被截断 - -## 解决方案 - -### 1. 自动调整 max_tokens(已修复) - -在 `deepseek_client.py` 的 `call_api` 方法中: - -```python -# 对于 reasoner 模型,自动增加 max_tokens -if "reasoner" in model_to_use.lower() and max_tokens <= 2000: - max_tokens = 8000 # reasoner 模型需要更多 tokens 来输出推理过程 -``` - -### 2. 正确处理 reasoner 响应(已修复) - -```python -# 处理 reasoner 模型的响应 -message = response.choices[0].message -result = "" - -# 检查是否有推理内容 -if hasattr(message, 'reasoning_content') and message.reasoning_content: - result += f"【推理过程】\n{message.reasoning_content}\n\n" - -# 添加最终内容 -if message.content: - result += message.content -``` - -### 3. 提高各分析模块的 max_tokens(已修复) - -| 分析模块 | 原 max_tokens | 新 max_tokens | -|---------|--------------|--------------| -| 技术面分析 | 2000 | 8000 (自动) | -| 基本面分析 | 2000 | 8000 (自动) | -| 资金面分析 | 2000 | 8000 (自动) | -| 风险管理分析 | 2000 | 8000 (自动) | -| 市场情绪分析 | 2000 | 8000 (自动) | -| 综合讨论 | 3000 | 6000 | -| 最终决策 | 2000 | 4000 | -| 团队讨论 | 3000 | 6000 | - -## 修改的文件 - -1. **deepseek_client.py** - - `call_api()` 方法:增加 reasoner 检测和 max_tokens 自动调整 - - `call_api()` 方法:增加 reasoning_content 处理 - - `comprehensive_discussion()` 方法:max_tokens 从 3000 增加到 6000 - - `final_decision()` 方法:max_tokens 从 2000 增加到 4000 - -2. **ai_agents.py** - - `conduct_team_discussion()` 方法:max_tokens 从 3000 增加到 6000 - -## 使用建议 - -### 1. 模型选择 - -- **deepseek-chat**: - - 适用场景:快速分析、常规查询 - - 优点:响应快,成本低 - - 缺点:推理能力相对较弱 - -- **deepseek-reasoner**: - - 适用场景:复杂分析、需要深度推理的场景 - - 优点:推理能力强,分析更深入 - - 缺点:响应时间较长,token 消耗更多 - -### 2. 查看推理过程 - -使用 reasoner 模型时,响应中会包含 `【推理过程】` 部分,展示 AI 的思考过程,帮助你理解分析的逻辑。 - -### 3. Token 消耗 - -reasoner 模型的 token 消耗通常是 chat 模型的 2-4 倍,请注意 API 使用成本。 - -## 验证方法 - -1. 在应用中选择 "DeepSeek Reasoner (推理增强)" 模型 -2. 输入股票代码进行分析 -3. 检查各个分析报告是否完整输出 -4. 查看是否包含 `【推理过程】` 部分 - -## 预期效果 - -修复后,使用 deepseek-reasoner 模型应该能够: -- ✅ 完整输出技术面分析报告 -- ✅ 完整输出基本面分析报告 -- ✅ 完整输出资金面分析报告 -- ✅ 完整输出风险管理报告 -- ✅ 完整输出市场情绪分析报告 -- ✅ 完整输出综合讨论结果 -- ✅ 完整输出最终投资决策 -- ✅ 显示推理过程(如果 API 支持) - -## 注意事项 - -1. **API 兼容性**:确保使用的 DeepSeek API 版本支持 reasoner 模型 -2. **Token 限制**:如果仍然出现截断,可以进一步增加 max_tokens -3. **成本控制**:reasoner 模型消耗更多 tokens,注意 API 配额 -4. **响应时间**:reasoner 模型需要更多时间进行推理,请耐心等待 - -## 更新日期 - -2025-10-03 - diff --git a/QUICK_FIX.md b/QUICK_FIX.md deleted file mode 100644 index 2c94410..0000000 --- a/QUICK_FIX.md +++ /dev/null @@ -1,168 +0,0 @@ -# ⚡ 快速修复指南 - -## 部署错误:proxies参数问题 - -### 🔴 错误信息 -``` -分析过程中出现错误: Client.init() got an unexpected keyword argument 'proxies' -``` - -### ✅ 快速解决(3步) - -#### 步骤1:升级OpenAI库 -```bash -pip install --upgrade openai -``` - -#### 步骤2:重新安装依赖 -```bash -pip install -r requirements.txt --upgrade -``` - -#### 步骤3:重启应用 -```bash -streamlit run app.py -``` - ---- - -## 其他常见问题快速修复 - -### 1. 模块未找到错误 - -**错误**:`ModuleNotFoundError: No module named 'xxx'` - -**修复**: -```bash -pip install xxx -# 或重新安装所有依赖 -pip install -r requirements.txt -``` - -### 2. API密钥错误 - -**错误**:`API Key未配置` - -**修复**: -```bash -# 创建.env文件 -cp .env.example .env - -# 编辑.env文件,添加API密钥 -# DEEPSEEK_API_KEY=your_api_key_here -``` - -### 3. 端口被占用 - -**错误**:`Address already in use` - -**修复**: -```bash -# 使用其他端口 -streamlit run app.py --server.port 8502 -``` - -### 4. 数据库锁定错误 - -**错误**:`database is locked` - -**修复**: -```bash -# 停止所有streamlit进程 -pkill -f streamlit - -# 删除锁文件 -rm -f *.db-wal *.db-shm - -# 重新启动 -streamlit run app.py -``` - -### 5. 权限错误 - -**错误**:`Permission denied` - -**修复**: -```bash -# 设置正确权限 -chmod 666 *.db -chmod 755 . -``` - -### 6. 中文乱码 - -**错误**:PDF中文显示为方框 - -**修复**: -```bash -# Windows: 确保系统安装了中文字体 -# Linux: 安装中文字体包 -sudo apt-get install fonts-wqy-zenhei -``` - -### 7. 网络超时 - -**错误**:`Connection timeout` - -**修复**: -- 检查网络连接 -- 验证防火墙设置 -- 尝试使用代理 - -### 8. 内存不足 - -**错误**:`MemoryError` - -**修复**: -```bash -# 限制数据加载大小 -# 或增加系统内存 -# 或使用更小的数据周期 -``` - ---- - -## 🚀 完整重置流程 - -如果多个问题同时出现,可以尝试完整重置: - -```bash -# 1. 停止所有进程 -pkill -f streamlit - -# 2. 清理虚拟环境 -rm -rf venv/ - -# 3. 创建新虚拟环境 -python -m venv venv -source venv/bin/activate # Linux/Mac -# 或 -.\venv\Scripts\Activate.ps1 # Windows - -# 4. 升级pip -pip install --upgrade pip - -# 5. 重新安装依赖 -pip install -r requirements.txt - -# 6. 配置环境变量 -cp .env.example .env -# 编辑.env文件添加API密钥 - -# 7. 重新启动 -streamlit run app.py -``` - ---- - -## 📞 需要更多帮助? - -1. 查看 `DEPLOYMENT_GUIDE.md` - 完整部署指南 -2. 查看 `BUGFIX.md` - 详细错误记录 -3. 查看 `README.md` - 使用说明 -4. 检查GitHub Issues - ---- - -**提示**:大多数问题都可以通过重新安装依赖或重启应用解决! - diff --git a/ai_agents.py b/ai_agents.py index 0cd5bef..11417c9 100644 --- a/ai_agents.py +++ b/ai_agents.py @@ -39,18 +39,26 @@ class StockAnalysisAgents: "timestamp": time.strftime("%Y-%m-%d %H:%M:%S") } - def fund_flow_analyst_agent(self, stock_info: Dict, indicators: Dict) -> Dict[str, Any]: + def fund_flow_analyst_agent(self, stock_info: Dict, indicators: Dict, fund_flow_data: Dict = None) -> Dict[str, Any]: """资金面分析智能体""" print("💰 资金面分析师正在分析中...") + + # 如果有资金流向数据,显示数据来源 + if fund_flow_data and fund_flow_data.get('query_success'): + print(" ✓ 已获取问财资金流向数据") + else: + print(" ⚠ 未获取到问财资金流向数据,将基于技术指标分析") + time.sleep(1) - analysis = self.deepseek_client.fund_flow_analysis(stock_info, indicators) + analysis = self.deepseek_client.fund_flow_analysis(stock_info, indicators, fund_flow_data) return { "agent_name": "资金面分析师", "agent_role": "负责资金流向分析、主力行为研究、市场情绪判断", "analysis": analysis, "focus_areas": ["资金流向", "主力动向", "市场情绪", "流动性"], + "fund_flow_data": fund_flow_data, # 保存资金流向数据以供后续使用 "timestamp": time.strftime("%Y-%m-%d %H:%M:%S") } @@ -145,7 +153,8 @@ class StockAnalysisAgents: "timestamp": time.strftime("%Y-%m-%d %H:%M:%S") } - def run_multi_agent_analysis(self, stock_info: Dict, stock_data: Any, indicators: Dict, financial_data: Dict = None) -> Dict[str, Any]: + def run_multi_agent_analysis(self, stock_info: Dict, stock_data: Any, indicators: Dict, + financial_data: Dict = None, fund_flow_data: Dict = None) -> Dict[str, Any]: """运行多智能体分析""" print("🚀 启动多智能体股票分析系统...") print("=" * 50) @@ -159,8 +168,8 @@ class StockAnalysisAgents: # 基本面分析 agents_results["fundamental"] = self.fundamental_analyst_agent(stock_info, financial_data) - # 资金面分析 - agents_results["fund_flow"] = self.fund_flow_analyst_agent(stock_info, indicators) + # 资金面分析(传入资金流向数据) + agents_results["fund_flow"] = self.fund_flow_analyst_agent(stock_info, indicators, fund_flow_data) # 风险管理分析 agents_results["risk_management"] = self.risk_management_agent(stock_info, indicators) diff --git a/app.py b/app.py index 74106d8..dadafbb 100644 --- a/app.py +++ b/app.py @@ -510,22 +510,39 @@ def run_stock_analysis(symbol, period): financial_data = fetcher.get_financial_data(symbol) progress_bar.progress(35) - # 3. 初始化AI分析系统 + # 3. 获取资金流向数据(仅A股) + fund_flow_data = None + if fetcher._is_chinese_stock(symbol): + status_text.text("💰 正在获取资金流向数据(问财)...") + try: + fund_flow_data = fetcher.get_fund_flow_data(symbol) + if fund_flow_data and fund_flow_data.get('query_success'): + st.info("✅ 成功获取问财资金流向数据") + else: + st.warning("⚠️ 未能获取问财资金流向数据,将基于技术指标进行资金面分析") + except Exception as e: + st.warning(f"⚠️ 获取资金流向数据时出错: {str(e)}") + fund_flow_data = None + else: + st.info("ℹ️ 美股暂不支持问财资金流向数据") + progress_bar.progress(40) + + # 4. 初始化AI分析系统 status_text.text("🤖 正在初始化AI分析系统...") # 使用选择的模型 selected_model = st.session_state.get('selected_model', 'deepseek-chat') agents = StockAnalysisAgents(model=selected_model) progress_bar.progress(45) - # 4. 运行多智能体分析 + # 5. 运行多智能体分析(传入资金流向数据) status_text.text("🔍 AI分析师团队正在分析...") - agents_results = agents.run_multi_agent_analysis(stock_info, stock_data, indicators, financial_data) + agents_results = agents.run_multi_agent_analysis(stock_info, stock_data, indicators, financial_data, fund_flow_data) progress_bar.progress(70) # 显示各分析师报告 display_agents_analysis(agents_results) - # 5. 团队讨论 + # 6. 团队讨论 status_text.text("🤝 分析团队正在讨论...") discussion_result = agents.conduct_team_discussion(agents_results, stock_info) progress_bar.progress(85) @@ -533,7 +550,7 @@ def run_stock_analysis(symbol, period): # 显示团队讨论 display_team_discussion(discussion_result) - # 6. 最终决策 + # 7. 最终决策 status_text.text("📋 正在制定最终投资决策...") final_decision = agents.make_final_decision(discussion_result, stock_info, indicators) progress_bar.progress(100) diff --git a/deepseek_client.py b/deepseek_client.py index 8679595..8ed30fe 100644 --- a/deepseek_client.py +++ b/deepseek_client.py @@ -206,39 +206,110 @@ class DeepSeekClient: return self.call_api(messages) - def fund_flow_analysis(self, stock_info: Dict, indicators: Dict) -> str: + def fund_flow_analysis(self, stock_info: Dict, indicators: Dict, fund_flow_data: Dict = None) -> str: """资金面分析""" + + # 构建资金流向数据部分 - 直接使用问财原始数据 + fund_flow_section = "" + if fund_flow_data and fund_flow_data.get('query_success'): + raw_data = fund_flow_data.get('raw_data', {}) + + if raw_data: + fund_flow_section = "\n【问财资金流向完整数据(近20个交易日)】\n" + fund_flow_section += f"数据来源:同花顺问财\n" + fund_flow_section += f"股票名称:{fund_flow_data.get('stock_name', 'N/A')}\n" + fund_flow_section += f"股票代码:{fund_flow_data.get('stock_code', 'N/A')}\n\n" + + # 将所有问财返回的数据都列出来,让AI自己分析 + for key, value in raw_data.items(): + # 跳过股票代码和名称(已经显示过了) + if key in ['股票代码', '股票简称', 'code', 'name']: + continue + fund_flow_section += f"- {key}: {value}\n" + + fund_flow_section += "\n以上是问财返回的所有资金流向相关数据,请仔细分析这些数据的含义和相互关系。\n" + else: + fund_flow_section = "\n【资金流向数据】\n注意:问财返回数据为空。\n" + else: + fund_flow_section = "\n【资金流向数据】\n注意:未能获取到问财资金流向数据,将基于成交量进行分析。\n" + prompt = f""" -你是一名资深的资金面分析师。请基于以下信息进行专业的资金面分析: +你是一名资深的资金面分析师,擅长从资金流向数据中洞察主力行为和市场趋势。 -股票信息: -- 股票代码:{stock_info.get('symbol', 'N/A')} -- 股票名称:{stock_info.get('name', 'N/A')} -- 当前价格:{stock_info.get('current_price', 'N/A')} -- 市值:{stock_info.get('market_cap', 'N/A')} +【基本信息】 +股票代码:{stock_info.get('symbol', 'N/A')} +股票名称:{stock_info.get('name', 'N/A')} +当前价格:{stock_info.get('current_price', 'N/A')} +市值:{stock_info.get('market_cap', 'N/A')} -资金相关指标: +【技术指标】 - 量比:{indicators.get('volume_ratio', 'N/A')} - 当前成交量与5日均量比:{indicators.get('volume_ratio', 'N/A')} +{fund_flow_section} -请从以下角度进行分析: -1. 成交量变化分析 -2. 资金流入流出趋势 -3. 大单、中单、小单资金行为 -4. 主力资金动向分析 -5. 市场情绪和资金偏好 -6. 流动性分析 -7. 资金面对股价的支撑或压力 +【分析要求】 -请结合当前市场资金环境,给出专业的资金面分析报告。 +请你**仔细阅读上述问财返回的所有数据字段**,自己识别和提取关键信息,然后从以下角度进行深入分析: + +1. **数据解读与提取**(重要!) + - 识别哪些字段是资金流向相关数据(如:区间资金流向、主力资金、大单、中单、小单等) + - 提取关键数值(注意单位:元、亿元、百分比等) + - 计算主力资金占比、不同类型资金的比例关系 + - 识别涨跌幅、换手率等关联指标 + +2. **资金流向趋势分析** + - 近20日总资金流向趋势(净流入/净流出,金额多少) + - 资金流向与股价涨跌的关系(是否同向) + - 资金流向的强度评估 + +3. **主力资金行为分析**(核心重点) + - 主力资金流向方向和规模 + - 主力资金占比情况(控盘程度) + - 主力操作意图研判(吸筹/派发/洗盘/拉升) + - 主力与散户资金的博弈态势 + - 大单、中单、小单的分布特征 + +4. **资金结构分析** + - 不同类型资金的流向(超大单、大单、中单、小单) + - 机构资金与散户资金的对比 + - 资金集中度分析 + +5. **量价关系分析** + - 资金流向与股价涨跌的配合 + - 量价背离情况识别 + - 成交活跃度评估 + +6. **资金面与技术面结合** + - 资金流向对关键技术位的影响 + - 资金推动与股价趋势的一致性 + - 资金面对未来走势的指示作用 + +7. **风险与机会评估** + - 资金面的风险信号(如主力出逃、资金外流) + - 资金面的机会信号(如主力建仓、资金集中流入) + - 未来资金流向预判 + +8. **投资建议** + - 基于资金面的明确操作建议 + - 买入/持有/卖出的判断依据 + - 仓位管理建议 + +【分析原则】 +- 主力资金持续流入 + 股价上涨 → 强势信号,主力看好 +- 主力资金流出 + 股价上涨 → 警惕信号,可能是散户接盘 +- 主力资金流入 + 股价下跌 → 可能是主力低位吸筹 +- 主力资金流出 + 股价下跌 → 弱势信号,主力看空 +- 注意区分短期波动与趋势性变化 + +请给出专业、详细、有深度的资金面分析报告。记住:要基于问财数据的实际内容进行分析,而不是假设! """ messages = [ - {"role": "system", "content": "你是一名经验丰富的资金面分析师,擅长市场资金流向和主力行为分析。"}, + {"role": "system", "content": "你是一名经验丰富的资金面分析师,擅长市场资金流向和主力行为分析,能够深入解读资金数据背后的投资逻辑。"}, {"role": "user", "content": prompt} ] - return self.call_api(messages) + return self.call_api(messages, max_tokens=3000) def comprehensive_discussion(self, technical_report: str, fundamental_report: str, fund_flow_report: str, stock_info: Dict) -> str: diff --git a/requirements.txt b/requirements.txt index 654c51a..31e5bbf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ pytz ta>=0.10.2 reportlab>=4.0.0 peewee>=3.17.0 -schedule>=1.2.0 \ No newline at end of file +schedule>=1.2.0 +pywencai>=0.7.0 \ No newline at end of file diff --git a/stock_data.py b/stock_data.py index b2eacd4..3dd9700 100644 --- a/stock_data.py +++ b/stock_data.py @@ -6,6 +6,7 @@ import ta from datetime import datetime, timedelta import requests import json +import pywencai class StockDataFetcher: """股票数据获取类""" @@ -545,3 +546,163 @@ class StockDataFetcher: except Exception as e: print(f"获取美股财务数据失败: {e}") return financial_data + + def get_fund_flow_data(self, symbol): + """使用问财获取资金流向数据 + + Args: + symbol: 股票代码(6位数字) + + Returns: + dict: 包含问财原始数据的字典 + """ + fund_flow_data = { + "symbol": symbol, + "query_success": False, + "raw_data": None, # 存储原始数据 + "data_source": "pywencai" + } + + # 只支持中国股票 + if not self._is_chinese_stock(symbol): + fund_flow_data["error"] = "问财数据仅支持中国A股股票" + return fund_flow_data + + try: + # 构建问句,查询近20个交易日的资金流向数据 + query = f"{symbol}近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅" + + print(f"正在使用问财查询资金流向数据: {query}") + + # 使用pywencai查询 + result = pywencai.get(query=query, loop=True) + + # 调试:打印result的类型 + print(f"问财返回的数据类型: {type(result)}") + + # 处理不同类型的返回结果,统一转换为DataFrame + df_result = None + + if result is None: + fund_flow_data["error"] = "问财查询返回None" + print(f"问财查询返回None") + elif isinstance(result, dict): + # 如果返回的是字典,转换为DataFrame + print(f"问财返回字典,转换为DataFrame") + try: + df_result = pd.DataFrame([result]) + print(f"成功转换,形状: {df_result.shape}") + except Exception as e: + fund_flow_data["error"] = f"无法转换为DataFrame: {str(e)}" + print(f"转换失败: {e}") + elif isinstance(result, pd.DataFrame): + # 如果已经是DataFrame + df_result = result + print(f"问财返回DataFrame,形状: {df_result.shape}") + else: + fund_flow_data["error"] = f"问财返回了未知类型: {type(result)}" + print(f"问财返回未知类型: {type(result)}") + + # 如果成功获取到DataFrame + if df_result is not None and not df_result.empty and len(df_result) > 0: + # 打印列名以便调试 + print(f"问财返回的列名: {df_result.columns.tolist()}") + + # 检查是否是嵌套结构(tableV1字段包含实际数据) + if 'tableV1' in df_result.columns and len(df_result.columns) == 1: + print(f"检测到嵌套结构,提取tableV1中的数据") + table_v1_data = df_result.iloc[0]['tableV1'] + + # 检查tableV1的类型 + print(f"tableV1的类型: {type(table_v1_data)}") + + if isinstance(table_v1_data, pd.DataFrame): + # 如果是DataFrame,直接使用 + df_result = table_v1_data + print(f"提取后的DataFrame形状: {df_result.shape}") + print(f"提取后的列名: {df_result.columns.tolist()}") + elif isinstance(table_v1_data, list) and len(table_v1_data) > 0: + # 如果是列表,转换为DataFrame + df_result = pd.DataFrame(table_v1_data) + print(f"从列表转换的DataFrame形状: {df_result.shape}") + print(f"从列表转换的列名: {df_result.columns.tolist()}") + else: + fund_flow_data["error"] = f"tableV1数据类型不支持: {type(table_v1_data)}" + print(f"tableV1数据类型不支持: {type(table_v1_data)}") + return fund_flow_data + + # 再次检查是否有数据 + if df_result is None or df_result.empty or len(df_result) == 0: + fund_flow_data["error"] = "提取后的数据为空" + print(f"提取后的数据为空") + return fund_flow_data + + # 获取第一条记录 + data = df_result.iloc[0] + + # 标记查询成功 + fund_flow_data["query_success"] = True + fund_flow_data["stock_name"] = str(data.get('股票简称', data.get('name', 'N/A'))) + fund_flow_data["stock_code"] = str(data.get('股票代码', data.get('code', symbol))) + + # 将所有数据转换为字典格式(方便AI阅读) + raw_data_dict = {} + for col in df_result.columns: + value = data.get(col) + # 转换为易读的格式 + try: + if value is None or (isinstance(value, float) and pd.isna(value)): + raw_data_dict[col] = "N/A" + elif isinstance(value, (int, float)): + # 如果是大数字(可能是金额),转换为亿元 + if abs(value) > 100000000: + raw_data_dict[col] = f"{value} ({value/100000000:.2f}亿元)" + else: + raw_data_dict[col] = value + elif isinstance(value, pd.DataFrame): + # 如果值本身是DataFrame,跳过 + continue + else: + raw_data_dict[col] = str(value) + except Exception as e: + print(f"处理字段 {col} 时出错: {e}") + raw_data_dict[col] = str(value) + + fund_flow_data["raw_data"] = raw_data_dict + fund_flow_data["columns"] = df_result.columns.tolist() + + print(f"成功获取 {symbol} 的问财数据,共 {len(raw_data_dict)} 个字段") + else: + fund_flow_data["error"] = "问财查询返回空数据" + print(f"问财查询返回空数据") + + except Exception as e: + fund_flow_data["error"] = f"获取资金流向数据失败: {str(e)}" + print(f"获取资金流向数据异常: {e}") + import traceback + traceback.print_exc() + + return fund_flow_data + + def _safe_convert(self, value): + """安全地转换数值""" + if value is None or value == '' or (isinstance(value, float) and np.isnan(value)): + return 'N/A' + try: + if isinstance(value, str): + # 移除百分号和逗号 + value = value.replace('%', '').replace(',', '') + return float(value) + return value + except: + return value + + def _calculate_main_fund_ratio(self, main_fund, total_fund): + """计算主力资金占比""" + try: + if main_fund != 'N/A' and total_fund != 'N/A' and total_fund != 0: + ratio = (main_fund / total_fund) * 100 + return f"{ratio:.2f}%" + except: + pass + return 'N/A' diff --git a/资金流向功能说明.md b/资金流向功能说明.md new file mode 100644 index 0000000..1dcdeb9 --- /dev/null +++ b/资金流向功能说明.md @@ -0,0 +1,302 @@ +# 资金流向功能集成说明 + +## 概述 + +本次更新成功引入了 `pywencai`(问财)库,为资金面分析师提供真实的资金流向数据支撑,包括近20个交易日的区间资金流向、区间主力资金流向和区间涨跌幅数据。 + +## 功能特点 + +### 1. 数据来源 +- **数据源**:同花顺问财(pywencai) +- **数据范围**:近20个交易日 +- **支持市场**:仅支持中国A股(美股暂不支持) + +### 2. 获取的数据指标 + +问财资金流向数据包括: + +- **区间资金流向** + - 总资金流向(元) + - 总资金流向(亿元) + +- **区间主力资金流向** + - 主力资金流向(元) + - 主力资金流向(亿元) + - 主力资金占比(%) + +- **区间涨跌幅** + - 近20日涨跌幅(%) + +- **额外资金数据**(根据问财返回的数据动态提取) + - 可能包含大单、中单、小单资金流向 + - 其他资金相关指标 + +## 代码改动说明 + +### 1. requirements.txt +添加了 `pywencai>=0.7.0` 依赖。 + +### 2. stock_data.py +新增方法: +- `get_fund_flow_data(symbol)`: 使用问财获取资金流向数据 +- `_safe_convert(value)`: 安全地转换数值 +- `_calculate_main_fund_ratio(main_fund, total_fund)`: 计算主力资金占比 + +### 3. deepseek_client.py +修改了 `fund_flow_analysis` 方法: +- 新增 `fund_flow_data` 参数 +- 将问财数据整合到分析提示词中 +- 增强了资金面分析的维度和深度 + +分析维度包括: +1. 资金流向趋势分析 +2. 主力资金行为分析 +3. 成交量变化分析 +4. 资金面与技术面结合 +5. 市场情绪和资金偏好 +6. 资金面风险与机会 +7. 投资建议 + +### 4. ai_agents.py +修改了 `fund_flow_analyst_agent` 方法: +- 新增 `fund_flow_data` 参数 +- 在分析结果中保存资金流向数据 +- 添加数据来源提示信息 + +修改了 `run_multi_agent_analysis` 方法: +- 新增 `fund_flow_data` 参数 +- 将资金流向数据传递给资金面分析师 + +### 5. app.py +在 `run_stock_analysis` 函数中: +- 添加获取资金流向数据的步骤 +- 仅对A股股票获取问财数据 +- 显示数据获取状态提示 +- 将数据传递给AI分析系统 + +## 使用方法 + +### 安装依赖 + +```bash +pip install pywencai>=0.7.0 +``` + +或者重新安装所有依赖: + +```bash +pip install -r requirements.txt +``` + +### 运行系统 + +```bash +streamlit run app.py +``` + +### 分析A股股票 + +1. 在输入框中输入A股代码(如 `600519`、`000001`) +2. 点击"开始分析"按钮 +3. 系统会自动: + - 获取股票基本信息 + - 获取技术指标数据 + - 获取财务数据 + - **获取问财资金流向数据**(新增) + - 调用AI分析师团队进行分析 +4. 在"资金面分析师"标签页查看基于真实资金流向数据的分析报告 + +### 分析美股 + +- 美股暂不支持问财资金流向数据 +- 资金面分析师将基于技术指标进行分析 +- 系统会显示"ℹ️ 美股暂不支持问财资金流向数据"提示 + +## 数据解读 + +### 主力资金行为判断 + +资金面分析师会结合以下情况进行分析: + +1. **主力资金持续流入 + 股价上涨** + - 说明主力看好后市 + - 资金推动股价上涨 + - 是较强的买入信号 + +2. **主力资金流出 + 股价上涨** + - 需警惕散户接盘风险 + - 可能是主力出货 + - 上涨动力不足 + +3. **主力资金流入 + 股价下跌** + - 可能是主力在低位吸筹 + - 或是市场整体弱势 + - 需结合其他指标判断 + +4. **主力资金流出 + 股价下跌** + - 主力看空 + - 卖出压力大 + - 应回避或止损 + +### 主力资金占比 + +- **占比 > 70%**: 主力高度控盘 +- **占比 50-70%**: 主力参与度较高 +- **占比 30-50%**: 主力参与适中 +- **占比 < 30%**: 散户为主导 + +## 注意事项 + +1. **网络要求** + - pywencai 需要访问同花顺问财网站 + - 确保网络连接正常 + - 可能受到访问频率限制 + +2. **数据时效性** + - 资金流向数据为T-1数据(前一交易日) + - 非实时数据 + +3. **异常处理** + - 如果问财数据获取失败,系统会自动降级 + - 资金面分析师将基于技术指标进行分析 + - 不会影响其他分析师的正常工作 + +4. **仅支持A股** + - 问财数据仅支持中国A股 + - 美股、港股暂不支持 + +## 示例查询 + +问财使用的查询语句格式: +``` +{股票代码}近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅 +``` + +例如: +- `600519近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅` +- `000001近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅` + +## 效果展示 + +### 分析流程提示 +``` +📈 正在获取股票数据... +📊 正在获取财务数据... +💰 正在获取资金流向数据(问财)... +✅ 成功获取问财资金流向数据 +🤖 正在初始化AI分析系统... +🔍 AI分析师团队正在分析... +💰 资金面分析师正在分析中... + ✓ 已获取问财资金流向数据 +``` + +### 资金面分析报告示例 +资金面分析师将基于以下数据进行分析: + +``` +【问财资金流向数据(近20个交易日)】 +区间资金流向: +- 总资金流向:12345678900 元 +- 总资金流向(亿元):123.46 亿元 + +主力资金流向: +- 主力资金流向:9876543210 元 +- 主力资金流向(亿元):98.77 亿元 +- 主力资金占比:80.00% + +区间涨跌幅: +- 近20日涨跌幅:15.23% +``` + +## 故障排查 + +### 常见问题 + +#### 1. 提示 "'dict' object has no attribute 'empty'" + +**原因**:pywencai.get() 返回了字典而不是DataFrame + +**解决方案**:已在最新版本中修复,代码会自动检测返回类型并处理 + +#### 2. 提示 "问财查询返回None" + +**原因**: +- 网络连接问题 +- 问财服务暂时不可用 +- 查询语句不符合问财格式 + +**解决方案**: +- 检查网络连接 +- 稍后重试 +- 查看控制台输出的详细错误信息 + +#### 3. 提示 "未能获取问财资金流向数据" + +**原因**: +- 问财API访问限制 +- 股票代码不存在或停牌 +- 数据暂时不可用 + +**解决方案**: +- 系统会自动降级到技术指标分析 +- 不影响其他分析功能 +- 可以尝试其他股票代码 + +### 测试脚本 + +使用测试脚本快速验证功能: + +```bash +python test_fund_flow.py +``` + +测试脚本会: +1. 测试多只股票的资金流向数据获取 +2. 显示详细的调试信息 +3. 打印完整的返回数据 + +### 调试信息 + +运行时会输出以下调试信息: + +``` +正在使用问财查询资金流向数据: 002241近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅 +问财返回的数据类型: +问财返回DataFrame,形状: (1, 10) +问财返回的列名: ['股票代码', '股票简称', '区间资金流向', ...] +找到的列名 - 资金流向: 区间资金流向, 主力资金: 区间主力资金流向, 涨跌幅: 区间涨跌幅 +成功获取 002241 的资金流向数据 +``` + +### 版本兼容性 + +- **pywencai >= 0.7.0**:支持最新的问财API +- **pandas >= 2.0.3**:数据处理 +- **Python >= 3.8**:推荐使用Python 3.10+ + +## 技术支持 + +如遇到问题,可: + +1. **查看日志**:运行时会在控制台输出详细的调试信息 +2. **运行测试脚本**:使用 `test_fund_flow.py` 独立测试 +3. **检查依赖**:确保 pywencai 版本正确 +4. **网络检查**:确保可以访问同花顺问财 +5. **股票代码**:确认是6位数字的A股代码 + +## 未来优化方向 + +1. 支持更多时间周期的资金流向数据 +2. 增加资金流向的可视化图表 +3. 支持资金流向的历史趋势分析 +4. 尝试集成其他数据源(如东方财富) +5. 探索美股资金流向数据来源 + +## 更新日期 + +2025年10月6日 + +## 作者 + +AI股票分析系统开发团队 + diff --git a/资金流向功能说明_v2.md b/资金流向功能说明_v2.md new file mode 100644 index 0000000..0cbb561 --- /dev/null +++ b/资金流向功能说明_v2.md @@ -0,0 +1,316 @@ +# 资金流向功能说明 v2.0 + +## 🎯 设计理念(重大改进) + +### v2.0 的核心改变 + +**从"手动提取"到"AI智能分析"** + +- ❌ **旧方法**:代码硬编码提取特定字段(区间资金流向、主力资金流向等) +- ✅ **新方法**:将问财返回的**所有原始数据**直接喂给AI,让AI自己识别、提取和分析 + +### 为什么这样更好? + +1. **更简单**:不需要手动匹配列名,代码更简洁 +2. **更灵活**:问财字段变化时不需要修改代码 +3. **更智能**:AI可以发现我们没想到的数据关联 +4. **更全面**:不会遗漏任何有价值的数据 +5. **更强大**:AI能理解数据的深层含义和相互关系 + +## 📊 工作流程 + +``` +问财查询 → 获取所有原始数据 → 格式化为易读文本 → 喂给AI分析师 → 生成专业报告 +``` + +### 详细流程 + +1. **查询问财** + - 问句:`{股票代码}近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅` + - 返回:DataFrame 或 字典 + +2. **数据处理**(`stock_data.py`) + - 统一转换为 DataFrame + - 提取所有字段和数值 + - 大数字自动转换为亿元显示 + - 保存为易读的字典格式 + +3. **数据传递**(`ai_agents.py`) + - 将原始数据传递给资金面分析师 + - 不做任何过滤或筛选 + +4. **AI分析**(`deepseek_client.py`) + - AI收到所有问财数据 + - AI自己识别关键字段 + - AI自己提取数值 + - AI自己计算比例关系 + - AI基于实际数据生成分析报告 + +## 🔧 代码改动说明 + +### 1. stock_data.py - 简化数据获取 + +```python +def get_fund_flow_data(self, symbol): + """获取问财数据 - 返回所有原始数据""" + + # 查询问财 + result = pywencai.get(query=query, loop=True) + + # 转换为DataFrame + df_result = pd.DataFrame([result]) if isinstance(result, dict) else result + + # 提取所有数据 + raw_data_dict = {} + for col in df_result.columns: + value = data.get(col) + # 大数字转换为亿元便于阅读 + if abs(value) > 100000000: + raw_data_dict[col] = f"{value} ({value/100000000:.2f}亿元)" + else: + raw_data_dict[col] = value + + # 返回所有原始数据 + return { + "query_success": True, + "raw_data": raw_data_dict, + "columns": df_result.columns.tolist() + } +``` + +**关键点**: +- ✅ 不手动提取特定字段 +- ✅ 保留所有问财返回的数据 +- ✅ 只做格式化,不做数据筛选 + +### 2. deepseek_client.py - AI智能分析 + +```python +def fund_flow_analysis(self, stock_info, indicators, fund_flow_data): + """资金面分析 - 让AI自己分析所有数据""" + + # 构建包含所有原始数据的提示词 + raw_data = fund_flow_data.get('raw_data', {}) + + fund_flow_section = "\n【问财资金流向完整数据】\n" + for key, value in raw_data.items(): + fund_flow_section += f"- {key}: {value}\n" + + prompt = f""" + 你是资金面分析师。 + + 以下是问财返回的所有数据: + {fund_flow_section} + + 请你: + 1. 自己识别哪些是资金流向字段 + 2. 自己提取关键数值 + 3. 自己计算占比和关系 + 4. 基于实际数据进行分析 + + 给出专业的资金面分析报告。 + """ +``` + +**关键点**: +- ✅ 将所有数据都给AI +- ✅ 明确要求AI自己提取和分析 +- ✅ 强调基于实际数据而非假设 + +## 💡 使用示例 + +### 问财返回的数据示例 + +``` +【问财资金流向完整数据(近20个交易日)】 +数据来源:同花顺问财 +股票名称:歌尔股份 +股票代码:002241 + +- 近20个交易日区间资金流向[20240101]: 12345678900 (123.46亿元) +- 近20个交易日区间主力资金流向[20240101]: 9876543210 (98.77亿元) +- 近20个交易日区间涨跌幅[20240101]: 15.23 +- 近20个交易日区间大单净流入[20240101]: 5000000000 (50.00亿元) +- 近20个交易日区间中单净流入[20240101]: 2000000000 (20.00亿元) +- 近20个交易日区间小单净流入[20240101]: -3000000000 (-30.00亿元) +- 近20个交易日区间换手率[20240101]: 45.6 +...(所有其他字段) + +以上是问财返回的所有资金流向相关数据,请仔细分析这些数据的含义和相互关系。 +``` + +### AI分析师的工作 + +AI会自动: +1. 识别出"区间资金流向"、"主力资金流向"等关键字段 +2. 提取数值并注意单位(亿元) +3. 计算主力资金占比 = 98.77 / 123.46 = 80% +4. 分析大单、中单、小单的分布 +5. 结合涨跌幅判断资金效率 +6. 给出主力行为判断(吸筹/派发/洗盘等) + +## ✅ 优势总结 + +### 技术优势 + +1. **代码简洁** + - 数据获取逻辑从 ~200行 减少到 ~100行 + - 不需要维护字段映射表 + - 不需要处理列名变化 + +2. **容错性强** + - 问财字段名变化?没关系,AI会自己找 + - 新增字段?自动包含在分析中 + - 缺失字段?AI会注意到并说明 + +3. **扩展性好** + - 要分析更多维度?直接改查询语句 + - 要调整分析角度?修改AI提示词 + - 要支持新数据源?只需统一格式 + +### 分析优势 + +1. **更全面** + - 不会遗漏任何字段 + - AI能发现数据间的隐藏关联 + - 可以分析我们没想到的角度 + +2. **更智能** + - AI理解数据的业务含义 + - 自动识别异常值 + - 能做出逻辑推理 + +3. **更灵活** + - 不同股票可能有不同字段,AI都能处理 + - 可以根据实际数据调整分析重点 + - 能适应各种数据格式 + +## 🧪 测试方法 + +### 运行测试脚本 + +```bash +python test_fund_flow.py +``` + +### 预期输出 + +``` +正在使用问财查询资金流向数据: 002241近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅 +问财返回的数据类型: +问财返回字典,转换为DataFrame +成功转换,形状: (1, 25) +问财返回的列名: ['股票代码', '股票简称', '近20个交易日区间资金流向[20240101]', ...] +成功获取 002241 的问财数据,共 23 个字段 + +✅ 成功获取问财数据 + +【基本信息】 +股票简称: 歌尔股份 +股票代码: 002241 +数据字段数量: 23 个 + +【问财返回的所有字段】 + 1. 股票代码 + 2. 股票简称 + 3. 近20个交易日区间资金流向[20240101] + 4. 近20个交易日区间主力资金流向[20240101] + 5. 近20个交易日区间涨跌幅[20240101] + ... + +【问财原始数据】 + 近20个交易日区间资金流向[20240101]: 12345678900 (123.46亿元) + 近20个交易日区间主力资金流向[20240101]: 9876543210 (98.77亿元) + 近20个交易日区间涨跌幅[20240101]: 15.23 + ... +``` + +## 🎯 最佳实践 + +### 查询语句优化 + +可以根据需要调整问财查询语句,获取更多数据: + +```python +# 基础查询 +query = f"{symbol}近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅" + +# 扩展查询(获取更多维度) +query = f"{symbol}近20个交易日区间资金流向、区间主力资金流向、区间大单净流入、区间中单净流入、区间小单净流入、区间换手率、区间涨跌幅" +``` + +AI会自动分析所有返回的字段! + +### AI提示词优化 + +如果需要特别关注某些方面,可以在提示词中强调: + +```python +prompt = f""" +{fund_flow_section} + +请特别关注: +1. 主力资金的进出节奏 +2. 大单与中小单的博弈 +3. 资金流向与股价的背离情况 + +基于以上数据进行深度分析... +""" +``` + +## 🔄 版本对比 + +| 特性 | v1.0(手动提取) | v2.0(AI智能) | +|------|----------------|----------------| +| 代码行数 | ~200行 | ~100行 | +| 字段匹配 | 硬编码 | AI自动识别 | +| 列名变化 | 需修改代码 | 无需修改 | +| 新增字段 | 需添加代码 | 自动包含 | +| 分析深度 | 预定义 | AI自主判断 | +| 容错能力 | 弱 | 强 | +| 扩展性 | 差 | 好 | + +## 📝 注意事项 + +1. **数据质量依赖问财** + - 如果问财返回数据不完整,AI会指出缺失 + - 如果问财数据异常,AI会识别并说明 + +2. **AI理解能力** + - 使用 DeepSeek 等高质量模型效果更好 + - 提示词要明确,避免AI假设数据 + +3. **数据格式** + - 大数字自动转为亿元显示,便于AI理解 + - 保留原始数值供AI精确计算 + +## 🚀 未来优化方向 + +1. **多时间周期** + - 同时获取5日、10日、20日数据 + - AI分析资金流向的时间趋势 + +2. **数据对比** + - 与同行业股票对比 + - 与大盘资金流向对比 + +3. **可视化** + - 生成资金流向图表 + - AI基于图表进行分析 + +4. **实时监控** + - 定期查询资金流向 + - AI识别异常资金变化 + +## 更新日期 + +2025年10月6日 - v2.0 + +## 作者 + +AI股票分析系统开发团队 + +--- + +**结论**:v2.0 通过"让AI自己分析"的设计理念,实现了更简单、更智能、更强大的资金面分析功能!🎉 +