- Implement dynamic stock universe with 3-stage filtering (liquidity, fundamentals, technicals) - Create Claude + Qwen3 AI collaboration service for intelligent stock analysis - Update recommendation routes to use live market data instead of hard-coded lists - Add new documentation and deployment scripts - Update Docker configuration for AI model integration BREAKING CHANGE: Replaces hard-coded stock recommendations with dynamic market-based filtering Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
338 lines
8.1 KiB
Markdown
338 lines
8.1 KiB
Markdown
# 改动总结 - 真实股票推荐系统
|
||
|
||
## 概述
|
||
|
||
本次更新将系统从硬编码股票列表升级为**真实世界的动态股票推荐系统**,集成了Claude + Qwen3 AI协作架构。
|
||
|
||
## 核心改动
|
||
|
||
### 1. 动态股票筛选系统 ✅
|
||
|
||
**文件**: `backend/app/modules/stock_universe.py` (新建)
|
||
|
||
**功能**:
|
||
- 从TuShare获取全部A股市场股票(~5000只)
|
||
- 三阶段智能筛选:
|
||
- **第一阶段**: 流动性筛选(日均成交额 > 1亿)
|
||
- **第二阶段**: 基本面筛选(PE < 50, PB < 10, ROE > 5%)
|
||
- **第三阶段**: 技术面筛选(MA5 > MA20, RSI < 70)
|
||
- 支持市场类型选择(主板/创业板/科创板/全市场)
|
||
|
||
**核心方法**:
|
||
```python
|
||
stock_universe.get_recommended_stocks(
|
||
market="all",
|
||
top_n=20,
|
||
enable_liquidity_filter=True,
|
||
enable_fundamental_filter=True,
|
||
enable_technical_filter=True
|
||
)
|
||
```
|
||
|
||
### 2. Claude + Qwen3 AI协作服务 ✅
|
||
|
||
**文件**: `backend/services/ai_collaboration_service.py` (新建)
|
||
|
||
**架构**:
|
||
```
|
||
用户查询
|
||
↓
|
||
Claude (理解意图,生成分析任务)
|
||
↓
|
||
Qwen3-coder:30b (执行数据分析)
|
||
↓
|
||
Claude (综合结果,生成自然语言回答)
|
||
↓
|
||
返回给用户
|
||
```
|
||
|
||
**工作流程**:
|
||
1. **Claude分析**: 理解用户查询,识别意图(推荐、分析、查询等)
|
||
2. **任务生成**: 生成具体的分析prompts给Qwen3
|
||
3. **Qwen3执行**: 执行数据获取、筛选、计算等任务
|
||
4. **Claude综合**: 将Qwen3的分析结果转换为专业的投资建议
|
||
|
||
**核心方法**:
|
||
```python
|
||
await ai_service.full_pipeline(
|
||
user_query="帮我推荐几只银行股",
|
||
context={}
|
||
)
|
||
```
|
||
|
||
### 3. 推荐系统升级 ✅
|
||
|
||
**文件**: `backend/app/routes/recommendations.py` (修改)
|
||
|
||
**变更**:
|
||
- ❌ 删除硬编码的股票列表
|
||
- ✅ 使用`stock_universe`动态筛选
|
||
- ✅ 保留降级机制(TuShare不可用时使用预定义列表)
|
||
|
||
**前**:
|
||
```python
|
||
symbols = ["600000", "601398", "601988", "601398"] # 硬编码
|
||
```
|
||
|
||
**后**:
|
||
```python
|
||
recommended_stocks = stock_universe.get_recommended_stocks(
|
||
market="all",
|
||
top_n=30,
|
||
enable_liquidity_filter=True,
|
||
enable_fundamental_filter=True,
|
||
enable_technical_filter=True
|
||
)
|
||
symbols = [stock['symbol'] for stock in recommended_stocks]
|
||
```
|
||
|
||
### 4. AI推荐集成 ✅
|
||
|
||
**文件**: `backend/app/routes/ai_recommendations.py` (修改)
|
||
|
||
**变更**:
|
||
- ❌ 删除`get_recommendations_internal()`中的硬编码数据
|
||
- ✅ 调用真实的推荐接口`get_recommendations()`
|
||
- ✅ 保留降级机制
|
||
|
||
**核心修改**:
|
||
```python
|
||
# 使用现有的 recommendations 模块获取真实推荐
|
||
from app.routes.recommendations import get_recommendations
|
||
recommendations_response = await get_recommendations()
|
||
recommendations = recommendations_response.get("recommendations", [])
|
||
```
|
||
|
||
## 新增文件
|
||
|
||
### 代码文件
|
||
1. `backend/app/modules/stock_universe.py` - 股票池管理器
|
||
2. `backend/services/ai_collaboration_service.py` - AI协作服务
|
||
|
||
### 文档文件
|
||
1. `DEPLOYMENT_GUIDE_DOCKER.md` - Docker部署完整指南
|
||
2. `CHANGES_SUMMARY.md` - 本文档
|
||
3. `deploy.sh` - 自动化部署脚本
|
||
|
||
## 修改文件
|
||
|
||
1. `backend/app/routes/recommendations.py`
|
||
- 添加`stock_universe`导入
|
||
- 替换硬编码股票列表为动态筛选
|
||
|
||
2. `backend/app/routes/ai_recommendations.py`
|
||
- 更新`get_recommendations_internal()`使用真实数据
|
||
|
||
3. `docker-compose.yml`
|
||
- 已配置Ollama连接(`OLLAMA_BASE_URL`)
|
||
- 已配置Qwen3模型(`DEEPSEEK_MODEL=qwen3-coder:30b-a3b-q8_0`)
|
||
|
||
## 部署方式
|
||
|
||
### 自动化部署(推荐)
|
||
|
||
```bash
|
||
# 一键部署
|
||
./deploy.sh
|
||
|
||
# 带日志输出
|
||
./deploy.sh --logs
|
||
|
||
# 清理旧镜像后部署
|
||
./deploy.sh --clean --logs
|
||
```
|
||
|
||
### 手动部署
|
||
|
||
```bash
|
||
# 1. 停止旧服务
|
||
docker-compose down
|
||
|
||
# 2. 构建镜像
|
||
docker-compose build
|
||
|
||
# 3. 启动服务
|
||
docker-compose up -d
|
||
|
||
# 4. 查看日志
|
||
docker-compose logs -f
|
||
```
|
||
|
||
## 关键配置
|
||
|
||
### 环境变量(`.env`)
|
||
|
||
```bash
|
||
# AI协作必需
|
||
OPENROUTER_API_KEY=sk-or-v1-xxx # Claude API
|
||
OLLAMA_BASE_URL=http://host.docker.internal:11434
|
||
DEEPSEEK_MODEL=qwen3-coder:30b-a3b-q8_0 # 或更小的模型
|
||
|
||
# 数据源必需
|
||
TUSHARE_TOKEN=your_token # A股数据
|
||
ALPHA_VANTAGE_API_KEY=your_key # 国际股票数据
|
||
|
||
# 数据库
|
||
DATABASE_URL=postgresql://stockai:stockai2025@postgres:5432/stock_ai
|
||
REDIS_URL=redis://:redis2025@redis:6379/0
|
||
```
|
||
|
||
### 前置条件
|
||
|
||
1. **Ollama安装和模型下载**:
|
||
```bash
|
||
brew install ollama
|
||
ollama serve
|
||
ollama pull qwen3-coder:30b-a3b-q8_0
|
||
```
|
||
|
||
2. **TuShare账户**:
|
||
- 注册:https://tushare.pro/register
|
||
- 获取token并配置到`.env`
|
||
|
||
## API变化
|
||
|
||
### 新增端点
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/assistant/chat` | POST | AI助手对话(Claude + Qwen3) |
|
||
| `/api/assistant/recommend` | GET | AI智能推荐 |
|
||
| `/api/assistant/analyze-stock/{symbol}` | POST | AI深度分析单只股票 |
|
||
| `/api/assistant/market-pulse` | GET | AI市场脉搏 |
|
||
|
||
### 改进端点
|
||
|
||
| 端点 | 变化 | 说明 |
|
||
|------|------|------|
|
||
| `/api/recommendations` | ✅ | 现在使用动态筛选,从全市场选股 |
|
||
| `/api/ai/recommendations/explained` | ✅ | 使用真实数据代替模拟数据 |
|
||
| `/api/ai/market/overview` | ✅ | 集成真实市场数据 |
|
||
|
||
## 性能考虑
|
||
|
||
### 缓存策略
|
||
|
||
- **股票列表**: 全局缓存,每天更新一次
|
||
- **筛选结果**: Redis缓存60秒
|
||
- **Claude响应**: Redis缓存3600秒(成本优化)
|
||
- **Qwen3响应**: 按需执行,不缓存(保证实时性)
|
||
|
||
### 筛选性能
|
||
|
||
- **全量股票**: ~5000只(0.5秒)
|
||
- **流动性筛选**: ~1000只(10-15秒,TuShare API限流)
|
||
- **基本面筛选**: ~300只(15-20秒)
|
||
- **技术面筛选**: ~100只(10-15秒)
|
||
- **总耗时**: 约40-60秒(首次)
|
||
|
||
**优化建议**:
|
||
1. 异步并行处理
|
||
2. 增加缓存TTL
|
||
3. 使用更快的筛选阶段(禁用某些筛选)
|
||
4. 使用TuShare积分账户提高API限额
|
||
|
||
### AI推理性能
|
||
|
||
- **Claude调用**: 2-5秒(OpenRouter)
|
||
- **Qwen3调用**: 5-15秒(本地Ollama,取决于模型大小)
|
||
- **优化**: 使用更小的Qwen模型(14b代替30b)
|
||
|
||
## 测试验证
|
||
|
||
### 1. 测试动态推荐
|
||
|
||
```bash
|
||
curl http://localhost:8001/api/recommendations | jq
|
||
```
|
||
|
||
**预期结果**:
|
||
- 返回10-20只股票
|
||
- 股票来自不同行业
|
||
- 每只股票包含PE、PB、ROE、技术指标
|
||
|
||
### 2. 测试AI助手
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8001/api/assistant/chat \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"message":"推荐几只银行股"}' | jq
|
||
```
|
||
|
||
**预期结果**:
|
||
- `answer`: Claude生成的自然语言回答
|
||
- `intent`: "stock_recommendation"
|
||
- `data`: Qwen3的分析数据
|
||
|
||
### 3. 测试市场概览
|
||
|
||
```bash
|
||
curl http://localhost:8001/api/ai/market/overview | jq
|
||
```
|
||
|
||
**预期结果**:
|
||
- `raw_data`: 真实市场数据(情绪、板块、资金流)
|
||
- `ai_analysis`: Claude的市场分析
|
||
|
||
## 故障排查
|
||
|
||
### 问题1: "No stocks passed filters"
|
||
|
||
**原因**: 筛选条件太严格
|
||
**解决**:
|
||
- 降低筛选阈值(`stock_universe.py`)
|
||
- 禁用某些筛选阶段
|
||
|
||
### 问题2: "Qwen3 execution failed"
|
||
|
||
**原因**: Ollama未运行或模型未下载
|
||
**解决**:
|
||
```bash
|
||
ollama serve
|
||
ollama pull qwen3-coder:30b-a3b-q8_0
|
||
```
|
||
|
||
### 问题3: "TuShare API limit exceeded"
|
||
|
||
**原因**: API调用频率超限
|
||
**解决**:
|
||
- 增加缓存TTL
|
||
- 减少并发请求
|
||
- 使用TuShare积分账户
|
||
|
||
## 下一步计划
|
||
|
||
### 短期优化
|
||
- [ ] 实现并行筛选(异步处理)
|
||
- [ ] 添加更多筛选策略(动量、低估、稳健)
|
||
- [ ] 优化Qwen3 prompt工程
|
||
- [ ] 添加回测功能验证推荐准确性
|
||
|
||
### 中期计划
|
||
- [ ] 集成更多数据源(Wind、彭博)
|
||
- [ ] 实现自适应筛选(根据市场环境调整阈值)
|
||
- [ ] 添加用户画像和个性化推荐
|
||
- [ ] 支持港股、美股推荐
|
||
|
||
### 长期愿景
|
||
- [ ] 完全自动化的投资组合管理
|
||
- [ ] 实时交易信号生成
|
||
- [ ] 多资产配置建议(股票、债券、商品)
|
||
- [ ] 风险管理和止损策略
|
||
|
||
## 贡献者
|
||
|
||
- 系统架构设计: @claude-code
|
||
- AI协作实现: @claude-code
|
||
- 股票筛选算法: @claude-code
|
||
- 部署和文档: @claude-code
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 联系方式
|
||
|
||
- GitHub: https://github.com/your-repo
|
||
- Issues: https://github.com/your-repo/issues
|