增强资金面mcp数据支撑

This commit is contained in:
oficcejo
2025-10-06 10:30:22 +08:00
parent 7a58400e9e
commit 64524f4e15
9 changed files with 907 additions and 320 deletions
-122
View File
@@ -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
-168
View File
@@ -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
---
**提示**:大多数问题都可以通过重新安装依赖或重启应用解决!
+14 -5
View File
@@ -39,18 +39,26 @@ class StockAnalysisAgents:
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S") "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("💰 资金面分析师正在分析中...") print("💰 资金面分析师正在分析中...")
# 如果有资金流向数据,显示数据来源
if fund_flow_data and fund_flow_data.get('query_success'):
print(" ✓ 已获取问财资金流向数据")
else:
print(" ⚠ 未获取到问财资金流向数据,将基于技术指标分析")
time.sleep(1) 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 { return {
"agent_name": "资金面分析师", "agent_name": "资金面分析师",
"agent_role": "负责资金流向分析、主力行为研究、市场情绪判断", "agent_role": "负责资金流向分析、主力行为研究、市场情绪判断",
"analysis": analysis, "analysis": analysis,
"focus_areas": ["资金流向", "主力动向", "市场情绪", "流动性"], "focus_areas": ["资金流向", "主力动向", "市场情绪", "流动性"],
"fund_flow_data": fund_flow_data, # 保存资金流向数据以供后续使用
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S") "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
} }
@@ -145,7 +153,8 @@ class StockAnalysisAgents:
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S") "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("🚀 启动多智能体股票分析系统...")
print("=" * 50) print("=" * 50)
@@ -159,8 +168,8 @@ class StockAnalysisAgents:
# 基本面分析 # 基本面分析
agents_results["fundamental"] = self.fundamental_analyst_agent(stock_info, financial_data) 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) agents_results["risk_management"] = self.risk_management_agent(stock_info, indicators)
+22 -5
View File
@@ -510,22 +510,39 @@ def run_stock_analysis(symbol, period):
financial_data = fetcher.get_financial_data(symbol) financial_data = fetcher.get_financial_data(symbol)
progress_bar.progress(35) 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分析系统...") status_text.text("🤖 正在初始化AI分析系统...")
# 使用选择的模型 # 使用选择的模型
selected_model = st.session_state.get('selected_model', 'deepseek-chat') selected_model = st.session_state.get('selected_model', 'deepseek-chat')
agents = StockAnalysisAgents(model=selected_model) agents = StockAnalysisAgents(model=selected_model)
progress_bar.progress(45) progress_bar.progress(45)
# 4. 运行多智能体分析 # 5. 运行多智能体分析(传入资金流向数据)
status_text.text("🔍 AI分析师团队正在分析...") 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) progress_bar.progress(70)
# 显示各分析师报告 # 显示各分析师报告
display_agents_analysis(agents_results) display_agents_analysis(agents_results)
# 5. 团队讨论 # 6. 团队讨论
status_text.text("🤝 分析团队正在讨论...") status_text.text("🤝 分析团队正在讨论...")
discussion_result = agents.conduct_team_discussion(agents_results, stock_info) discussion_result = agents.conduct_team_discussion(agents_results, stock_info)
progress_bar.progress(85) progress_bar.progress(85)
@@ -533,7 +550,7 @@ def run_stock_analysis(symbol, period):
# 显示团队讨论 # 显示团队讨论
display_team_discussion(discussion_result) display_team_discussion(discussion_result)
# 6. 最终决策 # 7. 最终决策
status_text.text("📋 正在制定最终投资决策...") status_text.text("📋 正在制定最终投资决策...")
final_decision = agents.make_final_decision(discussion_result, stock_info, indicators) final_decision = agents.make_final_decision(discussion_result, stock_info, indicators)
progress_bar.progress(100) progress_bar.progress(100)
+90 -19
View File
@@ -206,39 +206,110 @@ class DeepSeekClient:
return self.call_api(messages) 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""" prompt = f"""
你是一名资深的资金面分析师。请基于以下信息进行专业的资金面分析: 你是一名资深的资金面分析师,擅长从资金流向数据中洞察主力行为和市场趋势。
股票信息 【基本信息
- 股票代码:{stock_info.get('symbol', 'N/A')} 股票代码:{stock_info.get('symbol', 'N/A')}
- 股票名称:{stock_info.get('name', 'N/A')} 股票名称:{stock_info.get('name', 'N/A')}
- 当前价格:{stock_info.get('current_price', 'N/A')} 当前价格:{stock_info.get('current_price', 'N/A')}
- 市值:{stock_info.get('market_cap', 'N/A')} 市值:{stock_info.get('market_cap', 'N/A')}
资金相关指标 【技术指标
- 量比:{indicators.get('volume_ratio', 'N/A')} - 量比:{indicators.get('volume_ratio', 'N/A')}
- 当前成交量与5日均量比:{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 = [ messages = [
{"role": "system", "content": "你是一名经验丰富的资金面分析师,擅长市场资金流向和主力行为分析。"}, {"role": "system", "content": "你是一名经验丰富的资金面分析师,擅长市场资金流向和主力行为分析,能够深入解读资金数据背后的投资逻辑"},
{"role": "user", "content": prompt} {"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, def comprehensive_discussion(self, technical_report: str, fundamental_report: str,
fund_flow_report: str, stock_info: Dict) -> str: fund_flow_report: str, stock_info: Dict) -> str:
+1
View File
@@ -12,3 +12,4 @@ ta>=0.10.2
reportlab>=4.0.0 reportlab>=4.0.0
peewee>=3.17.0 peewee>=3.17.0
schedule>=1.2.0 schedule>=1.2.0
pywencai>=0.7.0
+161
View File
@@ -6,6 +6,7 @@ import ta
from datetime import datetime, timedelta from datetime import datetime, timedelta
import requests import requests
import json import json
import pywencai
class StockDataFetcher: class StockDataFetcher:
"""股票数据获取类""" """股票数据获取类"""
@@ -545,3 +546,163 @@ class StockDataFetcher:
except Exception as e: except Exception as e:
print(f"获取美股财务数据失败: {e}") print(f"获取美股财务数据失败: {e}")
return financial_data 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'
+302
View File
@@ -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个交易日区间资金流向、区间主力资金流向、区间涨跌幅
问财返回的数据类型: <class 'dict'> 或 <class 'pandas.DataFrame'>
问财返回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股票分析系统开发团队
+316
View File
@@ -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个交易日区间资金流向、区间主力资金流向、区间涨跌幅
问财返回的数据类型: <class 'dict'>
问财返回字典,转换为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.0AI智能) |
|------|----------------|----------------|
| 代码行数 | ~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自己分析"的设计理念,实现了更简单、更智能、更强大的资金面分析功能!🎉