# 📈 智能荐股系统(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/` | ECharts K线、技术指标、六因子评分、相关资讯、AI 研报、历史分析 | | 📑 AI 分析详情 | `/analysis/` | 研报正文 + **大模型参考的数据源**(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.5(1024 维) - **大模型**: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.py,RAG 增强) ``` 触发 → RAG检索(个股新闻向量命中 + 公司概况) + 技术指标 + 机构评级/持仓 + 六因子评分 → 组装提示词 → DeepSeek 推理生成 Markdown 研报 → 写入 analysis_history(含数据源快照)→ 前端轮询展示 ``` 研报结构:公司概况 / 技术面 / 消息面 / 机构动向 / 风险提示 / 操作建议(目标区间·支撑·压力位)。 **数据源详情页 `/analysis/`** 可追溯每次分析参考的: - 📰 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 过滤) - **个股深度分析**:个股最新动态 / 上游产业链分析 / 下游产业链分析 / 同行业竞争格局 / 产业链传导与投资启示 / 风险提示 / 关注要点 - **概念/主题深度分析**:题材最新动态 / 核心驱动与催化 / 受益标的梳理 / 市场情绪与资金 / 风险提示 / 关注要点 - **影响度判定**:大模型输出 JSON(significance / 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/` | 个股详情页 | | GET | `/analysis/` | AI 分析详情页 | ### 行情/股票 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/health` | 健康检查 | | GET | `/api/overview` | 仪表盘聚合数据(指数/情绪/荐股/要闻/自选) | | GET | `/api/stocks?keyword=&industry=&board=&rating=&sort=&page=` | 股票列表(含评分) | | GET | `/api/stock/` | 个股详情 + 指标 + 评分 | | GET | `/api/stock//kline?days=` | K线数据 + MA 序列 | | GET | `/api/stock//news` | 个股相关新闻 | | GET | `/api/stock//institutions` | 个股机构评级 + 基金持仓 | ### 荐股/AI | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/recommend?rating=&limit=` | 评分排名 | | POST | `/api/stock//analyze` | 提交 AI 研报任务 `{focus}` | | GET | `/api/stock//analyze/status` | 轮询研报状态 | | GET | `/api/stock//analyses` | 历史分析列表 | | GET | `/api/analyses/` | 分析详情(含数据源) | ### 自选 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/watchlist` | 自选列表 | | POST | `/api/watchlist/` | 加入自选 | | DELETE | `/api/watchlist/` | 移出自选 | ### 新闻/机构 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/news?keyword=&category=&page=` | 新闻列表(分页) | | GET | `/api/news/` | 新闻详情(含关联股票) | | GET | `/api/institutions?type=` | 机构列表 | | GET | `/api/institutions/` | 机构详情 | | GET | `/api/ratings/upgrades` | 评级变动榜 | | GET | `/api/holdings/moves` | 基金增减持榜 | ### 持仓跟踪 | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/tracking` | 跟踪报告列表 | | GET | `/api/tracking/stock/` | 某股跟踪记录 | | GET | `/api/tracking/` | 跟踪详情(含数据源) | | POST | `/api/tracking/run` | 立即跟踪全部自选股 | | POST | `/api/tracking/run/` | 立即跟踪单只 | ### 量化策略 | 方法 | 路径 | 说明 | |---|---|---| | 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/<id>,展示 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) | --- ## 🗺️ 后续规划(可叠加的高级能力) - 模拟盘/实盘信号推送(每日盘前舆情日报) - 策略参数调优、策略组合与仓位管理 - 自选股策略联动、财务因子库(真实财报数据) - 多模型对比研报、行业轮动分析 --- > ⚠️ 本系统所有内容基于模拟数据生成,仅供系统演示与量化研究,**不构成任何投资建议**。