增加arbr计算,增强情绪分析师mcp
This commit is contained in:
+202
@@ -0,0 +1,202 @@
|
|||||||
|
# ARBR市场情绪功能 - 快速开始 🚀
|
||||||
|
|
||||||
|
## 🎯 功能简介
|
||||||
|
|
||||||
|
系统现已集成ARBR等市场情绪指标,为市场情绪分析提供实际数据支撑!
|
||||||
|
|
||||||
|
**ARBR指标:**
|
||||||
|
- **AR(人气指标)**:反映市场买卖人气
|
||||||
|
- **BR(意愿指标)**:反映买卖意愿强度
|
||||||
|
|
||||||
|
**其他情绪数据:**
|
||||||
|
- 换手率、涨跌停统计、大盘情绪、融资融券、恐慌贪婪指数
|
||||||
|
|
||||||
|
## 🚀 3步快速开始
|
||||||
|
|
||||||
|
### 步骤1:启动应用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入项目目录
|
||||||
|
cd d:\web\agentsstock1
|
||||||
|
|
||||||
|
# 激活虚拟环境
|
||||||
|
.\venv\Scripts\Activate.ps1
|
||||||
|
|
||||||
|
# 启动应用
|
||||||
|
streamlit run app.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤2:输入股票代码
|
||||||
|
|
||||||
|
在应用界面中:
|
||||||
|
1. 输入A股代码(如:`000001`)
|
||||||
|
2. 点击"🚀 开始分析"
|
||||||
|
|
||||||
|
### 步骤3:查看分析结果
|
||||||
|
|
||||||
|
系统会自动:
|
||||||
|
1. ✅ 获取市场情绪数据(ARBR等)
|
||||||
|
2. ✅ 传递给市场情绪分析师
|
||||||
|
3. ✅ 生成有数据支撑的专业分析
|
||||||
|
|
||||||
|
## 📊 ARBR指标说明
|
||||||
|
|
||||||
|
### AR指标(人气指标)
|
||||||
|
|
||||||
|
| AR值范围 | 市场状态 | 操作建议 |
|
||||||
|
|---------|---------|---------|
|
||||||
|
| > 180 | 极度超买 | ⚠️ 警惕回调 |
|
||||||
|
| 150-180 | 超买 | 🔴 考虑减仓 |
|
||||||
|
| 70-150 | 正常 | ✅ 正常持有 |
|
||||||
|
| 40-70 | 超卖 | 🟡 关注机会 |
|
||||||
|
| < 40 | 极度超卖 | 🟢 可能机会 |
|
||||||
|
|
||||||
|
### BR指标(意愿指标)
|
||||||
|
|
||||||
|
| BR值范围 | 市场状态 | 操作建议 |
|
||||||
|
|---------|---------|---------|
|
||||||
|
| > 400 | 极度超买 | ⚠️ 泡沫风险 |
|
||||||
|
| 300-400 | 超买 | 🔴 谨慎追高 |
|
||||||
|
| 50-300 | 正常 | ✅ 正常交易 |
|
||||||
|
| 30-50 | 超卖 | 🟡 低迷企稳 |
|
||||||
|
| < 30 | 极度超卖 | 🟢 冰点触底 |
|
||||||
|
|
||||||
|
## 💡 使用技巧
|
||||||
|
|
||||||
|
### 技巧1:结合使用AR和BR
|
||||||
|
|
||||||
|
```
|
||||||
|
AR > 100 且 BR > 100 → 多头力量强(警惕过热)
|
||||||
|
AR < 100 且 BR < 100 → 空头力量强(市场偏空)
|
||||||
|
AR > BR → 人气好于意愿(基础稳定)
|
||||||
|
BR > AR → 意愿强于人气(投机性强)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 技巧2:关注极端值
|
||||||
|
|
||||||
|
```
|
||||||
|
AR < 70 且 BR < 50 → 强烈买入信号(超卖)
|
||||||
|
AR > 150 且 BR > 300 → 强烈卖出信号(超买)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 技巧3:参考历史统计
|
||||||
|
|
||||||
|
查看"ARBR统计数据"中的:
|
||||||
|
- 历史均值:判断当前位置
|
||||||
|
- 买入/卖出信号比例:了解历史模式
|
||||||
|
|
||||||
|
## 📝 输出示例
|
||||||
|
|
||||||
|
```
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- 计算周期:26日
|
||||||
|
- AR值:59.62(人气指标)
|
||||||
|
- BR值:49.28(意愿指标)
|
||||||
|
- 信号:强烈买入信号 ✅
|
||||||
|
- 解读:
|
||||||
|
* AR超卖(<70),市场情绪低迷,可关注反弹机会
|
||||||
|
* BR超卖(<50),投机情绪低迷,关注企稳信号
|
||||||
|
|
||||||
|
【市场情绪分析师专业分析】
|
||||||
|
基于以上ARBR数据,市场情绪分析师会进行深度分析...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 测试市场情绪模块
|
||||||
|
|
||||||
|
想单独测试ARBR计算?运行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python market_sentiment_data.py
|
||||||
|
```
|
||||||
|
|
||||||
|
输出示例:
|
||||||
|
```
|
||||||
|
测试市场情绪数据获取...
|
||||||
|
正在获取 000001 的市场情绪数据...
|
||||||
|
📊 正在计算ARBR情绪指标...
|
||||||
|
📊 正在获取换手率数据...
|
||||||
|
✅ 市场情绪数据获取完成
|
||||||
|
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- AR值:59.62
|
||||||
|
- BR值:49.28
|
||||||
|
- 信号:强烈买入信号
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ 自定义设置
|
||||||
|
|
||||||
|
### 修改ARBR计算周期
|
||||||
|
|
||||||
|
编辑 `market_sentiment_data.py`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class MarketSentimentDataFetcher:
|
||||||
|
def __init__(self):
|
||||||
|
self.arbr_period = 26 # 改为你想要的周期,如:20
|
||||||
|
```
|
||||||
|
|
||||||
|
常用周期:
|
||||||
|
- 短期:14-20天
|
||||||
|
- 中期:26天(默认)
|
||||||
|
- 长期:50-60天
|
||||||
|
|
||||||
|
## 📚 完整文档
|
||||||
|
|
||||||
|
更多详细信息,请查看:
|
||||||
|
|
||||||
|
- 📖 **市场情绪分析使用说明.md** - 完整功能说明
|
||||||
|
- 📋 **市场情绪模块更新日志.md** - 技术细节
|
||||||
|
- ✅ **ARBR市场情绪集成完成说明.md** - 完成总结
|
||||||
|
|
||||||
|
## ❓ 常见问题
|
||||||
|
|
||||||
|
### Q: 为什么有些数据显示N/A?
|
||||||
|
A: 可能是网络问题或数据源限制,系统会自动处理,不影响整体分析。
|
||||||
|
|
||||||
|
### Q: 美股支持ARBR吗?
|
||||||
|
A: 目前仅支持A股(6位代码),美股支持正在计划中。
|
||||||
|
|
||||||
|
### Q: ARBR信号可以直接作为买卖依据吗?
|
||||||
|
A: ❌ 不可以!ARBR仅供参考,应结合其他指标和基本面综合判断。
|
||||||
|
|
||||||
|
### Q: 数据更新频率如何?
|
||||||
|
A: 大部分为实时数据,部分(如融资融券)为T+1数据。
|
||||||
|
|
||||||
|
## ⚠️ 重要提示
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ 投资有风险,决策需谨慎
|
||||||
|
⚠️ ARBR等指标仅供参考,不构成投资建议
|
||||||
|
⚠️ 极端情绪往往是反转信号
|
||||||
|
⚠️ 请结合多方面因素综合判断
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 快速命令清单
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动应用
|
||||||
|
streamlit run app.py
|
||||||
|
|
||||||
|
# 测试市场情绪模块
|
||||||
|
python market_sentiment_data.py
|
||||||
|
|
||||||
|
# 检查语法错误
|
||||||
|
python -m py_compile market_sentiment_data.py
|
||||||
|
|
||||||
|
# 查看应用运行状态
|
||||||
|
# 浏览器访问:http://localhost:8501
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📞 需要帮助?
|
||||||
|
|
||||||
|
查看详细文档或检查错误日志了解更多信息。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**版本:** v1.0
|
||||||
|
**更新:** 2025年10月7日
|
||||||
|
**状态:** ✅ 功能完整,测试通过
|
||||||
|
|
||||||
|
Happy Trading! 📈🎯
|
||||||
|
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
# ARBR市场情绪数据集成完成 ✅
|
||||||
|
|
||||||
|
## 📋 任务概述
|
||||||
|
|
||||||
|
根据您的需求,已成功使用akshare获取市场情绪相关数据(包括ARBR指标),并将这些数据提供给市场情绪分析师进行分析,使情绪分析有实际数据支撑。
|
||||||
|
|
||||||
|
## ✨ 已完成的工作
|
||||||
|
|
||||||
|
### 1. 创建市场情绪数据模块 ✅
|
||||||
|
|
||||||
|
**文件:** `market_sentiment_data.py`
|
||||||
|
|
||||||
|
**功能包括:**
|
||||||
|
- ✅ **ARBR指标计算**
|
||||||
|
- AR值(人气指标):反映市场买卖人气
|
||||||
|
- BR值(意愿指标):反映买卖意愿强度
|
||||||
|
- 自动判断超买超卖(AR>150超买,<70超卖;BR>300超买,<50超卖)
|
||||||
|
- 生成交易信号(买入/卖出/中性)
|
||||||
|
- 提供历史统计数据
|
||||||
|
|
||||||
|
- ✅ **换手率数据**:反映交易活跃程度
|
||||||
|
|
||||||
|
- ✅ **大盘情绪指数**
|
||||||
|
- 上证指数涨跌幅
|
||||||
|
- 市场涨跌家数统计
|
||||||
|
- 市场情绪得分
|
||||||
|
|
||||||
|
- ✅ **涨跌停统计**
|
||||||
|
- 当日涨停股数量
|
||||||
|
- 当日跌停股数量
|
||||||
|
- 市场热度评估
|
||||||
|
|
||||||
|
- ✅ **融资融券数据**:反映看多看空情绪
|
||||||
|
|
||||||
|
- ✅ **市场恐慌贪婪指数**:综合多指标的情绪评分(0-100)
|
||||||
|
|
||||||
|
### 2. 增强市场情绪分析师 ✅
|
||||||
|
|
||||||
|
**修改文件:** `ai_agents.py`
|
||||||
|
|
||||||
|
**更新内容:**
|
||||||
|
- ✅ `market_sentiment_agent` 现在接收实际的市场情绪数据
|
||||||
|
- ✅ 基于ARBR等真实指标进行深度分析
|
||||||
|
- ✅ 新增分析维度:
|
||||||
|
- ARBR情绪指标详细解读
|
||||||
|
- 个股活跃度分析(换手率)
|
||||||
|
- 整体市场情绪评估
|
||||||
|
- 资金情绪判断
|
||||||
|
- 情绪对股价的影响分析
|
||||||
|
|
||||||
|
### 3. 集成到主应用 ✅
|
||||||
|
|
||||||
|
**修改文件:** `app.py`
|
||||||
|
|
||||||
|
**更新内容:**
|
||||||
|
- ✅ 在分析流程中新增"市场情绪数据获取"步骤
|
||||||
|
- ✅ 自动为A股获取市场情绪数据
|
||||||
|
- ✅ 将数据传递给市场情绪分析师
|
||||||
|
- ✅ UI提示优化(显示数据获取状态)
|
||||||
|
- ✅ 更新帮助信息
|
||||||
|
|
||||||
|
### 4. 创建使用文档 ✅
|
||||||
|
|
||||||
|
- ✅ `市场情绪分析使用说明.md` - 详细使用指南
|
||||||
|
- ✅ `市场情绪模块更新日志.md` - 技术更新说明
|
||||||
|
- ✅ 本文档 - 完成总结
|
||||||
|
|
||||||
|
## 📊 实际效果演示
|
||||||
|
|
||||||
|
### ARBR指标示例
|
||||||
|
|
||||||
|
```
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- 计算周期:26日
|
||||||
|
- AR值:59.62(人气指标)
|
||||||
|
- BR值:49.28(意愿指标)
|
||||||
|
- 信号:强烈买入信号
|
||||||
|
- 解读:
|
||||||
|
* AR超卖(<70),市场情绪低迷,可关注反弹机会
|
||||||
|
* BR超卖(<50),投机情绪低迷,关注企稳信号
|
||||||
|
* 空头力量占优(AR<100且BR<100),市场情绪偏空
|
||||||
|
* 人气指标强于意愿指标(AR>BR),市场基础较好
|
||||||
|
|
||||||
|
ARBR统计数据:
|
||||||
|
- AR历史均值:128.64
|
||||||
|
- BR历史均值:124.00
|
||||||
|
- 历史买入信号比例:8.0%
|
||||||
|
- 历史卖出信号比例:45.3%
|
||||||
|
```
|
||||||
|
|
||||||
|
### 市场情绪分析师输出
|
||||||
|
|
||||||
|
现在市场情绪分析师会基于以上真实数据进行分析,包括:
|
||||||
|
|
||||||
|
1. **ARBR指标解读**
|
||||||
|
- 当前AR、BR值的含义
|
||||||
|
- 与历史均值对比
|
||||||
|
- 超买超卖判断
|
||||||
|
- 交易信号建议
|
||||||
|
|
||||||
|
2. **个股活跃度**
|
||||||
|
- 换手率分析
|
||||||
|
- 资金关注度
|
||||||
|
|
||||||
|
3. **整体市场情绪**
|
||||||
|
- 大盘走势影响
|
||||||
|
- 涨跌家数分布
|
||||||
|
- 涨跌停统计
|
||||||
|
|
||||||
|
4. **资金情绪**
|
||||||
|
- 融资融券数据
|
||||||
|
- 看多看空力量对比
|
||||||
|
|
||||||
|
5. **投资建议**
|
||||||
|
- 基于情绪的操作建议
|
||||||
|
- 风险提示
|
||||||
|
|
||||||
|
## 🚀 如何使用
|
||||||
|
|
||||||
|
### 方式1:在主应用中自动使用
|
||||||
|
|
||||||
|
1. 启动应用:`streamlit run app.py`
|
||||||
|
2. 输入A股代码(如:000001)
|
||||||
|
3. 点击"开始分析"
|
||||||
|
4. 系统会自动:
|
||||||
|
- 获取市场情绪数据(包括ARBR)
|
||||||
|
- 传递给市场情绪分析师
|
||||||
|
- 生成基于实际数据的专业分析
|
||||||
|
|
||||||
|
### 方式2:单独测试市场情绪模块
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 激活虚拟环境
|
||||||
|
.\venv\Scripts\Activate.ps1
|
||||||
|
|
||||||
|
# 运行测试
|
||||||
|
python market_sentiment_data.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式3:在代码中使用
|
||||||
|
|
||||||
|
```python
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
|
||||||
|
# 创建获取器
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
|
||||||
|
# 获取市场情绪数据
|
||||||
|
sentiment_data = fetcher.get_market_sentiment_data("000001")
|
||||||
|
|
||||||
|
# 查看ARBR数据
|
||||||
|
if sentiment_data.get("data_success"):
|
||||||
|
arbr = sentiment_data["arbr_data"]
|
||||||
|
print(f"AR: {arbr['latest_ar']:.2f}")
|
||||||
|
print(f"BR: {arbr['latest_br']:.2f}")
|
||||||
|
print(f"信号: {arbr['signals']['overall_signal']}")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 分析流程对比
|
||||||
|
|
||||||
|
### 之前:
|
||||||
|
```
|
||||||
|
市场情绪分析师 → 仅基于股票基本信息 → 泛泛的情绪分析
|
||||||
|
```
|
||||||
|
|
||||||
|
### 现在:
|
||||||
|
```
|
||||||
|
获取ARBR等市场情绪数据
|
||||||
|
↓
|
||||||
|
【实际数据】
|
||||||
|
- AR: 59.62 (超卖)
|
||||||
|
- BR: 49.28 (超卖)
|
||||||
|
- 换手率: 0.43% (清淡)
|
||||||
|
- 涨停: 52只, 跌停: 1只
|
||||||
|
- 市场情绪: 火热
|
||||||
|
↓
|
||||||
|
市场情绪分析师深度分析
|
||||||
|
↓
|
||||||
|
有数据支撑的专业分析报告
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 核心改进
|
||||||
|
|
||||||
|
1. **数据驱动**:从"猜测"变为"数据分析"
|
||||||
|
2. **指标丰富**:ARBR + 换手率 + 涨跌停 + 融资融券等
|
||||||
|
3. **信号明确**:自动生成买入/卖出/中性信号
|
||||||
|
4. **历史对比**:提供历史统计数据作为参考
|
||||||
|
5. **综合评估**:多维度市场情绪综合判断
|
||||||
|
|
||||||
|
## 📁 修改的文件列表
|
||||||
|
|
||||||
|
### 新增文件
|
||||||
|
- `market_sentiment_data.py` - 市场情绪数据模块(核心)
|
||||||
|
- `市场情绪分析使用说明.md` - 使用文档
|
||||||
|
- `市场情绪模块更新日志.md` - 更新日志
|
||||||
|
- `ARBR市场情绪集成完成说明.md` - 本文档
|
||||||
|
|
||||||
|
### 修改的文件
|
||||||
|
- `ai_agents.py` - 增强市场情绪分析师
|
||||||
|
- `app.py` - 集成市场情绪数据获取流程
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
|
1. **仅支持A股**:当前市场情绪数据功能仅支持中国A股(6位代码)
|
||||||
|
2. **网络依赖**:需要稳定网络连接访问akshare数据源
|
||||||
|
3. **数据时效**:部分数据可能有延迟(如融资融券为T+1数据)
|
||||||
|
4. **投资建议**:市场情绪指标仅供参考,不构成投资建议
|
||||||
|
|
||||||
|
## ✅ 测试验证
|
||||||
|
|
||||||
|
已通过测试:
|
||||||
|
- ✅ ARBR指标计算准确
|
||||||
|
- ✅ 换手率数据正常
|
||||||
|
- ✅ 大盘情绪获取正常
|
||||||
|
- ✅ 涨跌停统计正常
|
||||||
|
- ✅ 市场恐慌指数计算正常
|
||||||
|
- ✅ 集成到AI分析流程正常
|
||||||
|
- ✅ 数据格式化正常
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
详细文档请查看:
|
||||||
|
- `市场情绪分析使用说明.md` - 完整功能说明和使用指南
|
||||||
|
- `市场情绪模块更新日志.md` - 技术细节和更新记录
|
||||||
|
|
||||||
|
## 🎉 总结
|
||||||
|
|
||||||
|
✅ **任务完成**!现在系统已经能够:
|
||||||
|
|
||||||
|
1. 使用akshare获取包括ARBR在内的多项市场情绪数据
|
||||||
|
2. 自动计算和解读ARBR指标
|
||||||
|
3. 获取换手率、涨跌停、大盘情绪等补充数据
|
||||||
|
4. 将这些实际数据提供给市场情绪分析师
|
||||||
|
5. 生成有数据支撑的专业情绪分析报告
|
||||||
|
|
||||||
|
市场情绪分析现在有了实际数据支撑,分析结果将更加准确和专业!🎯
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**完成日期:** 2025年10月7日
|
||||||
|
**功能状态:** ✅ 已完成并测试通过
|
||||||
|
|
||||||
+65
-18
@@ -111,50 +111,97 @@ class StockAnalysisAgents:
|
|||||||
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
|
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
}
|
}
|
||||||
|
|
||||||
def market_sentiment_agent(self, stock_info: Dict) -> Dict[str, Any]:
|
def market_sentiment_agent(self, stock_info: Dict, sentiment_data: Dict = None) -> Dict[str, Any]:
|
||||||
"""市场情绪分析智能体"""
|
"""市场情绪分析智能体"""
|
||||||
print("📈 市场情绪分析师正在分析中...")
|
print("📈 市场情绪分析师正在分析中...")
|
||||||
|
|
||||||
|
# 如果有市场情绪数据,显示数据来源
|
||||||
|
if sentiment_data and sentiment_data.get('data_success'):
|
||||||
|
print(" ✓ 已获取市场情绪数据(ARBR、换手率、涨跌停等)")
|
||||||
|
else:
|
||||||
|
print(" ⚠ 未获取到详细情绪数据,将基于基本信息分析")
|
||||||
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
# 构建带有市场情绪数据的prompt
|
||||||
|
sentiment_data_text = ""
|
||||||
|
if sentiment_data and sentiment_data.get('data_success'):
|
||||||
|
# 使用格式化的市场情绪数据
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
sentiment_data_text = f"""
|
||||||
|
|
||||||
|
【市场情绪实际数据】
|
||||||
|
{fetcher.format_sentiment_data_for_ai(sentiment_data)}
|
||||||
|
|
||||||
|
以上是通过akshare获取的实际市场情绪数据,请重点基于这些数据进行分析。
|
||||||
|
"""
|
||||||
|
|
||||||
sentiment_prompt = f"""
|
sentiment_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('sector', 'N/A')}
|
- 行业:{stock_info.get('sector', 'N/A')}
|
||||||
- 细分行业:{stock_info.get('industry', 'N/A')}
|
- 细分行业:{stock_info.get('industry', 'N/A')}
|
||||||
|
{sentiment_data_text}
|
||||||
|
|
||||||
请从以下角度分析市场情绪:
|
请从以下角度进行深度分析:
|
||||||
1. 整体市场情绪(牛市/熊市/震荡市)
|
|
||||||
2. 行业板块情绪和热度
|
|
||||||
3. 个股关注度和讨论热度
|
|
||||||
4. 投资者情绪指标
|
|
||||||
5. 市场预期和共识
|
|
||||||
6. 消息面和事件驱动因素
|
|
||||||
7. 情绪对股价的影响评估
|
|
||||||
8. 情绪反转的可能性
|
|
||||||
|
|
||||||
结合当前宏观环境和市场热点,给出专业的市场情绪分析。
|
1. **ARBR情绪指标分析**
|
||||||
|
- 详细解读AR和BR数值的含义
|
||||||
|
- 分析当前市场人气和投机意愿
|
||||||
|
- 判断是否存在超买超卖情况
|
||||||
|
- 基于ARBR历史统计数据评估当前位置
|
||||||
|
|
||||||
|
2. **个股活跃度分析**
|
||||||
|
- 换手率反映的资金活跃程度
|
||||||
|
- 个股关注度和讨论热度
|
||||||
|
- 与历史水平对比
|
||||||
|
|
||||||
|
3. **整体市场情绪**
|
||||||
|
- 大盘涨跌情况对个股的影响
|
||||||
|
- 市场涨跌家数反映的整体情绪
|
||||||
|
- 涨跌停数量反映的市场热度
|
||||||
|
- 恐慌贪婪指数的启示
|
||||||
|
|
||||||
|
4. **资金情绪**
|
||||||
|
- 融资融券数据反映的看多看空情绪
|
||||||
|
- 主力资金动向
|
||||||
|
- 市场流动性状况
|
||||||
|
|
||||||
|
5. **情绪对股价影响**
|
||||||
|
- 当前情绪对股价的支撑或压制作用
|
||||||
|
- 情绪反转的可能性和信号
|
||||||
|
- 短期情绪波动风险
|
||||||
|
|
||||||
|
6. **投资建议**
|
||||||
|
- 基于市场情绪的操作建议
|
||||||
|
- 情绪面的机会和风险提示
|
||||||
|
|
||||||
|
请确保分析基于实际数据,给出客观专业的市场情绪评估。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
messages = [
|
messages = [
|
||||||
{"role": "system", "content": "你是一名专业的市场情绪分析师,擅长解读市场心理和投资者行为。"},
|
{"role": "system", "content": "你是一名专业的市场情绪分析师,擅长解读市场心理和投资者行为,善于利用ARBR等情绪指标进行分析。"},
|
||||||
{"role": "user", "content": sentiment_prompt}
|
{"role": "user", "content": sentiment_prompt}
|
||||||
]
|
]
|
||||||
|
|
||||||
analysis = self.deepseek_client.call_api(messages)
|
analysis = self.deepseek_client.call_api(messages, max_tokens=4000)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"agent_name": "市场情绪分析师",
|
"agent_name": "市场情绪分析师",
|
||||||
"agent_role": "负责市场情绪研究、投资者心理分析、热点追踪",
|
"agent_role": "负责市场情绪研究、投资者心理分析、热点追踪",
|
||||||
"analysis": analysis,
|
"analysis": analysis,
|
||||||
"focus_areas": ["市场情绪", "投资者心理", "热点板块", "消息面"],
|
"focus_areas": ["ARBR指标", "市场情绪", "投资者心理", "资金活跃度", "恐慌贪婪指数"],
|
||||||
|
"sentiment_data": sentiment_data, # 保存市场情绪数据以供后续使用
|
||||||
"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,
|
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]:
|
financial_data: Dict = None, fund_flow_data: Dict = None,
|
||||||
|
sentiment_data: Dict = None) -> Dict[str, Any]:
|
||||||
"""运行多智能体分析"""
|
"""运行多智能体分析"""
|
||||||
print("🚀 启动多智能体股票分析系统...")
|
print("🚀 启动多智能体股票分析系统...")
|
||||||
print("=" * 50)
|
print("=" * 50)
|
||||||
@@ -174,8 +221,8 @@ class StockAnalysisAgents:
|
|||||||
# 风险管理分析
|
# 风险管理分析
|
||||||
agents_results["risk_management"] = self.risk_management_agent(stock_info, indicators)
|
agents_results["risk_management"] = self.risk_management_agent(stock_info, indicators)
|
||||||
|
|
||||||
# 市场情绪分析
|
# 市场情绪分析(传入市场情绪数据)
|
||||||
agents_results["market_sentiment"] = self.market_sentiment_agent(stock_info)
|
agents_results["market_sentiment"] = self.market_sentiment_agent(stock_info, sentiment_data)
|
||||||
|
|
||||||
print("✅ 所有分析师完成分析")
|
print("✅ 所有分析师完成分析")
|
||||||
print("=" * 50)
|
print("=" * 50)
|
||||||
|
|||||||
@@ -379,8 +379,8 @@ def main():
|
|||||||
**AI分析流程**
|
**AI分析流程**
|
||||||
1. 数据获取 → 2. 技术分析
|
1. 数据获取 → 2. 技术分析
|
||||||
3. 基本面分析 → 4. 资金分析
|
3. 基本面分析 → 4. 资金分析
|
||||||
5. 风险评估 → 6. 情绪分析
|
5. 情绪数据(ARBR) → 6. 风险评估
|
||||||
7. 团队讨论 → 8. 最终决策
|
7. 情绪分析 → 8. 团队讨论 → 9. 决策
|
||||||
""")
|
""")
|
||||||
|
|
||||||
# 检查是否显示历史记录
|
# 检查是否显示历史记录
|
||||||
@@ -528,36 +528,55 @@ def run_stock_analysis(symbol, period):
|
|||||||
# 3. 获取资金流向数据(仅A股)
|
# 3. 获取资金流向数据(仅A股)
|
||||||
fund_flow_data = None
|
fund_flow_data = None
|
||||||
if fetcher._is_chinese_stock(symbol):
|
if fetcher._is_chinese_stock(symbol):
|
||||||
status_text.text("💰 正在获取资金流向数据(问财)...")
|
status_text.text("💰 正在获取资金流向数据(主力)...")
|
||||||
try:
|
try:
|
||||||
fund_flow_data = fetcher.get_fund_flow_data(symbol)
|
fund_flow_data = fetcher.get_fund_flow_data(symbol)
|
||||||
if fund_flow_data and fund_flow_data.get('query_success'):
|
if fund_flow_data and fund_flow_data.get('query_success'):
|
||||||
st.info("✅ 成功获取问财资金流向数据")
|
st.info("✅ 成功获取主力资金流向数据")
|
||||||
else:
|
else:
|
||||||
st.warning("⚠️ 未能获取问财资金流向数据,将基于技术指标进行资金面分析")
|
st.warning("⚠️ 未能获取主力资金流向数据,将基于技术指标进行资金面分析")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
st.warning(f"⚠️ 获取资金流向数据时出错: {str(e)}")
|
st.warning(f"⚠️ 获取资金流向数据时出错: {str(e)}")
|
||||||
fund_flow_data = None
|
fund_flow_data = None
|
||||||
else:
|
else:
|
||||||
st.info("ℹ️ 美股暂不支持问财资金流向数据")
|
st.info("ℹ️ 美股暂不支持资金流向数据")
|
||||||
progress_bar.progress(40)
|
progress_bar.progress(40)
|
||||||
|
|
||||||
# 4. 初始化AI分析系统
|
# 4. 获取市场情绪数据(仅A股)
|
||||||
|
sentiment_data = None
|
||||||
|
if fetcher._is_chinese_stock(symbol):
|
||||||
|
status_text.text("📊 正在获取市场情绪数据(ARBR等指标)...")
|
||||||
|
try:
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
sentiment_fetcher = MarketSentimentDataFetcher()
|
||||||
|
sentiment_data = sentiment_fetcher.get_market_sentiment_data(symbol, stock_data)
|
||||||
|
if sentiment_data and sentiment_data.get('data_success'):
|
||||||
|
st.info("✅ 成功获取市场情绪数据(ARBR、换手率、涨跌停等)")
|
||||||
|
else:
|
||||||
|
st.warning("⚠️ 未能获取完整的市场情绪数据,将基于基本信息进行分析")
|
||||||
|
except Exception as e:
|
||||||
|
st.warning(f"⚠️ 获取市场情绪数据时出错: {str(e)}")
|
||||||
|
sentiment_data = None
|
||||||
|
else:
|
||||||
|
st.info("ℹ️ 美股暂不支持市场情绪数据(ARBR等指标)")
|
||||||
|
progress_bar.progress(45)
|
||||||
|
|
||||||
|
# 5. 初始化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(50)
|
||||||
|
|
||||||
# 5. 运行多智能体分析(传入资金流向数据)
|
# 6. 运行多智能体分析(传入资金流向数据和市场情绪数据)
|
||||||
status_text.text("🔍 AI分析师团队正在分析...")
|
status_text.text("🔍 AI分析师团队正在分析...")
|
||||||
agents_results = agents.run_multi_agent_analysis(stock_info, stock_data, indicators, financial_data, fund_flow_data)
|
agents_results = agents.run_multi_agent_analysis(stock_info, stock_data, indicators, financial_data, fund_flow_data, sentiment_data)
|
||||||
progress_bar.progress(70)
|
progress_bar.progress(70)
|
||||||
|
|
||||||
# 显示各分析师报告
|
# 显示各分析师报告
|
||||||
display_agents_analysis(agents_results)
|
display_agents_analysis(agents_results)
|
||||||
|
|
||||||
# 6. 团队讨论
|
# 7. 团队讨论
|
||||||
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)
|
||||||
@@ -565,7 +584,7 @@ def run_stock_analysis(symbol, period):
|
|||||||
# 显示团队讨论
|
# 显示团队讨论
|
||||||
display_team_discussion(discussion_result)
|
display_team_discussion(discussion_result)
|
||||||
|
|
||||||
# 7. 最终决策
|
# 8. 最终决策
|
||||||
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)
|
||||||
|
|||||||
@@ -0,0 +1,679 @@
|
|||||||
|
"""
|
||||||
|
市场情绪数据获取和计算模块
|
||||||
|
使用akshare获取市场情绪相关指标,包括ARBR、恐慌指数、市场资金情绪等
|
||||||
|
"""
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
import akshare as ak
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
import warnings
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
|
||||||
|
warnings.filterwarnings('ignore')
|
||||||
|
|
||||||
|
# 设置标准输出编码为UTF-8(解决Windows终端显示问题)
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='ignore')
|
||||||
|
|
||||||
|
|
||||||
|
class MarketSentimentDataFetcher:
|
||||||
|
"""市场情绪数据获取和计算类"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.arbr_period = 26 # ARBR计算周期
|
||||||
|
|
||||||
|
def get_market_sentiment_data(self, symbol, stock_data=None):
|
||||||
|
"""
|
||||||
|
获取完整的市场情绪分析数据
|
||||||
|
|
||||||
|
Args:
|
||||||
|
symbol: 股票代码
|
||||||
|
stock_data: 股票历史数据(如果已有)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: 包含各类市场情绪指标的字典
|
||||||
|
"""
|
||||||
|
sentiment_data = {
|
||||||
|
"symbol": symbol,
|
||||||
|
"arbr_data": None, # ARBR指标数据
|
||||||
|
"market_index": None, # 大盘指数数据
|
||||||
|
"sector_index": None, # 板块指数数据
|
||||||
|
"turnover_rate": None, # 换手率数据
|
||||||
|
"limit_up_down": None, # 涨跌停数据
|
||||||
|
"margin_trading": None, # 融资融券数据
|
||||||
|
"fear_greed_index": None, # 市场恐慌贪婪指数
|
||||||
|
"data_success": False
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 判断是否为中国股票
|
||||||
|
is_chinese = self._is_chinese_stock(symbol)
|
||||||
|
|
||||||
|
if is_chinese:
|
||||||
|
# 1. 计算ARBR指标
|
||||||
|
print("📊 正在计算ARBR情绪指标...")
|
||||||
|
arbr_data = self._calculate_arbr(symbol, stock_data)
|
||||||
|
if arbr_data:
|
||||||
|
sentiment_data["arbr_data"] = arbr_data
|
||||||
|
|
||||||
|
# 2. 获取换手率数据
|
||||||
|
print("📊 正在获取换手率数据...")
|
||||||
|
turnover_data = self._get_turnover_rate(symbol)
|
||||||
|
if turnover_data:
|
||||||
|
sentiment_data["turnover_rate"] = turnover_data
|
||||||
|
|
||||||
|
# 3. 获取大盘情绪
|
||||||
|
print("📊 正在获取大盘情绪数据...")
|
||||||
|
market_data = self._get_market_index_sentiment()
|
||||||
|
if market_data:
|
||||||
|
sentiment_data["market_index"] = market_data
|
||||||
|
|
||||||
|
# 4. 获取涨跌停数据
|
||||||
|
print("📊 正在获取涨跌停数据...")
|
||||||
|
limit_data = self._get_limit_up_down_stats()
|
||||||
|
if limit_data:
|
||||||
|
sentiment_data["limit_up_down"] = limit_data
|
||||||
|
|
||||||
|
# 5. 获取融资融券数据
|
||||||
|
print("📊 正在获取融资融券数据...")
|
||||||
|
margin_data = self._get_margin_trading_data(symbol)
|
||||||
|
if margin_data:
|
||||||
|
sentiment_data["margin_trading"] = margin_data
|
||||||
|
|
||||||
|
# 6. 获取市场恐慌指数
|
||||||
|
print("📊 正在计算市场恐慌指数...")
|
||||||
|
fear_greed = self._get_fear_greed_index()
|
||||||
|
if fear_greed:
|
||||||
|
sentiment_data["fear_greed_index"] = fear_greed
|
||||||
|
|
||||||
|
sentiment_data["data_success"] = True
|
||||||
|
print("✅ 市场情绪数据获取完成")
|
||||||
|
else:
|
||||||
|
# 美股的情绪指标(简化版)
|
||||||
|
print("ℹ️ 美股暂不支持完整的市场情绪数据")
|
||||||
|
sentiment_data["error"] = "美股暂不支持完整的市场情绪数据"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ 获取市场情绪数据失败: {e}")
|
||||||
|
sentiment_data["error"] = str(e)
|
||||||
|
|
||||||
|
return sentiment_data
|
||||||
|
|
||||||
|
def _is_chinese_stock(self, symbol):
|
||||||
|
"""判断是否为中国股票"""
|
||||||
|
return symbol.isdigit() and len(symbol) == 6
|
||||||
|
|
||||||
|
def _calculate_arbr(self, symbol, stock_data=None):
|
||||||
|
"""
|
||||||
|
计算ARBR指标
|
||||||
|
AR = (N日内(H-O)之和 / N日内(O-L)之和) × 100
|
||||||
|
BR = (N日内(H-CY)之和 / N日内(CY-L)之和) × 100
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 如果没有提供stock_data,则重新获取
|
||||||
|
if stock_data is None or stock_data.empty:
|
||||||
|
end_date = datetime.now().strftime('%Y%m%d')
|
||||||
|
start_date = (datetime.now() - timedelta(days=150)).strftime('%Y%m%d')
|
||||||
|
|
||||||
|
df = ak.stock_zh_a_hist(symbol=symbol, period="daily",
|
||||||
|
start_date=start_date, end_date=end_date,
|
||||||
|
adjust="qfq")
|
||||||
|
|
||||||
|
if df is None or df.empty:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 重命名列
|
||||||
|
df = df.rename(columns={
|
||||||
|
'日期': 'date',
|
||||||
|
'开盘': 'open',
|
||||||
|
'收盘': 'close',
|
||||||
|
'最高': 'high',
|
||||||
|
'最低': 'low',
|
||||||
|
'成交量': 'volume'
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
# 使用已有数据
|
||||||
|
df = stock_data.copy()
|
||||||
|
# 确保列名正确
|
||||||
|
if 'Open' in df.columns:
|
||||||
|
df = df.rename(columns={
|
||||||
|
'Open': 'open',
|
||||||
|
'Close': 'close',
|
||||||
|
'High': 'high',
|
||||||
|
'Low': 'low',
|
||||||
|
'Volume': 'volume'
|
||||||
|
})
|
||||||
|
df = df.reset_index()
|
||||||
|
if 'Date' in df.columns:
|
||||||
|
df = df.rename(columns={'Date': 'date'})
|
||||||
|
|
||||||
|
# 确保日期列为datetime类型
|
||||||
|
if 'date' in df.columns:
|
||||||
|
df['date'] = pd.to_datetime(df['date'])
|
||||||
|
|
||||||
|
# 计算各项差值
|
||||||
|
df['HO'] = df['high'] - df['open'] # 最高价-开盘价
|
||||||
|
df['OL'] = df['open'] - df['low'] # 开盘价-最低价
|
||||||
|
df['HCY'] = df['high'] - df['close'].shift(1) # 最高价-前收
|
||||||
|
df['CYL'] = df['close'].shift(1) - df['low'] # 前收-最低价
|
||||||
|
|
||||||
|
# 计算AR指标
|
||||||
|
df['AR'] = (df['HO'].rolling(window=self.arbr_period).sum() /
|
||||||
|
df['OL'].rolling(window=self.arbr_period).sum()) * 100
|
||||||
|
|
||||||
|
# 计算BR指标
|
||||||
|
df['BR'] = (df['HCY'].rolling(window=self.arbr_period).sum() /
|
||||||
|
df['CYL'].rolling(window=self.arbr_period).sum()) * 100
|
||||||
|
|
||||||
|
# 处理无穷大和空值
|
||||||
|
df['AR'] = df['AR'].replace([np.inf, -np.inf], np.nan)
|
||||||
|
df['BR'] = df['BR'].replace([np.inf, -np.inf], np.nan)
|
||||||
|
|
||||||
|
# 移除空值
|
||||||
|
df = df.dropna(subset=['AR', 'BR'])
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 获取最新值和统计信息
|
||||||
|
latest = df.iloc[-1]
|
||||||
|
ar_value = latest['AR']
|
||||||
|
br_value = latest['BR']
|
||||||
|
|
||||||
|
# 解读ARBR
|
||||||
|
interpretation = self._interpret_arbr(ar_value, br_value)
|
||||||
|
|
||||||
|
# 生成交易信号
|
||||||
|
signals = self._generate_arbr_signals(ar_value, br_value)
|
||||||
|
|
||||||
|
# 计算历史统计
|
||||||
|
stats = {
|
||||||
|
"ar_mean": df['AR'].mean(),
|
||||||
|
"ar_std": df['AR'].std(),
|
||||||
|
"ar_min": df['AR'].min(),
|
||||||
|
"ar_max": df['AR'].max(),
|
||||||
|
"br_mean": df['BR'].mean(),
|
||||||
|
"br_std": df['BR'].std(),
|
||||||
|
"br_min": df['BR'].min(),
|
||||||
|
"br_max": df['BR'].max(),
|
||||||
|
}
|
||||||
|
|
||||||
|
# 计算信号统计
|
||||||
|
df['ar_signal'] = 0
|
||||||
|
df['br_signal'] = 0
|
||||||
|
df.loc[df['AR'] > 150, 'ar_signal'] = -1
|
||||||
|
df.loc[df['AR'] < 70, 'ar_signal'] = 1
|
||||||
|
df.loc[df['BR'] > 300, 'br_signal'] = -1
|
||||||
|
df.loc[df['BR'] < 50, 'br_signal'] = 1
|
||||||
|
df['combined_signal'] = df['ar_signal'] + df['br_signal']
|
||||||
|
|
||||||
|
buy_signals = len(df[df['combined_signal'] > 0])
|
||||||
|
sell_signals = len(df[df['combined_signal'] < 0])
|
||||||
|
neutral_signals = len(df) - buy_signals - sell_signals
|
||||||
|
|
||||||
|
signal_stats = {
|
||||||
|
"buy_signals": buy_signals,
|
||||||
|
"sell_signals": sell_signals,
|
||||||
|
"neutral_signals": neutral_signals,
|
||||||
|
"total_signals": len(df),
|
||||||
|
"buy_ratio": f"{buy_signals/len(df)*100:.1f}%" if len(df) > 0 else "0%",
|
||||||
|
"sell_ratio": f"{sell_signals/len(df)*100:.1f}%" if len(df) > 0 else "0%"
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"latest_ar": float(ar_value),
|
||||||
|
"latest_br": float(br_value),
|
||||||
|
"interpretation": interpretation,
|
||||||
|
"signals": signals,
|
||||||
|
"statistics": stats,
|
||||||
|
"signal_statistics": signal_stats,
|
||||||
|
"calculation_date": latest.get('date', datetime.now()).strftime('%Y-%m-%d') if pd.notna(latest.get('date')) else datetime.now().strftime('%Y-%m-%d'),
|
||||||
|
"period": self.arbr_period
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"计算ARBR指标失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _interpret_arbr(self, ar_value, br_value):
|
||||||
|
"""解读ARBR数值的含义"""
|
||||||
|
interpretation = []
|
||||||
|
|
||||||
|
# AR指标解读
|
||||||
|
if ar_value > 180:
|
||||||
|
interpretation.append("AR极度超买(>180),市场过热,风险极高,建议谨慎")
|
||||||
|
elif ar_value > 150:
|
||||||
|
interpretation.append("AR超买(>150),市场情绪过热,注意回调风险")
|
||||||
|
elif ar_value < 40:
|
||||||
|
interpretation.append("AR极度超卖(<40),市场过冷,可能存在机会")
|
||||||
|
elif ar_value < 70:
|
||||||
|
interpretation.append("AR超卖(<70),市场情绪低迷,可关注反弹机会")
|
||||||
|
else:
|
||||||
|
interpretation.append(f"AR处于正常区间({ar_value:.2f}),市场情绪相对平稳")
|
||||||
|
|
||||||
|
# BR指标解读
|
||||||
|
if br_value > 400:
|
||||||
|
interpretation.append("BR极度超买(>400),投机情绪过热,警惕泡沫")
|
||||||
|
elif br_value > 300:
|
||||||
|
interpretation.append("BR超买(>300),投机情绪旺盛,注意风险")
|
||||||
|
elif br_value < 30:
|
||||||
|
interpretation.append("BR极度超卖(<30),投机情绪冰点,可能触底")
|
||||||
|
elif br_value < 50:
|
||||||
|
interpretation.append("BR超卖(<50),投机情绪低迷,关注企稳信号")
|
||||||
|
else:
|
||||||
|
interpretation.append(f"BR处于正常区间({br_value:.2f}),投机情绪适中")
|
||||||
|
|
||||||
|
# ARBR关系解读
|
||||||
|
if ar_value > 100 and br_value > 100:
|
||||||
|
interpretation.append("多头力量强劲(AR>100且BR>100),但需警惕过热风险")
|
||||||
|
elif ar_value < 100 and br_value < 100:
|
||||||
|
interpretation.append("空头力量占优(AR<100且BR<100),市场情绪偏空")
|
||||||
|
|
||||||
|
if ar_value > br_value:
|
||||||
|
interpretation.append("人气指标强于意愿指标(AR>BR),市场基础较好,投资者信心相对稳定")
|
||||||
|
else:
|
||||||
|
interpretation.append("意愿指标强于人气指标(BR>AR),投机性较强,需注意资金稳定性")
|
||||||
|
|
||||||
|
return interpretation
|
||||||
|
|
||||||
|
def _generate_arbr_signals(self, ar_value, br_value):
|
||||||
|
"""生成ARBR交易信号"""
|
||||||
|
signals = []
|
||||||
|
signal_strength = 0
|
||||||
|
|
||||||
|
# AR信号
|
||||||
|
if ar_value > 150:
|
||||||
|
signals.append("AR卖出信号")
|
||||||
|
signal_strength -= 1
|
||||||
|
elif ar_value < 70:
|
||||||
|
signals.append("AR买入信号")
|
||||||
|
signal_strength += 1
|
||||||
|
|
||||||
|
# BR信号
|
||||||
|
if br_value > 300:
|
||||||
|
signals.append("BR卖出信号")
|
||||||
|
signal_strength -= 1
|
||||||
|
elif br_value < 50:
|
||||||
|
signals.append("BR买入信号")
|
||||||
|
signal_strength += 1
|
||||||
|
|
||||||
|
# 综合信号
|
||||||
|
if signal_strength >= 2:
|
||||||
|
overall = "强烈买入信号"
|
||||||
|
elif signal_strength == 1:
|
||||||
|
overall = "买入信号"
|
||||||
|
elif signal_strength == -1:
|
||||||
|
overall = "卖出信号"
|
||||||
|
elif signal_strength <= -2:
|
||||||
|
overall = "强烈卖出信号"
|
||||||
|
else:
|
||||||
|
overall = "中性信号"
|
||||||
|
|
||||||
|
return {
|
||||||
|
"individual_signals": signals if signals else ["中性"],
|
||||||
|
"overall_signal": overall,
|
||||||
|
"signal_strength": signal_strength
|
||||||
|
}
|
||||||
|
|
||||||
|
def _get_turnover_rate(self, symbol):
|
||||||
|
"""获取换手率数据"""
|
||||||
|
try:
|
||||||
|
# 获取最近的换手率数据
|
||||||
|
df = ak.stock_zh_a_spot_em()
|
||||||
|
if df is not None and not df.empty:
|
||||||
|
stock_data = df[df['代码'] == symbol]
|
||||||
|
if not stock_data.empty:
|
||||||
|
row = stock_data.iloc[0]
|
||||||
|
turnover_rate = row.get('换手率', 'N/A')
|
||||||
|
|
||||||
|
# 解读换手率
|
||||||
|
interpretation = ""
|
||||||
|
if turnover_rate != 'N/A':
|
||||||
|
try:
|
||||||
|
turnover = float(turnover_rate)
|
||||||
|
if turnover > 20:
|
||||||
|
interpretation = "换手率极高(>20%),资金活跃度极高,可能存在炒作"
|
||||||
|
elif turnover > 10:
|
||||||
|
interpretation = "换手率较高(>10%),交易活跃"
|
||||||
|
elif turnover > 5:
|
||||||
|
interpretation = "换手率正常(5%-10%),交易适中"
|
||||||
|
elif turnover > 2:
|
||||||
|
interpretation = "换手率偏低(2%-5%),交易相对清淡"
|
||||||
|
else:
|
||||||
|
interpretation = "换手率很低(<2%),交易清淡"
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return {
|
||||||
|
"current_turnover_rate": turnover_rate,
|
||||||
|
"interpretation": interpretation
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"获取换手率数据失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_market_index_sentiment(self):
|
||||||
|
"""获取大盘指数情绪"""
|
||||||
|
try:
|
||||||
|
# 获取上证指数实时数据
|
||||||
|
df = ak.stock_zh_index_spot_em()
|
||||||
|
if df is not None and not df.empty:
|
||||||
|
# 查找上证指数
|
||||||
|
sh_index = df[df['代码'] == '000001']
|
||||||
|
if not sh_index.empty:
|
||||||
|
row = sh_index.iloc[0]
|
||||||
|
change_pct = row.get('涨跌幅', 0)
|
||||||
|
|
||||||
|
# 获取涨跌家数
|
||||||
|
try:
|
||||||
|
market_summary = ak.stock_zh_a_spot_em()
|
||||||
|
if market_summary is not None and not market_summary.empty:
|
||||||
|
up_count = len(market_summary[market_summary['涨跌幅'] > 0])
|
||||||
|
down_count = len(market_summary[market_summary['涨跌幅'] < 0])
|
||||||
|
total_count = len(market_summary)
|
||||||
|
flat_count = total_count - up_count - down_count
|
||||||
|
|
||||||
|
# 计算市场情绪指数
|
||||||
|
sentiment_score = (up_count - down_count) / total_count * 100
|
||||||
|
|
||||||
|
# 解读市场情绪
|
||||||
|
if sentiment_score > 30:
|
||||||
|
sentiment = "市场情绪极度乐观"
|
||||||
|
elif sentiment_score > 10:
|
||||||
|
sentiment = "市场情绪偏多"
|
||||||
|
elif sentiment_score > -10:
|
||||||
|
sentiment = "市场情绪中性"
|
||||||
|
elif sentiment_score > -30:
|
||||||
|
sentiment = "市场情绪偏空"
|
||||||
|
else:
|
||||||
|
sentiment = "市场情绪极度悲观"
|
||||||
|
|
||||||
|
return {
|
||||||
|
"index_name": "上证指数",
|
||||||
|
"change_percent": change_pct,
|
||||||
|
"up_count": up_count,
|
||||||
|
"down_count": down_count,
|
||||||
|
"flat_count": flat_count,
|
||||||
|
"total_count": total_count,
|
||||||
|
"sentiment_score": f"{sentiment_score:.2f}",
|
||||||
|
"sentiment_interpretation": sentiment
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"获取涨跌家数失败: {e}")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"index_name": "上证指数",
|
||||||
|
"change_percent": change_pct
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"获取大盘指数情绪失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_limit_up_down_stats(self):
|
||||||
|
"""获取涨跌停统计数据"""
|
||||||
|
try:
|
||||||
|
# 获取今日涨停和跌停统计
|
||||||
|
today = datetime.now().strftime('%Y%m%d')
|
||||||
|
|
||||||
|
# 获取涨停股票
|
||||||
|
try:
|
||||||
|
limit_up_df = ak.stock_zt_pool_em(date=today)
|
||||||
|
limit_up_count = len(limit_up_df) if limit_up_df is not None and not limit_up_df.empty else 0
|
||||||
|
except:
|
||||||
|
limit_up_count = 0
|
||||||
|
|
||||||
|
# 获取跌停股票
|
||||||
|
try:
|
||||||
|
limit_down_df = ak.stock_zt_pool_dtgc_em(date=today)
|
||||||
|
limit_down_count = len(limit_down_df) if limit_down_df is not None and not limit_down_df.empty else 0
|
||||||
|
except:
|
||||||
|
limit_down_count = 0
|
||||||
|
|
||||||
|
# 计算涨跌停比例
|
||||||
|
if limit_up_count + limit_down_count > 0:
|
||||||
|
limit_ratio = limit_up_count / (limit_up_count + limit_down_count) * 100
|
||||||
|
else:
|
||||||
|
limit_ratio = 50
|
||||||
|
|
||||||
|
# 解读涨跌停情况
|
||||||
|
if limit_ratio > 70:
|
||||||
|
interpretation = "涨停股远多于跌停股,市场情绪火热"
|
||||||
|
elif limit_ratio > 60:
|
||||||
|
interpretation = "涨停股多于跌停股,市场情绪较好"
|
||||||
|
elif limit_ratio > 40:
|
||||||
|
interpretation = "涨跌停数量相当,市场情绪分化"
|
||||||
|
elif limit_ratio > 30:
|
||||||
|
interpretation = "跌停股多于涨停股,市场情绪较弱"
|
||||||
|
else:
|
||||||
|
interpretation = "跌停股远多于涨停股,市场情绪低迷"
|
||||||
|
|
||||||
|
return {
|
||||||
|
"limit_up_count": limit_up_count,
|
||||||
|
"limit_down_count": limit_down_count,
|
||||||
|
"limit_ratio": f"{limit_ratio:.1f}%",
|
||||||
|
"interpretation": interpretation,
|
||||||
|
"date": today
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"获取涨跌停数据失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_margin_trading_data(self, symbol):
|
||||||
|
"""获取融资融券数据"""
|
||||||
|
try:
|
||||||
|
# 获取个股融资融券数据(尝试多个API)
|
||||||
|
try:
|
||||||
|
# 方法1:获取沪深融资融券明细
|
||||||
|
df = ak.stock_margin_underlying_info_szse(date=datetime.now().strftime('%Y%m%d'))
|
||||||
|
if df is not None and not df.empty:
|
||||||
|
stock_data = df[df['证券代码'] == symbol]
|
||||||
|
if not stock_data.empty:
|
||||||
|
latest = stock_data.iloc[0]
|
||||||
|
|
||||||
|
margin_balance = latest.get('融资余额', 0)
|
||||||
|
short_balance = latest.get('融券余额', 0)
|
||||||
|
|
||||||
|
# 解读融资融券
|
||||||
|
interpretation = []
|
||||||
|
if margin_balance > short_balance * 10:
|
||||||
|
interpretation.append("融资余额远大于融券余额,投资者看多情绪强")
|
||||||
|
elif margin_balance > short_balance * 3:
|
||||||
|
interpretation.append("融资余额大于融券余额,投资者偏看多")
|
||||||
|
else:
|
||||||
|
interpretation.append("融资融券相对平衡")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"margin_balance": margin_balance,
|
||||||
|
"short_balance": short_balance,
|
||||||
|
"interpretation": interpretation,
|
||||||
|
"date": datetime.now().strftime('%Y-%m-%d')
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 方法2:获取融资融券汇总数据
|
||||||
|
try:
|
||||||
|
df = ak.stock_margin_szsh()
|
||||||
|
if df is not None and not df.empty:
|
||||||
|
# 获取最新数据
|
||||||
|
latest = df.iloc[-1]
|
||||||
|
return {
|
||||||
|
"margin_balance": latest.get('融资余额', 'N/A'),
|
||||||
|
"short_balance": latest.get('融券余额', 'N/A'),
|
||||||
|
"interpretation": ["市场整体融资融券数据"],
|
||||||
|
"date": latest.get('交易日期', 'N/A')
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"获取融资融券数据失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_fear_greed_index(self):
|
||||||
|
"""计算市场恐慌贪婪指数(基于多个指标综合计算)"""
|
||||||
|
try:
|
||||||
|
# 基于多个市场指标计算恐慌贪婪指数
|
||||||
|
# 1. 涨跌家数比例
|
||||||
|
# 2. 涨跌停比例
|
||||||
|
# 3. 成交量变化
|
||||||
|
|
||||||
|
score = 50 # 基准分数
|
||||||
|
factors = []
|
||||||
|
|
||||||
|
# 获取涨跌家数
|
||||||
|
try:
|
||||||
|
market_summary = ak.stock_zh_a_spot_em()
|
||||||
|
if market_summary is not None and not market_summary.empty:
|
||||||
|
up_count = len(market_summary[market_summary['涨跌幅'] > 0])
|
||||||
|
down_count = len(market_summary[market_summary['涨跌幅'] < 0])
|
||||||
|
total = len(market_summary)
|
||||||
|
|
||||||
|
up_ratio = up_count / total
|
||||||
|
# 根据涨跌家数比例调整分数(权重30%)
|
||||||
|
score += (up_ratio - 0.5) * 60
|
||||||
|
factors.append(f"涨跌家数比例: {up_ratio:.1%}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 确保分数在0-100之间
|
||||||
|
score = max(0, min(100, score))
|
||||||
|
|
||||||
|
# 解读恐慌贪婪指数
|
||||||
|
if score >= 75:
|
||||||
|
level = "极度贪婪"
|
||||||
|
interpretation = "市场情绪极度乐观,投资者贪婪,需警惕回调风险"
|
||||||
|
elif score >= 60:
|
||||||
|
level = "贪婪"
|
||||||
|
interpretation = "市场情绪乐观,投资者偏向贪婪"
|
||||||
|
elif score >= 40:
|
||||||
|
level = "中性"
|
||||||
|
interpretation = "市场情绪中性,投资者相对理性"
|
||||||
|
elif score >= 25:
|
||||||
|
level = "恐慌"
|
||||||
|
interpretation = "市场情绪悲观,投资者偏向恐慌"
|
||||||
|
else:
|
||||||
|
level = "极度恐慌"
|
||||||
|
interpretation = "市场情绪极度悲观,投资者恐慌,可能存在超卖机会"
|
||||||
|
|
||||||
|
return {
|
||||||
|
"score": f"{score:.1f}",
|
||||||
|
"level": level,
|
||||||
|
"interpretation": interpretation,
|
||||||
|
"factors": factors
|
||||||
|
}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"计算恐慌贪婪指数失败: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def format_sentiment_data_for_ai(self, sentiment_data):
|
||||||
|
"""
|
||||||
|
将市场情绪数据格式化为适合AI阅读的文本
|
||||||
|
"""
|
||||||
|
if not sentiment_data or not sentiment_data.get("data_success"):
|
||||||
|
return "未能获取市场情绪数据"
|
||||||
|
|
||||||
|
text_parts = []
|
||||||
|
|
||||||
|
# ARBR指标
|
||||||
|
if sentiment_data.get("arbr_data"):
|
||||||
|
arbr = sentiment_data["arbr_data"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- 计算周期:{arbr.get('period', 26)}日
|
||||||
|
- AR值:{arbr.get('latest_ar', 'N/A'):.2f}(人气指标)
|
||||||
|
- BR值:{arbr.get('latest_br', 'N/A'):.2f}(意愿指标)
|
||||||
|
- 信号:{arbr.get('signals', {}).get('overall_signal', 'N/A')}
|
||||||
|
- 解读:
|
||||||
|
{chr(10).join([' * ' + item for item in arbr.get('interpretation', [])])}
|
||||||
|
|
||||||
|
ARBR统计数据:
|
||||||
|
- AR历史均值:{arbr.get('statistics', {}).get('ar_mean', 0):.2f}
|
||||||
|
- BR历史均值:{arbr.get('statistics', {}).get('br_mean', 0):.2f}
|
||||||
|
- 历史买入信号比例:{arbr.get('signal_statistics', {}).get('buy_ratio', 'N/A')}
|
||||||
|
- 历史卖出信号比例:{arbr.get('signal_statistics', {}).get('sell_ratio', 'N/A')}
|
||||||
|
""")
|
||||||
|
|
||||||
|
# 换手率
|
||||||
|
if sentiment_data.get("turnover_rate"):
|
||||||
|
turnover = sentiment_data["turnover_rate"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【换手率数据】
|
||||||
|
- 当前换手率:{turnover.get('current_turnover_rate', 'N/A')}%
|
||||||
|
- 解读:{turnover.get('interpretation', 'N/A')}
|
||||||
|
""")
|
||||||
|
|
||||||
|
# 大盘情绪
|
||||||
|
if sentiment_data.get("market_index"):
|
||||||
|
market = sentiment_data["market_index"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【大盘市场情绪】
|
||||||
|
- 指数:{market.get('index_name', 'N/A')}
|
||||||
|
- 涨跌幅:{market.get('change_percent', 'N/A')}%
|
||||||
|
""")
|
||||||
|
if market.get('sentiment_score'):
|
||||||
|
text_parts.append(f"""- 市场情绪得分:{market.get('sentiment_score', 'N/A')}
|
||||||
|
- 涨家数:{market.get('up_count', 'N/A')}只
|
||||||
|
- 跌家数:{market.get('down_count', 'N/A')}只
|
||||||
|
- 平家数:{market.get('flat_count', 'N/A')}只
|
||||||
|
- 市场情绪:{market.get('sentiment_interpretation', 'N/A')}
|
||||||
|
""")
|
||||||
|
|
||||||
|
# 涨跌停统计
|
||||||
|
if sentiment_data.get("limit_up_down"):
|
||||||
|
limit = sentiment_data["limit_up_down"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【涨跌停统计】
|
||||||
|
- 涨停股数量:{limit.get('limit_up_count', 0)}只
|
||||||
|
- 跌停股数量:{limit.get('limit_down_count', 0)}只
|
||||||
|
- 涨停占比:{limit.get('limit_ratio', 'N/A')}
|
||||||
|
- 解读:{limit.get('interpretation', 'N/A')}
|
||||||
|
""")
|
||||||
|
|
||||||
|
# 融资融券
|
||||||
|
if sentiment_data.get("margin_trading"):
|
||||||
|
margin = sentiment_data["margin_trading"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【融资融券数据】
|
||||||
|
- 融资余额:{margin.get('margin_balance', 'N/A')}元
|
||||||
|
- 融券余额:{margin.get('short_balance', 'N/A')}元
|
||||||
|
- 融资买入额:{margin.get('margin_buy', 'N/A')}元
|
||||||
|
- 解读:{'; '.join(margin.get('interpretation', []))}
|
||||||
|
""")
|
||||||
|
|
||||||
|
# 恐慌贪婪指数
|
||||||
|
if sentiment_data.get("fear_greed_index"):
|
||||||
|
fear_greed = sentiment_data["fear_greed_index"]
|
||||||
|
text_parts.append(f"""
|
||||||
|
【市场恐慌贪婪指数】
|
||||||
|
- 指数得分:{fear_greed.get('score', 'N/A')}/100
|
||||||
|
- 情绪等级:{fear_greed.get('level', 'N/A')}
|
||||||
|
- 解读:{fear_greed.get('interpretation', 'N/A')}
|
||||||
|
""")
|
||||||
|
|
||||||
|
return "\n".join(text_parts)
|
||||||
|
|
||||||
|
|
||||||
|
# 测试函数
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("测试市场情绪数据获取...")
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
|
||||||
|
# 测试平安银行
|
||||||
|
symbol = "000001"
|
||||||
|
print(f"\n正在获取 {symbol} 的市场情绪数据...")
|
||||||
|
|
||||||
|
sentiment_data = fetcher.get_market_sentiment_data(symbol)
|
||||||
|
|
||||||
|
if sentiment_data.get("data_success"):
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("市场情绪数据获取成功!")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
formatted_text = fetcher.format_sentiment_data_for_ai(sentiment_data)
|
||||||
|
print(formatted_text)
|
||||||
|
else:
|
||||||
|
print(f"\n获取失败: {sentiment_data.get('error', '未知错误')}")
|
||||||
|
|
||||||
+255
@@ -0,0 +1,255 @@
|
|||||||
|
# 市场情绪分析模块使用说明
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本系统已集成市场情绪数据分析功能,使用akshare获取包括ARBR在内的多项市场情绪指标,为市场情绪分析师提供实际数据支撑。
|
||||||
|
|
||||||
|
## 主要功能
|
||||||
|
|
||||||
|
### 1. ARBR指标(情绪人气指标)
|
||||||
|
|
||||||
|
**AR指标(人气指标)**
|
||||||
|
- 计算公式:AR = (N日内(H-O)之和 / N日内(O-L)之和) × 100
|
||||||
|
- 含义:反映市场买卖人气
|
||||||
|
- 标准:
|
||||||
|
- AR > 180:极度超买,市场过热
|
||||||
|
- AR > 150:超买,市场情绪过热
|
||||||
|
- 70 < AR < 150:正常区间
|
||||||
|
- AR < 70:超卖,市场情绪低迷
|
||||||
|
- AR < 40:极度超卖,市场过冷
|
||||||
|
|
||||||
|
**BR指标(意愿指标)**
|
||||||
|
- 计算公式:BR = (N日内(H-CY)之和 / N日内(CY-L)之和) × 100
|
||||||
|
- 含义:反映市场买卖意愿强度
|
||||||
|
- 标准:
|
||||||
|
- BR > 400:极度超买,投机情绪过热
|
||||||
|
- BR > 300:超买,投机情绪旺盛
|
||||||
|
- 50 < BR < 300:正常区间
|
||||||
|
- BR < 50:超卖,投机情绪低迷
|
||||||
|
- BR < 30:极度超卖,投机情绪冰点
|
||||||
|
|
||||||
|
### 2. 换手率数据
|
||||||
|
|
||||||
|
- 反映股票交易活跃程度
|
||||||
|
- 标准:
|
||||||
|
- >20%:极高,资金活跃度极高
|
||||||
|
- >10%:较高,交易活跃
|
||||||
|
- 5%-10%:正常,交易适中
|
||||||
|
- 2%-5%:偏低,交易清淡
|
||||||
|
- <2%:很低,交易清淡
|
||||||
|
|
||||||
|
### 3. 大盘情绪指数
|
||||||
|
|
||||||
|
- 上证指数涨跌情况
|
||||||
|
- 市场涨跌家数统计
|
||||||
|
- 市场情绪得分(基于涨跌家数比例)
|
||||||
|
|
||||||
|
### 4. 涨跌停统计
|
||||||
|
|
||||||
|
- 涨停股数量
|
||||||
|
- 跌停股数量
|
||||||
|
- 涨跌停比例
|
||||||
|
- 反映市场热度和情绪极端程度
|
||||||
|
|
||||||
|
### 5. 融资融券数据
|
||||||
|
|
||||||
|
- 融资余额:反映看多资金
|
||||||
|
- 融券余额:反映看空资金
|
||||||
|
- 融资买入额:反映当日看多力度
|
||||||
|
|
||||||
|
### 6. 市场恐慌贪婪指数
|
||||||
|
|
||||||
|
- 综合多个指标计算
|
||||||
|
- 0-100分制
|
||||||
|
- 等级划分:
|
||||||
|
- 75-100:极度贪婪
|
||||||
|
- 60-75:贪婪
|
||||||
|
- 40-60:中性
|
||||||
|
- 25-40:恐慌
|
||||||
|
- 0-25:极度恐慌
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### 方法1:在主应用中自动调用
|
||||||
|
|
||||||
|
当你在主应用(`app.py`)中分析A股股票时,系统会自动:
|
||||||
|
|
||||||
|
1. 获取市场情绪数据(包括ARBR等指标)
|
||||||
|
2. 将数据传递给市场情绪分析师
|
||||||
|
3. 分析师基于实际数据进行专业分析
|
||||||
|
|
||||||
|
### 方法2:单独使用市场情绪数据模块
|
||||||
|
|
||||||
|
```python
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
|
||||||
|
# 创建市场情绪数据获取器
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
|
||||||
|
# 获取某只股票的市场情绪数据
|
||||||
|
symbol = "000001" # 平安银行
|
||||||
|
sentiment_data = fetcher.get_market_sentiment_data(symbol)
|
||||||
|
|
||||||
|
# 检查是否成功获取数据
|
||||||
|
if sentiment_data.get("data_success"):
|
||||||
|
print("✅ 数据获取成功")
|
||||||
|
|
||||||
|
# 查看ARBR数据
|
||||||
|
if sentiment_data.get("arbr_data"):
|
||||||
|
arbr = sentiment_data["arbr_data"]
|
||||||
|
print(f"AR值: {arbr['latest_ar']:.2f}")
|
||||||
|
print(f"BR值: {arbr['latest_br']:.2f}")
|
||||||
|
print(f"信号: {arbr['signals']['overall_signal']}")
|
||||||
|
print("解读:")
|
||||||
|
for interpretation in arbr['interpretation']:
|
||||||
|
print(f" - {interpretation}")
|
||||||
|
|
||||||
|
# 格式化输出(适合AI阅读)
|
||||||
|
formatted_text = fetcher.format_sentiment_data_for_ai(sentiment_data)
|
||||||
|
print(formatted_text)
|
||||||
|
else:
|
||||||
|
print("❌ 数据获取失败")
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法3:计算单独的ARBR指标
|
||||||
|
|
||||||
|
```python
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
import akshare as ak
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
# 创建获取器
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
|
||||||
|
# 获取股票历史数据
|
||||||
|
symbol = "000001"
|
||||||
|
end_date = datetime.now().strftime('%Y%m%d')
|
||||||
|
start_date = (datetime.now() - timedelta(days=120)).strftime('%Y%m%d')
|
||||||
|
|
||||||
|
stock_data = ak.stock_zh_a_hist(
|
||||||
|
symbol=symbol,
|
||||||
|
period="daily",
|
||||||
|
start_date=start_date,
|
||||||
|
end_date=end_date,
|
||||||
|
adjust="qfq"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 计算ARBR
|
||||||
|
arbr_data = fetcher._calculate_arbr(symbol, stock_data)
|
||||||
|
|
||||||
|
if arbr_data:
|
||||||
|
print(f"最新AR: {arbr_data['latest_ar']:.2f}")
|
||||||
|
print(f"最新BR: {arbr_data['latest_br']:.2f}")
|
||||||
|
print(f"整体信号: {arbr_data['signals']['overall_signal']}")
|
||||||
|
```
|
||||||
|
|
||||||
|
## 数据说明
|
||||||
|
|
||||||
|
### 数据来源
|
||||||
|
|
||||||
|
- **akshare**:提供A股实时行情、历史数据、市场统计等
|
||||||
|
- **实时性**:大部分数据为实时或T+1数据
|
||||||
|
|
||||||
|
### 数据限制
|
||||||
|
|
||||||
|
1. **仅支持A股**:当前仅支持中国A股(6位数字代码)
|
||||||
|
2. **网络依赖**:需要稳定的网络连接访问akshare数据源
|
||||||
|
3. **频率限制**:某些数据源有访问频率限制,建议合理使用
|
||||||
|
|
||||||
|
### 数据可靠性
|
||||||
|
|
||||||
|
- ARBR指标:基于历史K线数据计算,准确可靠
|
||||||
|
- 换手率、涨跌停:来自交易所实时数据
|
||||||
|
- 融资融券:T+1数据,具有一定滞后性
|
||||||
|
- 大盘情绪:基于实时市场统计
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **数据获取失败处理**
|
||||||
|
- 系统会自动处理数据获取失败的情况
|
||||||
|
- 如果无法获取某项数据,分析师仍会基于其他可用信息进行分析
|
||||||
|
|
||||||
|
2. **指标解读**
|
||||||
|
- ARBR指标应结合其他技术指标综合判断
|
||||||
|
- 市场情绪具有一定的滞后性和反转性
|
||||||
|
- 极端情绪往往是反转信号
|
||||||
|
|
||||||
|
3. **风险提示**
|
||||||
|
- 市场情绪指标仅供参考,不构成投资建议
|
||||||
|
- 投资有风险,决策需谨慎
|
||||||
|
|
||||||
|
## 集成到分析流程
|
||||||
|
|
||||||
|
系统已自动将市场情绪数据集成到分析流程中:
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 数据获取(股票基本信息、历史数据)
|
||||||
|
2. 技术面分析(技术指标、趋势)
|
||||||
|
3. 基本面分析(财务数据、估值)
|
||||||
|
4. 资金面分析(资金流向、主力行为)
|
||||||
|
5. 市场情绪数据获取(⭐ ARBR、换手率、涨跌停等)
|
||||||
|
6. 风险管理分析(风险识别、控制)
|
||||||
|
7. 市场情绪分析(⭐ 基于实际情绪数据的深度分析)
|
||||||
|
8. 团队讨论(综合各方观点)
|
||||||
|
9. 最终决策(投资建议)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 输出示例
|
||||||
|
|
||||||
|
```
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- 计算周期:26日
|
||||||
|
- AR值:98.45(人气指标)
|
||||||
|
- BR值:105.23(意愿指标)
|
||||||
|
- 信号:中性信号
|
||||||
|
- 解读:
|
||||||
|
* AR处于正常区间(98.45),市场情绪相对平稳
|
||||||
|
* BR处于正常区间(105.23),投机情绪适中
|
||||||
|
* 多头力量强劲(AR>100且BR>100),但需警惕过热风险
|
||||||
|
* 意愿指标强于人气指标(BR>AR),投机性较强,需注意资金稳定性
|
||||||
|
|
||||||
|
ARBR统计数据:
|
||||||
|
- AR历史均值:95.67
|
||||||
|
- BR历史均值:102.34
|
||||||
|
- 历史买入信号比例:15.2%
|
||||||
|
- 历史卖出信号比例:12.8%
|
||||||
|
|
||||||
|
【换手率数据】
|
||||||
|
- 当前换手率:3.45%
|
||||||
|
- 解读:换手率正常(5%-10%),交易适中
|
||||||
|
|
||||||
|
【大盘市场情绪】
|
||||||
|
- 指数:上证指数
|
||||||
|
- 涨跌幅:0.85%
|
||||||
|
- 市场情绪得分:15.32
|
||||||
|
- 涨家数:2856只
|
||||||
|
- 跌家数:1987只
|
||||||
|
- 平家数:234只
|
||||||
|
- 市场情绪:市场情绪偏多
|
||||||
|
```
|
||||||
|
|
||||||
|
## 技术支持
|
||||||
|
|
||||||
|
如有问题或建议,请查看:
|
||||||
|
- `market_sentiment_data.py`:市场情绪数据模块源码
|
||||||
|
- `ai_agents.py`:AI分析师实现(包括市场情绪分析师)
|
||||||
|
- `app.py`:主应用程序
|
||||||
|
|
||||||
|
## 更新日志
|
||||||
|
|
||||||
|
**v1.0** (当前版本)
|
||||||
|
- ✅ ARBR指标计算和解读
|
||||||
|
- ✅ 换手率数据获取
|
||||||
|
- ✅ 大盘情绪指数
|
||||||
|
- ✅ 涨跌停统计
|
||||||
|
- ✅ 融资融券数据
|
||||||
|
- ✅ 市场恐慌贪婪指数
|
||||||
|
- ✅ 集成到市场情绪分析师
|
||||||
|
- ✅ 自动格式化为AI可读文本
|
||||||
|
|
||||||
|
**未来计划**
|
||||||
|
- 🔲 支持更多情绪指标(VIX等)
|
||||||
|
- 🔲 历史情绪数据回测
|
||||||
|
- 🔲 情绪指标可视化图表
|
||||||
|
- 🔲 美股市场情绪数据支持
|
||||||
|
|
||||||
+234
@@ -0,0 +1,234 @@
|
|||||||
|
# 市场情绪分析模块更新日志
|
||||||
|
|
||||||
|
## 版本:v1.0 - 市场情绪数据集成
|
||||||
|
|
||||||
|
**更新日期:** 2025年10月7日
|
||||||
|
|
||||||
|
## 🎯 主要更新内容
|
||||||
|
|
||||||
|
### 1. 新增市场情绪数据模块 (`market_sentiment_data.py`)
|
||||||
|
|
||||||
|
创建了专门的市场情绪数据获取和分析模块,支持以下功能:
|
||||||
|
|
||||||
|
#### ARBR情绪指标
|
||||||
|
- **AR指标(人气指标)**:反映市场买卖人气
|
||||||
|
- 计算公式:AR = (N日内(H-O)之和 / N日内(O-L)之和) × 100
|
||||||
|
- 默认计算周期:26日
|
||||||
|
- 提供超买超卖判断(>150超买,<70超卖)
|
||||||
|
- 历史统计数据分析
|
||||||
|
|
||||||
|
- **BR指标(意愿指标)**:反映市场买卖意愿强度
|
||||||
|
- 计算公式:BR = (N日内(H-CY)之和 / N日内(CY-L)之和) × 100
|
||||||
|
- 提供超买超卖判断(>300超买,<50超卖)
|
||||||
|
- 自动生成交易信号
|
||||||
|
|
||||||
|
#### 其他市场情绪指标
|
||||||
|
- **换手率数据**:反映股票交易活跃程度
|
||||||
|
- **大盘情绪指数**:基于涨跌家数统计的市场情绪
|
||||||
|
- **涨跌停统计**:反映市场极端情绪
|
||||||
|
- **融资融券数据**:反映投资者看多看空情绪
|
||||||
|
- **市场恐慌贪婪指数**:综合多个指标的情绪评分
|
||||||
|
|
||||||
|
### 2. 增强AI分析师功能 (`ai_agents.py`)
|
||||||
|
|
||||||
|
#### 市场情绪分析师增强
|
||||||
|
- 现在接收实际的市场情绪数据作为输入
|
||||||
|
- 基于ARBR等真实指标进行专业分析
|
||||||
|
- 更新分析维度,包括:
|
||||||
|
- ARBR情绪指标深度解读
|
||||||
|
- 个股活跃度分析
|
||||||
|
- 整体市场情绪评估
|
||||||
|
- 资金情绪判断
|
||||||
|
- 情绪对股价影响分析
|
||||||
|
|
||||||
|
### 3. 主应用流程优化 (`app.py`)
|
||||||
|
|
||||||
|
#### 分析流程更新
|
||||||
|
```
|
||||||
|
旧流程:
|
||||||
|
1. 数据获取 → 2. 技术分析 → 3. 基本面分析
|
||||||
|
→ 4. 资金分析 → 5. AI分析 → 6. 团队讨论 → 7. 最终决策
|
||||||
|
|
||||||
|
新流程:
|
||||||
|
1. 数据获取 → 2. 技术分析 → 3. 基本面分析
|
||||||
|
→ 4. 资金分析 → 5. 市场情绪数据获取(新增)
|
||||||
|
→ 6. AI分析 → 7. 团队讨论 → 8. 最终决策
|
||||||
|
```
|
||||||
|
|
||||||
|
#### UI提示优化
|
||||||
|
- 显示市场情绪数据获取状态
|
||||||
|
- 区分A股和美股的功能支持
|
||||||
|
- 提供详细的数据获取反馈
|
||||||
|
|
||||||
|
### 4. 新增使用文档
|
||||||
|
|
||||||
|
- **市场情绪分析使用说明.md**:详细的功能说明和使用指南
|
||||||
|
- **本文档**:更新日志和技术说明
|
||||||
|
|
||||||
|
## 📊 技术实现细节
|
||||||
|
|
||||||
|
### 数据获取
|
||||||
|
- 使用`akshare`库获取实时市场数据
|
||||||
|
- 自动处理数据获取失败的情况
|
||||||
|
- 支持多数据源备用方案
|
||||||
|
|
||||||
|
### 编码处理
|
||||||
|
- 解决Windows终端GBK编码问题
|
||||||
|
- 支持emoji和中文显示
|
||||||
|
- 跨平台兼容性
|
||||||
|
|
||||||
|
### 错误处理
|
||||||
|
- 完善的异常捕获机制
|
||||||
|
- 数据获取失败时的优雅降级
|
||||||
|
- 详细的错误日志输出
|
||||||
|
|
||||||
|
## 🔧 API使用示例
|
||||||
|
|
||||||
|
### 基础使用
|
||||||
|
|
||||||
|
```python
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
|
||||||
|
# 创建获取器
|
||||||
|
fetcher = MarketSentimentDataFetcher()
|
||||||
|
|
||||||
|
# 获取市场情绪数据
|
||||||
|
sentiment_data = fetcher.get_market_sentiment_data("000001")
|
||||||
|
|
||||||
|
# 检查是否成功
|
||||||
|
if sentiment_data.get("data_success"):
|
||||||
|
# 查看ARBR数据
|
||||||
|
arbr = sentiment_data["arbr_data"]
|
||||||
|
print(f"AR: {arbr['latest_ar']:.2f}")
|
||||||
|
print(f"BR: {arbr['latest_br']:.2f}")
|
||||||
|
print(f"信号: {arbr['signals']['overall_signal']}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### 集成到分析流程
|
||||||
|
|
||||||
|
```python
|
||||||
|
from ai_agents import StockAnalysisAgents
|
||||||
|
from market_sentiment_data import MarketSentimentDataFetcher
|
||||||
|
|
||||||
|
# 获取市场情绪数据
|
||||||
|
sentiment_fetcher = MarketSentimentDataFetcher()
|
||||||
|
sentiment_data = sentiment_fetcher.get_market_sentiment_data(symbol)
|
||||||
|
|
||||||
|
# 传递给AI分析师
|
||||||
|
agents = StockAnalysisAgents()
|
||||||
|
agents_results = agents.run_multi_agent_analysis(
|
||||||
|
stock_info,
|
||||||
|
stock_data,
|
||||||
|
indicators,
|
||||||
|
financial_data,
|
||||||
|
fund_flow_data,
|
||||||
|
sentiment_data # 新增参数
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## ✅ 测试验证
|
||||||
|
|
||||||
|
### 测试结果
|
||||||
|
- ✅ ARBR指标计算正常
|
||||||
|
- ✅ 换手率数据获取成功
|
||||||
|
- ✅ 大盘情绪指数正常
|
||||||
|
- ✅ 涨跌停统计正常
|
||||||
|
- ⚠️ 融资融券部分API有限制(已提供备用方案)
|
||||||
|
- ✅ 市场恐慌贪婪指数计算正常
|
||||||
|
|
||||||
|
### 测试示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
【ARBR市场情绪指标】
|
||||||
|
- AR值:59.62(人气指标)
|
||||||
|
- BR值:49.28(意愿指标)
|
||||||
|
- 信号:强烈买入信号
|
||||||
|
- 解读:
|
||||||
|
* AR超卖(<70),市场情绪低迷,可关注反弹机会
|
||||||
|
* BR超卖(<50),投机情绪低迷,关注企稳信号
|
||||||
|
|
||||||
|
【换手率数据】
|
||||||
|
- 当前换手率:0.43%
|
||||||
|
- 解读:换手率很低(<2%),交易清淡
|
||||||
|
|
||||||
|
【涨跌停统计】
|
||||||
|
- 涨停股数量:52只
|
||||||
|
- 跌停股数量:1只
|
||||||
|
- 解读:涨停股远多于跌停股,市场情绪火热
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎨 UI改进
|
||||||
|
|
||||||
|
### 进度条更新
|
||||||
|
- 新增"市场情绪数据获取"步骤
|
||||||
|
- 更清晰的进度指示
|
||||||
|
|
||||||
|
### 状态提示
|
||||||
|
- ✅ 成功获取市场情绪数据提示
|
||||||
|
- ⚠️ 数据获取失败的友好提示
|
||||||
|
- ℹ️ 美股功能限制说明
|
||||||
|
|
||||||
|
### 帮助信息
|
||||||
|
- 更新侧边栏的AI分析流程说明
|
||||||
|
- 包含市场情绪数据步骤
|
||||||
|
|
||||||
|
## 📝 已知问题和限制
|
||||||
|
|
||||||
|
### 功能限制
|
||||||
|
1. **仅支持A股**:市场情绪数据(ARBR等)目前仅支持中国A股
|
||||||
|
2. **数据延迟**:部分数据(如融资融券)可能有T+1延迟
|
||||||
|
3. **API限制**:某些akshare接口可能有频率限制
|
||||||
|
|
||||||
|
### 待优化项
|
||||||
|
1. 融资融券API需要更好的fallback方案
|
||||||
|
2. 可以添加更多情绪指标(如VIX)
|
||||||
|
3. 历史情绪数据的可视化
|
||||||
|
|
||||||
|
## 🚀 未来计划
|
||||||
|
|
||||||
|
### 短期计划
|
||||||
|
- [ ] 优化融资融券数据获取
|
||||||
|
- [ ] 添加情绪指标可视化图表
|
||||||
|
- [ ] 支持自定义ARBR计算周期
|
||||||
|
|
||||||
|
### 长期计划
|
||||||
|
- [ ] 支持更多情绪指标(VIX、PCR等)
|
||||||
|
- [ ] 历史情绪数据回测功能
|
||||||
|
- [ ] 美股市场情绪数据支持
|
||||||
|
- [ ] 情绪指标的机器学习预测
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- `市场情绪分析使用说明.md` - 详细使用指南
|
||||||
|
- `market_sentiment_data.py` - 源代码和注释
|
||||||
|
- `ai_agents.py` - AI分析师实现
|
||||||
|
- `app.py` - 主应用程序
|
||||||
|
|
||||||
|
## 💡 使用建议
|
||||||
|
|
||||||
|
1. **ARBR指标**:最好结合其他技术指标使用,不应单独作为买卖依据
|
||||||
|
2. **市场情绪**:极端情绪往往是反转信号,需要逆向思考
|
||||||
|
3. **数据时效性**:情绪数据具有时效性,建议及时分析
|
||||||
|
4. **风险控制**:市场情绪仅供参考,投资需谨慎
|
||||||
|
|
||||||
|
## 🔍 技术栈
|
||||||
|
|
||||||
|
- **数据源**:akshare
|
||||||
|
- **数据处理**:pandas, numpy
|
||||||
|
- **AI分析**:DeepSeek API
|
||||||
|
- **UI框架**:Streamlit
|
||||||
|
- **语言**:Python 3.x
|
||||||
|
|
||||||
|
## 📧 反馈与支持
|
||||||
|
|
||||||
|
如有问题或建议,请:
|
||||||
|
1. 查看使用文档
|
||||||
|
2. 检查错误日志
|
||||||
|
3. 提交issue或反馈
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**版本:** v1.0
|
||||||
|
**作者:** AI股票分析系统团队
|
||||||
|
**更新日期:** 2025年10月7日
|
||||||
|
|
||||||
+14
-55
@@ -1,19 +1,20 @@
|
|||||||
# 资金流向功能集成说明
|
# 资金流向功能集成说明
|
||||||
|
|
||||||
|
## 引入`pywencai`库,运行环境必须安装node.js>16.0,否则不能获取数据
|
||||||
## 概述
|
## 概述
|
||||||
|
|
||||||
本次更新成功引入了 `pywencai`(问财)库,为资金面分析师提供真实的资金流向数据支撑,包括近20个交易日的区间资金流向、区间主力资金流向和区间涨跌幅数据。
|
本次更新成功引入了 `pywencai`库,为资金面分析师提供真实的资金流向数据支撑,包括近20个交易日的区间资金流向、区间主力资金流向和区间涨跌幅数据。
|
||||||
|
|
||||||
## 功能特点
|
## 功能特点
|
||||||
|
|
||||||
### 1. 数据来源
|
### 1. 数据来源
|
||||||
- **数据源**:同花顺问财(pywencai)
|
- **数据源**:同花顺(pywencai)
|
||||||
- **数据范围**:近20个交易日
|
- **数据范围**:近20个交易日
|
||||||
- **支持市场**:仅支持中国A股(美股暂不支持)
|
- **支持市场**:仅支持中国A股(美股暂不支持)
|
||||||
|
|
||||||
### 2. 获取的数据指标
|
### 2. 获取的数据指标
|
||||||
|
|
||||||
问财资金流向数据包括:
|
资金流向数据包括:
|
||||||
|
|
||||||
- **区间资金流向**
|
- **区间资金流向**
|
||||||
- 总资金流向(元)
|
- 总资金流向(元)
|
||||||
@@ -27,7 +28,7 @@
|
|||||||
- **区间涨跌幅**
|
- **区间涨跌幅**
|
||||||
- 近20日涨跌幅(%)
|
- 近20日涨跌幅(%)
|
||||||
|
|
||||||
- **额外资金数据**(根据问财返回的数据动态提取)
|
- **额外资金数据**(根据返回的数据动态提取)
|
||||||
- 可能包含大单、中单、小单资金流向
|
- 可能包含大单、中单、小单资金流向
|
||||||
- 其他资金相关指标
|
- 其他资金相关指标
|
||||||
|
|
||||||
@@ -38,14 +39,14 @@
|
|||||||
|
|
||||||
### 2. stock_data.py
|
### 2. stock_data.py
|
||||||
新增方法:
|
新增方法:
|
||||||
- `get_fund_flow_data(symbol)`: 使用问财获取资金流向数据
|
- `get_fund_flow_data(symbol)`: 使用获取资金流向数据
|
||||||
- `_safe_convert(value)`: 安全地转换数值
|
- `_safe_convert(value)`: 安全地转换数值
|
||||||
- `_calculate_main_fund_ratio(main_fund, total_fund)`: 计算主力资金占比
|
- `_calculate_main_fund_ratio(main_fund, total_fund)`: 计算主力资金占比
|
||||||
|
|
||||||
### 3. deepseek_client.py
|
### 3. deepseek_client.py
|
||||||
修改了 `fund_flow_analysis` 方法:
|
修改了 `fund_flow_analysis` 方法:
|
||||||
- 新增 `fund_flow_data` 参数
|
- 新增 `fund_flow_data` 参数
|
||||||
- 将问财数据整合到分析提示词中
|
- 将数据整合到分析提示词中
|
||||||
- 增强了资金面分析的维度和深度
|
- 增强了资金面分析的维度和深度
|
||||||
|
|
||||||
分析维度包括:
|
分析维度包括:
|
||||||
@@ -70,7 +71,7 @@
|
|||||||
### 5. app.py
|
### 5. app.py
|
||||||
在 `run_stock_analysis` 函数中:
|
在 `run_stock_analysis` 函数中:
|
||||||
- 添加获取资金流向数据的步骤
|
- 添加获取资金流向数据的步骤
|
||||||
- 仅对A股股票获取问财数据
|
- 仅对A股股票获取数据
|
||||||
- 显示数据获取状态提示
|
- 显示数据获取状态提示
|
||||||
- 将数据传递给AI分析系统
|
- 将数据传递给AI分析系统
|
||||||
|
|
||||||
@@ -102,15 +103,15 @@ streamlit run app.py
|
|||||||
- 获取股票基本信息
|
- 获取股票基本信息
|
||||||
- 获取技术指标数据
|
- 获取技术指标数据
|
||||||
- 获取财务数据
|
- 获取财务数据
|
||||||
- **获取问财资金流向数据**(新增)
|
- **获取资金流向数据**(新增)
|
||||||
- 调用AI分析师团队进行分析
|
- 调用AI分析师团队进行分析
|
||||||
4. 在"资金面分析师"标签页查看基于真实资金流向数据的分析报告
|
4. 在"资金面分析师"标签页查看基于真实资金流向数据的分析报告
|
||||||
|
|
||||||
### 分析美股
|
### 分析美股
|
||||||
|
|
||||||
- 美股暂不支持问财资金流向数据
|
- 美股暂不支持资金流向数据
|
||||||
- 资金面分析师将基于技术指标进行分析
|
- 资金面分析师将基于技术指标进行分析
|
||||||
- 系统会显示"ℹ️ 美股暂不支持问财资金流向数据"提示
|
- 系统会显示"ℹ️ 美股暂不支持资金流向数据"提示
|
||||||
|
|
||||||
## 数据解读
|
## 数据解读
|
||||||
|
|
||||||
@@ -148,7 +149,7 @@ streamlit run app.py
|
|||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
1. **网络要求**
|
1. **网络要求**
|
||||||
- pywencai 需要访问同花顺问财网站
|
- pywencai 需要访问同花顺网站
|
||||||
- 确保网络连接正常
|
- 确保网络连接正常
|
||||||
- 可能受到访问频率限制
|
- 可能受到访问频率限制
|
||||||
|
|
||||||
@@ -157,56 +158,14 @@ streamlit run app.py
|
|||||||
- 非实时数据
|
- 非实时数据
|
||||||
|
|
||||||
3. **异常处理**
|
3. **异常处理**
|
||||||
- 如果问财数据获取失败,系统会自动降级
|
- 如果数据获取失败,系统会自动降级
|
||||||
- 资金面分析师将基于技术指标进行分析
|
- 资金面分析师将基于技术指标进行分析
|
||||||
- 不会影响其他分析师的正常工作
|
- 不会影响其他分析师的正常工作
|
||||||
|
|
||||||
4. **仅支持A股**
|
4. **仅支持A股**
|
||||||
- 问财数据仅支持中国A股
|
- 数据仅支持中国A股
|
||||||
- 美股、港股暂不支持
|
- 美股、港股暂不支持
|
||||||
|
|
||||||
## 示例查询
|
|
||||||
|
|
||||||
问财使用的查询语句格式:
|
|
||||||
```
|
|
||||||
{股票代码}近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅
|
|
||||||
```
|
|
||||||
|
|
||||||
例如:
|
|
||||||
- `600519近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅`
|
|
||||||
- `000001近20个交易日区间资金流向、区间主力资金流向、区间涨跌幅`
|
|
||||||
|
|
||||||
## 效果展示
|
|
||||||
|
|
||||||
### 分析流程提示
|
|
||||||
```
|
|
||||||
📈 正在获取股票数据...
|
|
||||||
📊 正在获取财务数据...
|
|
||||||
💰 正在获取资金流向数据(问财)...
|
|
||||||
✅ 成功获取问财资金流向数据
|
|
||||||
🤖 正在初始化AI分析系统...
|
|
||||||
🔍 AI分析师团队正在分析...
|
|
||||||
💰 资金面分析师正在分析中...
|
|
||||||
✓ 已获取问财资金流向数据
|
|
||||||
```
|
|
||||||
|
|
||||||
### 资金面分析报告示例
|
|
||||||
资金面分析师将基于以下数据进行分析:
|
|
||||||
|
|
||||||
```
|
|
||||||
【问财资金流向数据(近20个交易日)】
|
|
||||||
区间资金流向:
|
|
||||||
- 总资金流向:12345678900 元
|
|
||||||
- 总资金流向(亿元):123.46 亿元
|
|
||||||
|
|
||||||
主力资金流向:
|
|
||||||
- 主力资金流向:9876543210 元
|
|
||||||
- 主力资金流向(亿元):98.77 亿元
|
|
||||||
- 主力资金占比:80.00%
|
|
||||||
|
|
||||||
区间涨跌幅:
|
|
||||||
- 近20日涨跌幅:15.23%
|
|
||||||
```
|
|
||||||
|
|
||||||
## 故障排查
|
## 故障排查
|
||||||
|
|
||||||
|
|||||||
-316
@@ -1,316 +0,0 @@
|
|||||||
# 资金流向功能说明 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.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自己分析"的设计理念,实现了更简单、更智能、更强大的资金面分析功能!🎉
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user