增加主力选股批量分析

This commit is contained in:
oficcejo
2025-10-24 14:56:34 +08:00
parent 916ed5a95d
commit fc34ff6105
15 changed files with 1448 additions and 199 deletions
@@ -0,0 +1,110 @@
# 主力选股批量分析修复说明
## 修复日期
2025-10-22
## 修复问题
### 1. JSON序列化失败
**问题描述**: 批量分析结果保存到历史记录时失败,错误信息:`Object of type DataFrame is not JSON serializable`
**原因**: 分析结果中包含Pandas DataFrame和Series对象,无法直接序列化为JSON
**解决方案**:
-`main_force_batch_db.py` 中添加 `_clean_results_for_json()` 方法
- 递归清理所有不可序列化的对象:
- DataFrame → `to_dict('records')`
- Series → `to_dict()`
- 其他对象 → `str(value)`
- 限制DataFrame最大行数为100,避免数据过大
**相关文件**:
- `main_force_batch_db.py` (lines 50-102)
### 2. 历史记录显示N/A
**问题描述**: 批量分析历史记录中,股票名称和评级显示为N/A
**原因**: 字段名不匹配
- 代码中访问: `stock_info.get('股票名称', 'N/A')`
- 实际字段名: `stock_info['name']`
- 代码中访问: `final_decision.get('investment_rating', 'N/A')`
- 实际字段名: `final_decision['rating']`
**解决方案**:
修复以下文件中的字段名访问:
- `main_force_history_ui.py`:
- `股票名称``name`
- `investment_rating``rating`
- `investment_advice``operation_advice`
- `main_force_ui.py`:
- `advice``operation_advice`
**相关文件**:
- `main_force_history_ui.py` (lines 109, 110, 126, 130)
- `main_force_ui.py` (line 906)
### 3. 详细调试日志
**问题描述**: 难以追踪批量分析和保存过程中的问题
**解决方案**:
- 在并行分析中添加详细的进度日志
- 在保存历史记录前添加数据类型检查
- 添加保存耗时统计
- 添加详细的错误堆栈信息
**相关文件**:
- `main_force_ui.py` (lines 650-692, 706-753)
## 数据结构参考
### stock_info 字段
```python
{
"symbol": "600519",
"name": "贵州茅台", # <-- 正确的字段名
"current_price": "1850.00",
"change_percent": "2.5%",
"pe_ratio": "30.5",
"pb_ratio": "10.2",
"market_cap": "2.3万亿",
"market": "中国A股",
"exchange": "上海/深圳证券交易所"
}
```
### final_decision 字段
```python
{
"rating": "买入", # <-- 正确的字段名
"target_price": "2000",
"operation_advice": "...", # <-- 正确的字段名
"entry_range": "1800-1850",
"take_profit": "2000",
"stop_loss": "1750",
"holding_period": "3-6个月",
"position_size": "中等仓位",
"risk_warning": "...",
"confidence_level": "8"
}
```
## 测试建议
1. **功能测试**:
- 运行10只股票的批量分析
- 检查历史记录是否正确保存
- 验证股票名称和评级正确显示
2. **性能测试**:
- 测试大量DataFrame数据的序列化性能
- 验证100行限制是否合理
3. **边界测试**:
- 测试包含异常数据的分析结果
- 测试空DataFrame的处理
- 测试None值的处理
## 相关文档
- [主力选股批量分析功能说明](./主力选股批量分析功能说明.md)
- [主力选股批量分析历史记录功能说明](./主力选股批量分析历史记录功能说明.md)
@@ -0,0 +1,222 @@
# 主力选股批量分析历史记录功能说明
## 📋 功能概述
主力选股批量分析历史记录功能可以自动保存每次批量分析的完整结果,方便用户:
- 查看历史分析记录
- 对比不同时间的分析结果
- 重新加载历史结果进行查看
- 统计分析成功率和耗时
## ✨ 核心功能
### 1. 自动保存
- ✅ 批量分析完成后自动保存到数据库
- ✅ 保存完整的分析结果(包括成功和失败的股票)
- ✅ 记录分析时间、模式、耗时等元数据
- ✅ 不影响用户操作,后台静默保存
### 2. 历史记录查看
- ✅ 可查看最近50条批量分析记录
- ✅ 显示每条记录的详细信息
- ✅ 支持展开查看完整分析报告
- ✅ 按时间倒序排列,最新的在最前
### 3. 统计数据
- ✅ 总记录数
- ✅ 分析股票总数
- ✅ 成功分析数量
- ✅ 成功率统计
- ✅ 平均耗时
### 4. 记录管理
- ✅ 删除不需要的历史记录
- ✅ 重新加载历史结果到当前页面
- ✅ 查看成功和失败的股票明细
## 🚀 使用指南
### 步骤1:执行批量分析
1. 进入主力选股页面
2. 完成主力选股分析,获取候选列表
3. 点击"🚀 开始批量分析"
4. 选择分析数量和模式
5. 等待分析完成
**自动保存**:分析完成后,系统会自动将结果保存到历史记录数据库。
### 步骤2:查看历史记录
1. 在主力选股页面,点击右上角的"📚 批量分析历史"按钮
2. 进入历史记录页面
### 步骤3:查看统计信息
页面顶部显示统计指标:
- **总记录数**:累计批量分析次数
- **分析股票总数**:累计分析的股票数量
- **成功分析**:成功分析的股票总数
- **成功率**:分析成功率百分比
- **平均耗时**:每次批量分析的平均耗时
### 步骤4:查看具体记录
每条记录显示:
**基本信息**
- 分析时间
- 分析模式(顺序/并行)
- 分析数量
- 总耗时
**统计指标**
- 成功数量
- 失败数量
- 成功率
- 平均单股耗时
**成功的股票**
- 代码、名称
- 投资评级
- 信心度
- 进场区间、止盈位、止损位
- 完整的分析报告(可展开)
**失败的股票**
- 代码
- 失败原因
### 步骤5:管理记录
**删除记录**
- 点击"🗑️ 删除此记录"按钮
- 确认后删除
**重新加载**
- 点击"🔄 加载到当前结果"按钮
- 历史结果将加载到主页面
- 返回主页即可查看
## 📊 数据存储
### 数据库文件
- **文件名**`main_force_batch.db`
- **位置**:项目根目录
- **类型**SQLite数据库
### 存储内容
每条记录包含:
- `id`:记录ID
- `analysis_date`:分析时间
- `batch_count`:分析数量
- `analysis_mode`:分析模式
- `success_count`:成功数量
- `failed_count`:失败数量
- `total_time`:总耗时
- `results_json`:完整结果(JSON格式)
- `created_at`:创建时间
### 数据大小
- 单条记录约 50-200KB(取决于分析结果详细程度)
- 50条记录约 2.5-10MB
- 建议定期清理不需要的历史记录
## 💡 使用技巧
### 1. 对比分析
- 可以对比不同时间的批量分析结果
- 观察主力资金流向的变化趋势
- 识别持续受主力青睐的股票
### 2. 成功率分析
- 通过成功率判断市场环境
- 成功率低可能意味着市场波动大或数据质量问题
- 成功率高说明分析稳定可靠
### 3. 耗时优化
- 对比顺序和并行模式的耗时
- 根据实际情况选择合适的分析模式
- 监控耗时变化,发现性能问题
### 4. 结果复用
- 重新加载历史结果避免重复分析
- 特别适合短时间内需要多次查看的场景
- 节省API调用和分析时间
## ⚠️ 注意事项
1. **存储空间**
- 历史记录会占用磁盘空间
- 建议定期清理不需要的记录
- 当前限制显示最近50条
2. **数据一致性**
- 删除记录后无法恢复
- 删除前请确认不再需要
3. **性能影响**
- 保存历史记录对分析性能影响很小(<1秒)
- 查看历史记录响应快速
4. **数据安全**
- 数据库文件存储在本地
- 建议定期备份 `main_force_batch.db` 文件
- 不要删除正在使用的数据库文件
## 🔧 故障排查
### 保存失败
**现象**:批量分析完成后,历史记录中没有新记录
**解决方法**
1. 查看终端日志,检查是否有错误信息
2. 确认 `main_force_batch.db` 文件有写入权限
3. 检查磁盘空间是否充足
### 历史记录显示错误
**现象**:点击"批量分析历史"后显示错误
**解决方法**
1. 检查 `main_force_batch.db` 文件是否存在
2. 尝试删除数据库文件,让系统重新创建
3. 查看错误详情,根据提示修复
### 加载历史结果失败
**现象**:点击"加载到当前结果"后没有反应
**解决方法**
1. 刷新页面重试
2. 检查结果数据是否完整
3. 重新执行一次批量分析
## 📚 相关文档
- [主力选股批量分析功能说明.md](主力选股批量分析功能说明.md) - 批量分析功能说明
- [主力选股使用指南.md](主力选股使用指南.md) - 主力选股完整指南
## 🎯 使用场景
### 场景1:趋势追踪
```
周一批量分析TOP30 → 保存结果 →
周三批量分析TOP30 → 保存结果 →
周五对比两次结果 → 识别趋势
```
### 场景2:策略验证
```
使用不同参数批量分析 → 保存多个结果 →
对比成功率和推荐股票 → 优化筛选策略
```
### 场景3:决策支持
```
批量分析并保存 → 实盘操作 →
一周后查看历史记录 → 验证分析准确性
```
---
**让历史记录成为您的投资助手!** 📊
+223
View File
@@ -0,0 +1,223 @@
# 选股板块菜单重构说明
## 变更日期
2025-10-24
## 变更概述
将 app.py 中的侧边栏菜单从扁平结构重构为**层级结构**,创建"选股板块"分类,并将主力选股功能归入其中。
## 变更动机
- 配合 OpenSpec 中新建的选股板块架构
- 提升菜单的组织性和可扩展性
- 为未来的选股策略(技术面、基本面、量化)预留入口
- 优化用户体验,功能分类更清晰
## 新菜单结构
### 之前(扁平结构)
```
📖 历史记录
📊 实时监测
🎯 主力选股
🎯 智策板块
🎯 智瞰龙虎
📊 持仓分析
🏠 返回首页
⚙️ 环境配置
```
### 现在(层级结构)
```
🏠 单股分析
───────────────
🎯 选股板块 ▼
├─ 💰 主力选股
├─ 📊 技术面选股(即将推出)
├─ 📈 基本面选股(即将推出)
└─ 🧮 量化选股(即将推出)
📊 策略分析 ▼
├─ 🎯 智策板块
└─ 🐉 智瞰龙虎
💼 投资管理 ▼
├─ 📊 持仓分析
└─ 📡 实时监测
───────────────
📖 历史记录
⚙️ 环境配置
```
## 功能分类说明
### 1. 🏠 单股分析(首页)
- **功能**:对单只股票进行深度AI分析
- **位置**:顶部独立按钮
- **用途**:系统的主要功能入口
### 2. 🎯 选股板块(可展开)
- **功能**:根据不同策略筛选优质股票
- **已实现**
- 💰 主力选股:基于主力资金流向的选股策略
- **即将推出**
- 📊 技术面选股:基于技术指标和形态分析
- 📈 基本面选股:基于财务数据和基本面分析
- 🧮 量化选股:基于量化模型和多因子分析
### 3. 📊 策略分析(可展开)
- **功能**:AI驱动的板块和龙虎榜策略
- **包含**
- 🎯 智策板块:板块轮动和行业策略
- 🐉 智瞰龙虎:龙虎榜深度分析
### 4. 💼 投资管理(可展开)
- **功能**:持仓跟踪与实时监测
- **包含**
- 📊 持仓分析:投资组合分析与定时跟踪
- 📡 实时监测:价格监控与预警提醒
### 5. 📖 历史记录
- **功能**:查看历史分析记录
- **位置**:独立按钮
### 6. ⚙️ 环境配置
- **功能**:系统设置与API配置
- **位置**:独立按钮
## 技术实现
### 使用的 Streamlit 组件
- `st.button()` - 功能按钮
- `st.expander()` - 可展开的分类容器
- `st.markdown()` - 分类说明和未来功能提示
### 代码结构
```python
# 单股分析(首页)
if st.button("🏠 单股分析", ...):
# 清除所有功能页面标志
# 选股板块
with st.expander("🎯 选股板块", expanded=False):
if st.button("💰 主力选股", ...):
st.session_state.show_main_force = True
# 未来功能提示
st.markdown("📊 技术面选股 `即将推出`")
# 策略分析
with st.expander("📊 策略分析", expanded=False):
if st.button("🎯 智策板块", ...):
...
if st.button("🐉 智瞰龙虎", ...):
...
# 投资管理
with st.expander("💼 投资管理", expanded=False):
if st.button("📊 持仓分析", ...):
...
if st.button("📡 实时监测", ...):
...
```
## 用户体验优化
### 改进点
1.**清晰的功能分组**:相关功能归类在一起
2.**层级化导航**:减少视觉混乱,重点突出
3.**可展开设计**:节省侧边栏空间
4.**未来功能预览**:让用户了解系统的发展方向
5.**图标和提示**:每个按钮都有 emoji 和 help 提示
### 交互特点
- **Expander 默认折叠**:减少初始的视觉复杂度
- **独立的顶级功能**:单股分析作为主功能保持独立
- **灰色文字提示**:未来功能用灰色标记,清晰标明"即将推出"
- **按钮宽度统一**`width='stretch'` 确保视觉一致性
## 扩展性设计
### 添加新选股策略
当未来实现技术面选股时,只需:
```python
with st.expander("🎯 选股板块", expanded=False):
# 主力选股(已有)
if st.button("💰 主力选股", ...):
st.session_state.show_main_force = True
# 技术面选股(新增)
if st.button("📊 技术面选股", ...):
st.session_state.show_technical_selection = True
# 移除"即将推出"标记
# st.markdown("📊 技术面选股 `即将推出`")
```
### 添加新功能分类
如需添加新的一级分类(如"AI助手"):
```python
with st.expander("🤖 AI助手", expanded=False):
st.markdown("**智能问答与投资建议**")
if st.button("💬 智能问答", ...):
...
```
## 注意事项
### Session State 管理
- 每个功能按钮点击时,需要清除其他功能的状态标志
- 使用 `for key in [...]:` 批量清理,避免遗漏
### 按钮 Key 值
- 确保每个按钮的 `key` 参数唯一
- 命名规范:`nav_[功能名]`
### 帮助文本更新
已同步更新帮助信息中的功能说明,反映新的菜单结构。
## 后续工作
### 短期(1-2周)
- [ ] 收集用户反馈,优化菜单交互
- [ ] 根据使用频率调整 expander 默认展开状态
- [ ] 完善各功能的 help 提示文字
### 中期(1-2个月)
- [ ] 实现技术面选股功能
- [ ] 实现基本面选股功能
- [ ] 将"即将推出"改为实际功能入口
### 长期(3-6个月)
- [ ] 实现量化选股功能
- [ ] 根据选股板块总规范,完善所有选股策略
- [ ] 考虑添加选股结果对比功能
## 兼容性说明
### 向后兼容
- ✅ 所有原有功能保持不变
- ✅ Session state 机制保持一致
- ✅ 功能页面调用逻辑未改变
### 数据库兼容
- ✅ 无数据库结构变更
- ✅ 历史数据完全兼容
## 相关文档
- OpenSpec 选股板块规范:`openspec/specs/stock-selection/spec.md`
- OpenSpec 变更提案:`openspec/changes/add-stock-selection-category/proposal.md`
- 主力选股使用指南:`docs/主力选股使用指南.md`
- 主力选股快速开始:`docs/主力选股快速开始.md`
## 总结
此次菜单重构成功将主力选股归入"选股板块"分类,为系统建立了清晰的功能架构。新的层级菜单不仅提升了用户体验,还为未来功能扩展预留了灵活的空间。
---
**更新日期**: 2025-10-24
**文档版本**: 1.0
**相关变更**: OpenSpec 选股板块架构建立