Files

405 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📈 智能荐股系统(Stock Advisor
一个专业的股票推荐与量化分析系统:**多因子荐股评分 + RAG 增强 AI 研报 + 主流量化策略回测 + 舆情驱动自动化通知**。
- **技术栈**Python Flask + SQLite + Chroma 向量库 + bge-large-zh 语义检索 + DeepSeek 大模型
- **默认端口**16095
- **Git**`hz4th_coder/stock-advisor`v1.3.0
- **数据模式**:当前为模拟数据(`IS_MOCK=True`),后期可无缝切换真实数据
---
## ✨ 功能总览
| 模块 | 页面 | 说明 |
|---|---|---|
| 📊 仪表盘 | `/` | 三大指数、市场情绪、今日荐股 TOP5、行业热度、最新要闻、自选股 |
| 🏢 股票池 | `/stocks` | 68 只股票搜索/行业/板块/评级筛选,一键 ⭐ 自选 |
| 🎯 荐股中心 | `/recommend` | 六因子评分排名 + 推荐理由 + AI 深度分析入口 |
| ⏰ 自动化 | `/automation` | 双选项卡:舆情驱动自动化 + 持仓跟踪智能体(配置/持仓管理/目标管理/日志/报告) |
| 📈 量化策略 | `/strategies` | 6 主流策略全市场回测榜 + 单股净值曲线 + 交易明细 |
| 📰 财经新闻 | `/news` | 新闻分类/搜索/情感标签/关联个股,RAG 语料库 |
| 🏦 机构动向 | `/institutions` | 27 家机构、评级变动榜、基金增减持榜、机构详情 |
| 📄 个股详情 | `/stock/<code>` | ECharts K线、技术指标、六因子评分、相关资讯、AI 研报、历史分析 |
| 📑 AI 分析详情 | `/analysis/<id>` | 研报正文 + **大模型参考的数据源**(RAG新闻/概况/指标/评级/持仓/提示词) |
| 🧭 持仓跟踪报告 | `/tracking` | 产业链深度跟踪报告总览(⏰ 自动化页入口进入) |
| 🔧 系统设置 | `/settings` | 邮件 SMTP + 大模型接口配置 |
| ⚙️ 数据管理 | `/admin` | 数据统计、向量库状态、一键重灌、重建回测、**定时报告手动触发与日志** |
---
## 🏗️ 技术架构
```
┌─────────────────────────────────────────────────────────┐
│ 前端(模板 + 原生JS + ECharts
│ 仪表盘 / 股票池 / 荐股 / 策略 / 新闻 / 机构 / 设置 / 详情 │
└──────────────────────────┬──────────────────────────────┘
│ HTTP (Flask)
┌──────────────────────────▼──────────────────────────────┐
│ app.py(路由/API 层) │
│ ┌──────────┬──────────┬──────────┬───────────────────┐ │
│ │ 评分荐股 │ AI研报 │ 量化回测 │ 舆情监控+设置 │ │
│ │scoring.py│analyst.py│strategies│notifier+settings │ │
│ └──────────┴──────────┴──────────┴───────────────────┘ │
│ indicators.py(技术指标) vector_store.py(向量REST
└───────────────┬──────────────────────────┬──────────────┘
│ │
┌──────────▼──────────┐ ┌──────────▼───────────────┐
│ SQLite (本地库) │ │ Chroma(16010) + bge(16011)│
│ stock_advisor.db │ │ 新闻索引/公司概况索引 │
└─────────────────────┘ └──────────────────────────┘
┌──────────▼──────────┐
│ DeepSeek (RAG研报) │ SMTP (舆情邮件通知)
└─────────────────────┘
```
- **向量库**:纯 REST 直连(无 chromadb 客户端依赖),Embedding 用 bge-large-zh-v1.51024 维)
- **大模型**DeepSeek `deepseek-v4-flash`(推理型,研报生成约 25-40 秒,后台线程 + 前端轮询)
- **定时任务**:舆情监控调度器(后台守护线程,默认 30 分钟一轮)
---
## 📂 目录结构
```
stock-advisor/
├── app.py # Flask 主应用(页面 + 全部 API)
├── config.py # 全局配置(端口/LLM/向量库/邮件/监控默认值)
├── database.py # SQLite 连接与表结构(13 张表)
├── settings.py # 设置管理器(settings 表 + 默认值合并)
├── seed_data.py # 模拟数据生成器(行情/新闻/机构/持仓 + 向量/回测构建)
├── start.sh # 启动/停止/重启/状态/重灌脚本
├── requirements.txt # 依赖:flask, requests
├── engine/
│ ├── indicators.py # 技术指标:MA/RSI/MACD/KDJ/量比/波动率
│ ├── scoring.py # 六因子评分模型 + 规则化推荐理由
│ ├── analyst.py # DeepSeek 研报 + RAG 增强 + 历史记录
│ ├── strategies.py # 量化策略信号生成 + 回测引擎
│ └── notifier.py # 舆情监控:重要度评分 + SMTP 邮件 + 调度器
├── rag/
│ └── vector_store.py # Chroma/Embedding 纯 REST 封装
├── templates/ # 10 个页面模板
├── static/
│ ├── css/style.css
│ ├── js/ # 各页面脚本
│ └── lib/marked.min.js # Markdown 渲染(本地无 CDN
├── data/ # stock_advisor.db(运行时生成)
└── logs/ # 运行日志
```
---
## 🚀 快速开始
```bash
cd works/stock-advisor
./start.sh start # 启动(端口 16095
./start.sh status # 查看状态
./start.sh stop # 停止
./start.sh restart # 重启
./start.sh seed # 一键重灌数据(含向量重建 + 策略回测,约 1-3 分钟)
# 手动执行数据生成(可选参数)
/home/hz1/miniconda3/envs/openclaw/bin/python3 seed_data.py # 全量(DB+向量+回测)
/home/hz1/miniconda3/envs/openclaw/bin/python3 seed_data.py --skip-vector # 跳过向量重建
/home/hz1/miniconda3/envs/openclaw/bin/python3 seed_data.py --no-strategies # 跳过策略回测
```
**访问**`http://<服务器IP>:16095/`
**依赖环境**openclaw conda 环境(`flask``requests`);外部服务 Chroma 16010 + Embedding 16011(本机常驻)。
---
## 🗄️ 数据库设计(SQLite,13 张表)
| 表 | 说明 | 关键字段 |
|---|---|---|
| `stocks` | 股票基础信息(68 只) | code/name/industry/board/market_cap/pe/pb/description |
| `stock_daily` | 日线行情(12240 条) | code/date/OHLC/volume/amount/change_pct |
| `market_index` | 上证/深证/创业板指数 | date/sh/sz/cy |
| `news` | 财经新闻(305 条,RAG 语料) | title/content/category/sentiment/related_stocks |
| `institutions` | 机构实体(27 家) | name/type(公募/券商/保险/外资/私募)/description |
| `inst_ratings` | 机构评级(165 条) | inst_id/stock_code/rating/target_price/rating_date |
| `fund_holdings` | 基金季度持仓(363 条) | inst_id/stock_code/quarter/hold_value/change_pct |
| `watchlist` | 用户自选股 | code |
| `analysis_cache` | 研报最新缓存 | code/report |
| `analysis_history` | AI 分析历史(含数据源 JSON | code/focus/report/sources |
| `strategy_backtests` | 策略回测结果(408 条) | strategy/code/metrics/equity/trades |
| `settings` | 系统设置 KV | key/value |
| `notification_log` | 舆情通知日志 | news_id/importance/status |
| `watch_targets` | 跟踪目标(概念/主题/股票) | type/name/keywords/enabled |
| `tracking_reports` | 跟踪报告(含类型/数据源/影响度 JSON | target_type/code/report/meta |
| `report_log` | 定时报告发送日志 | kind/subject/status |
| `global_markets` | 全球主要指数(模拟) | date/data(JSON) |
---
## 🎯 核心模块详解
### 1. 六因子评分模型(engine/scoring.py
满分 100,评级:**强烈推荐 ≥82 / 推荐 ≥68 / 关注 ≥55 / 观望 <55**
| 因子 | 满分 | 依据 |
|---|---|---|
| 趋势 | 25 | 均线多头排列 + 站上 MA20 |
| 动量 | 20 | 5 日涨幅区间映射(过急扣分防追高) |
| 技术 | 15 | RSI 健康区间 / 超买超卖 |
| 量能 | 10 | 量比 |
| 消息 | 15 | 近 7 日相关新闻情感均值 |
| 机构 | 15 | 近 30 日正面评级数 + 基金持仓动向 |
同时生成**规则化推荐理由**(趋势/动量/RSI/量能/消息/机构),列表页直接展示,无需 LLM。
### 2. AI 深度研报(engine/analyst.pyRAG 增强)
```
触发 → RAG检索(个股新闻向量命中 + 公司概况) + 技术指标 + 机构评级/持仓 + 六因子评分
→ 组装提示词 → DeepSeek 推理生成 Markdown 研报
→ 写入 analysis_history(含数据源快照)→ 前端轮询展示
```
研报结构:公司概况 / 技术面 / 消息面 / 机构动向 / 风险提示 / 操作建议(目标区间·支撑·压力位)。
**数据源详情页 `/analysis/<id>`** 可追溯每次分析参考的:
- 📰 RAG 相关资讯(含情感 + 向量相似度)
- 🏢 公司概况 / 📈 技术指标 / 🎯 综合评分
- 🏦 机构评级 / 💼 基金持仓 / 🧠 完整提示词
### 3. 量化策略回测(engine/strategies.py
**6 个主流策略**(全市场 × 6 = 408 条预计算,秒级加载):
| 策略 | 参数 | 类型 |
|---|---|---|
| 双均线金叉 | MA5/MA20 | 趋势 |
| MACD 金叉 | 12/26/9 | 趋势 |
| RSI 超买超卖 | RSI(14) 30/70 | 反转 |
| 布林带回归 | 20日/2σ | 均值回归 |
| 20日动量 | 20日涨幅/MA20 | 动量 |
| N日新高突破 | 20日高低点 | 突破 |
**回测规则**:收盘产生信号 → **次日开盘成交**(全仓多头,避免未来函数);指标含总收益/年化/最大回撤/夏普/胜率/盈亏比/交易次数/超额收益;并对比**买入持有**基准净值曲线。
> 扩展新策略:在 `STRATEGIES` 注册 name/desc + 实现 `_signals()` 即可。
### 4. 舆情驱动自动化(engine/notifier.py
**流程**:后台调度线程(默认 30 分钟)→ 扫描新新闻(水位去重)→ **重要度评分** → 达标 → **SMTP 邮件通知**
**重要度评分(0-100**
```
类别基础分(公司40/业绩35/机构30/行业25/市场15
+ |情感| × 情感权重 × 100
+ 关键词命中 ×12/个(回购/中标/减持/问询/超预期…)
+ 关联个股 ×5/只
```
**防打扰机制**`monitor_last_news_id` 水位只扫新增;首次启动只建水位不通知历史;单封邮件最多 20 条。
**🌙 静默期**:可配置某些时段不发送邮件(如夜间/午休),支持多段 `23:00-07:30,12:00-13:00`(跨午夜)。命中静默时段时扫描照常、仅抑制发送(日志标记为 `quiet`,水位正常推进,不会在结束后补发积压)。在 ⏰ 自动化页开启。
### 5. 持仓跟踪智能体(engine/agent.py + chain_data.py
对**持仓(自选股)**与**目标概念/主题/股票**定期主动跟踪,由**大模型智能体 + 工作流**驱动:
```
工作流:读取产业链知识库 → RAG+DB 采集(个股/上游/下游/同业 或 概念资讯/受益股) → LLM 深度分析
→ 影响度判定(0-100) → 入库 tracking_reports → 重大变化(≥阈值)邮件通知
```
- **跟踪对象**`watch_targets` 表 + 自选股)
- 💼 持仓(自选股):⏰ 自动化→持仓管理 或 股票池/详情页 ⭐ 添加
- 🎯 概念/主题目标:如「AI算力」「低空经济」「固态电池」(关键词检索)
- 🎯 股票目标:额外跟踪的个股代码
- **产业链知识库** `chain_data.py`:覆盖 40+ 行业,每个行业定义 上游(供给/成本)/下游(需求/客户)/同业 + 检索关键词(引用池内股票代码便于 RAG 过滤)
- **个股深度分析**:个股最新动态 / 上游产业链分析 / 下游产业链分析 / 同行业竞争格局 / 产业链传导与投资启示 / 风险提示 / 关注要点
- **概念/主题深度分析**:题材最新动态 / 核心驱动与催化 / 受益标的梳理 / 市场情绪与资金 / 风险提示 / 关注要点
- **影响度判定**:大模型输出 JSONsignificance / impact_score / change_kind / summary / chain_trend),前置输出防截断,容错解析
- **主动调度**:后台调度器按间隔(默认 60 分钟)跟踪全部持仓+目标;支持「立即跟踪全部目标/单只」
- **重大变化通知**impact_score ≥ 阈值(默认 65)自动邮件(股票/概念通用)
- **🌙 静默期**:可配置某些时段不发送重大变化邮件(跟踪报告照常生成入库),在 ⏰ 自动化页开启,多段/跨午夜均支持
- **页面 `/tracking`**:股票+概念报告总览;**⏰ 自动化**页可管理持仓与目标、查看最近报告
### 6. 系统设置(/settings
- **📧 邮件**:SMTP 服务器/端口/加密模式(plain/starttls/ssl/账号/密码/收件人 + 测试邮件
- **🤖 大模型**base_url / api_key / model**运行时生效**+ 测试连接
> 设置存入 `settings` 表,优先于 `config.py` 默认值,无需改代码。
### 7. 每日定时报告(engine/report.py + reports.py + cron
工作日自动发送两封行情报告到邮箱:
| 时段 | cron | 内容 |
|---|---|---|
| 🌅 盘前分析 | `0 9 * * 1-5` | 昨日市场回顾 / 昨日至今要闻 / 全球市场 / 持仓与关注目标 / 盘前研判 |
| 🌇 盘后总结 | `30 15 * * 1-5` | 今日市场总结 / 今日要闻 / 全球市场 / 持仓表现 / 盘后研判 |
每期输出**两份报告**
- **简单版**:邮件正文(指数/涨跌结构/要闻/持仓/目标 + AI 研判速览)
- **详细版**:HTML 附件(数据总览表格 + 全球市场 + 持仓明细 + AI 深度分析全文)
- **全球市场数据** `global_markets` 表(模拟):道琼斯/纳斯达克/标普/恒生/日经/KOSPI/德法英等 9 大指数
- 报告由 DeepSeek 基于当日数据生成研判(简版+详版两次调用),失败自动降级为数据速览
- **手动触发**:数据管理页「定时报告」卡片(🌅/🌇 按钮)+ 发送日志 `report_log`
- **🌙 静默期**:数据管理页可配置报告静默时段,命中时段内不生成、不发送(日志标记为 `quiet`
- CLI`python3 reports.py premarket|postmarket`
---
## 🔌 API 文档
### 页面
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/` `/stocks` `/recommend` `/strategies` `/news` `/institutions` `/settings` `/admin` | 各页面 |
| GET | `/stock/<code>` | 个股详情页 |
| GET | `/analysis/<id>` | AI 分析详情页 |
### 行情/股票
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/health` | 健康检查 |
| GET | `/api/overview` | 仪表盘聚合数据(指数/情绪/荐股/要闻/自选) |
| GET | `/api/stocks?keyword=&industry=&board=&rating=&sort=&page=` | 股票列表(含评分) |
| GET | `/api/stock/<code>` | 个股详情 + 指标 + 评分 |
| GET | `/api/stock/<code>/kline?days=` | K线数据 + MA 序列 |
| GET | `/api/stock/<code>/news` | 个股相关新闻 |
| GET | `/api/stock/<code>/institutions` | 个股机构评级 + 基金持仓 |
### 荐股/AI
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/recommend?rating=&limit=` | 评分排名 |
| POST | `/api/stock/<code>/analyze` | 提交 AI 研报任务 `{focus}` |
| GET | `/api/stock/<code>/analyze/status` | 轮询研报状态 |
| GET | `/api/stock/<code>/analyses` | 历史分析列表 |
| GET | `/api/analyses/<id>` | 分析详情(含数据源) |
### 自选
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/watchlist` | 自选列表 |
| POST | `/api/watchlist/<code>` | 加入自选 |
| DELETE | `/api/watchlist/<code>` | 移出自选 |
### 新闻/机构
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/news?keyword=&category=&page=` | 新闻列表(分页) |
| GET | `/api/news/<id>` | 新闻详情(含关联股票) |
| GET | `/api/institutions?type=` | 机构列表 |
| GET | `/api/institutions/<id>` | 机构详情 |
| GET | `/api/ratings/upgrades` | 评级变动榜 |
| GET | `/api/holdings/moves` | 基金增减持榜 |
### 持仓跟踪
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/tracking` | 跟踪报告列表 |
| GET | `/api/tracking/stock/<code>` | 某股跟踪记录 |
| GET | `/api/tracking/<id>` | 跟踪详情(含数据源) |
| POST | `/api/tracking/run` | 立即跟踪全部自选股 |
| POST | `/api/tracking/run/<code>` | 立即跟踪单只 |
### 量化策略
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/strategies` | 策略列表 + 全市场统计 |
| GET | `/api/backtest/market?strategy=` | 某策略全市场收益榜 |
| GET | `/api/backtest?strategy=&code=` | 单股回测详情(净值+交易) |
| POST | `/api/backtest/rebuild` | 重建全市场回测 |
### 设置/监控
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/settings` | 读取全部设置 |
| POST | `/api/settings` | 保存设置 `{mail, llm, monitor, tracking, quiet}`quiet 含 monitor/tracking/report 三任务静默期) |
| POST | `/api/settings/test-email` | 发送测试邮件 |
| POST | `/api/settings/test-llm` | 测试大模型连接 |
| POST | `/api/monitor/scan` | 立即扫描新闻 |
| GET | `/api/monitor/log` | 通知日志 |
### 数据管理
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/admin/stats` | 表统计 + 向量库状态 |
| POST | `/api/admin/reseed` | 一键重灌数据 |
| GET | `/api/admin/healthcheck` | 外部依赖连通性检查 |
---
## 🔌 外部依赖
| 服务 | 地址 | 用途 |
|---|---|---|
| Chroma 向量库 | `121.40.164.32:16010` | 新闻/概况向量索引 |
| Embedding (bge-large-zh-v1.5) | `121.40.164.32:16011` | 1024 维语义向量 |
| DeepSeek API | `https://api.deepseek.com` | AI 研报生成 |
| SMTP | `mail.tphai.com:587` | 舆情邮件通知 |
> 向量集合:`stock_news_v1`(新闻 474 条)/ `stock_profiles_v1`(公司概况 68 条)
---
## 📦 模拟数据说明
当前所有行情/新闻/机构数据均为**模拟数据**(页面有"模拟数据"标识),用于功能演示与系统验证:
- 68 只 A 股风格股票,覆盖 20+ 行业(白酒/新能源/半导体/医药/银行/券商…)
- 180 个交易日日线(随机游走 + 趋势分化,让荐股/回测有区分度)
- 305 条财经新闻(业绩/行业/公司/机构观点/市场 5 类,带情感标签 + 关联个股)
- 27 家机构(公募/券商/保险资管/外资/私募)+ 165 条评级 + 363 条季度持仓
### 接入真实数据
```python
# 1. 改 config.py
IS_MOCK = False
# 2. 替换 seed_data.py 的数据源(真实行情/新闻/机构接口),保持表结构不变
# - stocks / stock_daily / market_index → 真实行情
# - news → 真实新闻(保留 category / sentiment / related_stocks 字段)
# - institutions / inst_ratings / fund_holdings → 真实机构数据
# 3. 重灌
./start.sh seed
```
分析/检索/回测/监控逻辑**零改动**即可对接真实数据。
---
## 📝 版本历史
| 版本 | 内容 |
|---|---|
| v1.0.0 | 基础版:股票池/行情/新闻/机构/多因子评分/AI 研报(RAG) |
| v1.0.1 | 修复:重灌后机构 ID 自增未重置、行业板块字段错位、研报评分口径 |
| v1.1.0 | AI 分析历史记录 + 数据源详情页(/analysis/&lt;id&gt;,展示 RAG 新闻/提示词等) |
| v1.2.0 | 量化策略模块:6 主流策略全市场回测 + 单股净值曲线 + 交易明细 |
| v1.3.0 | 舆情驱动自动化(定期扫新闻→邮件通知)+ 系统设置区(邮件/大模型/监控可配) |
| v1.4.0 | 持仓跟踪智能体:产业链上下游深度分析(上游供给/成本、下游需求/景气、同业),影响度判定+重大变化通知 |
| v1.5.0 | 舆情监控与持仓跟踪合并为「⏰ 自动化」导航入口(双选项卡);修复布尔设置存储兼容 |
| v1.6.0 | 目标跟踪:概念/主题/股票(watch_targets),概念智能体分析+受益个股,持仓管理与目标管理,报告支持双类型 |
| v1.7.0 | 每日定时报告:工作日 9:00 盘前 / 15:30 盘后,简版正文+详细版附件,全球市场数据,cron 定时+手动触发 |
| v1.8.0 | 🌙 静默期:舆情监控/持仓跟踪/定时报告三大自动化任务均可独立配置静默时段(多段/跨午夜),命中时段不发送邮件(日志标记 quiet) |
---
## 🗺️ 后续规划(可叠加的高级能力)
- 模拟盘/实盘信号推送(每日盘前舆情日报)
- 策略参数调优、策略组合与仓位管理
- 自选股策略联动、财务因子库(真实财报数据)
- 多模型对比研报、行业轮动分析
---
> ⚠️ 本系统所有内容基于模拟数据生成,仅供系统演示与量化研究,**不构成任何投资建议**。