# daily_stock_analysis
**Repository Path**: htczzy/daily_stock_analysis
## Basic Information
- **Project Name**: daily_stock_analysis
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-03-15
- **Last Updated**: 2026-03-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 📈 股票智能分析系统
[](https://github.com/ZhuLinsen/daily_stock_analysis/stargazers)
[](https://github.com/ZhuLinsen/daily_stock_analysis/actions/workflows/ci.yml)
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/downloads/)
[](https://github.com/features/actions)
[](https://hub.docker.com/)
> 🤖 基于 AI 大模型的 A股/港股/美股自选股智能分析系统,每日自动分析并推送「决策仪表盘」到企业微信/飞书/Telegram/Discord/邮箱
[**功能特性**](#-功能特性) · [**快速开始**](#-快速开始) · [**推送效果**](#-推送效果) · [**完整指南**](docs/full-guide.md) · [**常见问题**](docs/FAQ.md) · [**更新日志**](docs/CHANGELOG.md)
简体中文 | [English](docs/README_EN.md) | [繁體中文](docs/README_CHT.md)
## 💖 赞助商 (Sponsors)
## ✨ 功能特性
| 模块 | 功能 | 说明 |
|------|------|------|
| AI | 决策仪表盘 | 一句话核心结论 + 精确买卖点位 + 操作检查清单 |
| 分析 | 多维度分析 | 技术面(盘中实时 MA/多头排列)+ 筹码分布 + 舆情情报 + 实时行情 |
| 市场 | 全球市场 | 支持 A股、港股、美股及美股指数(SPX、DJI、IXIC 等) |
| 基本面 | 结构化聚合 | 新增 `fundamental_context`(valuation/growth/earnings/institution/capital_flow/dragon_tiger/boards,其中 `boards` 表示板块涨跌榜),主链路 fail-open 降级 |
| 策略 | 市场策略系统 | 内置 A股「三段式复盘策略」与美股「Regime Strategy」,输出进攻/均衡/防守或 risk-on/neutral/risk-off 计划,并附“仅供参考,不构成投资建议”提示 |
| 复盘 | 大盘复盘 | 每日市场概览、板块涨跌;支持 cn(A股)/us(美股)/both(两者) 切换 |
| 智能导入 | 多源导入 | 支持图片、CSV/Excel 文件、剪贴板粘贴;Vision LLM 提取代码+名称;置信度分层确认;名称→代码解析(本地+拼音+AkShare) |
| 历史记录 | 批量管理 | 支持多选、全选及批量删除历史分析记录,优化管理效率与 UI/UX 体验 |
| 回测 | AI 回测验证 | 自动评估历史分析准确率,方向胜率、止盈止损命中率 |
| **Agent 问股** | **策略对话** | **多轮策略问答,支持均线金叉/缠论/波浪等 11 种内置策略,Web/Bot/API 全链路** |
| 推送 | 多渠道通知 | 企业微信、飞书、Telegram、Discord、钉钉、邮件、Pushover |
| 自动化 | 定时运行 | GitHub Actions 定时执行,无需服务器 |
> 历史报告详情会优先展示 AI 返回的原始「狙击点位」文本,避免区间价、条件说明等复杂内容在历史回看时被压缩成单个数字。
> Web 管理认证支持运行时开关;如果系统中已保留管理员密码,重新开启认证时必须提供当前密码,避免在认证关闭窗口内直接获取新的管理员会话。
> 多进程/多 worker 部署时,认证开关仅在当前进程即时生效;需重启或滚动重启全部 worker 以统一状态。
### 技术栈与数据来源
| 类型 | 支持 |
|------|------|
| AI 模型 | [AIHubMix](https://aihubmix.com/?aff=CfMq)、Gemini、OpenAI 兼容、DeepSeek、通义千问、Claude 等(统一通过 [LiteLLM](https://github.com/BerriAI/litellm) 调用,支持多 Key 负载均衡)|
| 行情数据 | AkShare、Tushare、Pytdx、Baostock、YFinance |
| 新闻搜索 | Tavily、SerpAPI、Bocha、Brave、MiniMax |
> 注:美股历史数据与实时行情统一使用 YFinance,确保复权一致性
### 内置交易纪律
| 规则 | 说明 |
|------|------|
| 严禁追高 | 乖离率超阈值(默认 5%,可配置)自动提示风险;强势趋势股自动放宽 |
| 趋势交易 | MA5 > MA10 > MA20 多头排列 |
| 精确点位 | 买入价、止损价、目标价 |
| 检查清单 | 每项条件以「满足 / 注意 / 不满足」标记 |
| 新闻时效 | 可配置新闻最大时效(默认 3 天),避免使用过时信息 |
## 🚀 快速开始
### 方式一:GitHub Actions(推荐)
> 5 分钟完成部署,零成本,无需服务器。
#### 1. Fork 本仓库
点击右上角 `Fork` 按钮(顺便点个 Star⭐ 支持一下)
#### 2. 配置 Secrets
`Settings` → `Secrets and variables` → `Actions` → `New repository secret`
**AI 模型配置(至少配置一个)**
> 详细配置说明见 [LLM 配置指南](docs/LLM_CONFIG_GUIDE.md)(三层配置、渠道模式、YAML高级配置、Vision、Agent、排错),GitHub Actions用户也可以实现YAML高级配置。进阶用户可配置 `LITELLM_MODEL`、`LITELLM_FALLBACK_MODELS` 或 `LLM_CHANNELS` 多渠道模式。
> 现在推荐把多模型配置统一写成 `LLM_CHANNELS + LLM__PROTOCOL/BASE_URL/API_KEY/MODELS/ENABLED`。Web 设置页和 `.env` 使用同一套字段,便于相互切换。
> 💡 **推荐 [AIHubMix](https://aihubmix.com/?aff=CfMq)**:一个 Key 即可使用 Gemini、GPT、Claude、DeepSeek 等全球主流模型,无需科学上网,含免费模型(glm-5、gpt-4o-free 等),付费模型高稳定性无限并发。本项目可享 **10% 充值优惠**。
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `AIHUBMIX_KEY` | [AIHubMix](https://aihubmix.com/?aff=CfMq) API Key,一 Key 切换使用全系模型,免费模型可用 | 可选 |
| `GEMINI_API_KEY` | [Google AI Studio](https://aistudio.google.com/) 获取免费 Key(需科学上网) | 可选 |
| `ANTHROPIC_API_KEY` | [Anthropic Claude](https://console.anthropic.com/) API Key | 可选 |
| `ANTHROPIC_MODEL` | Claude 模型(如 `claude-3-5-sonnet-20241022`) | 可选 |
| `OPENAI_API_KEY` | OpenAI 兼容 API Key(支持 DeepSeek、通义千问等) | 可选 |
| `OPENAI_BASE_URL` | OpenAI 兼容 API 地址(如 `https://api.deepseek.com/v1`) | 可选 |
| `OPENAI_MODEL` | 模型名称(如 `gemini-3.1-pro-preview`、`gemini-3-flash-preview`、`gpt-5.2`) | 可选 |
| `OPENAI_VISION_MODEL` | 图片识别专用模型(部分第三方模型不支持图像;不填则用 `OPENAI_MODEL`) | 可选 |
> 注:AI 优先级 Gemini > Anthropic > OpenAI(含 AIHubmix),至少配置一个。`AIHUBMIX_KEY` 无需配置 `OPENAI_BASE_URL`,系统自动适配。图片识别需 Vision 能力模型。DeepSeek 思考模式(deepseek-reasoner、deepseek-r1、qwq、deepseek-chat)按模型名自动识别,无需额外配置。
通知渠道配置(点击展开,至少配置一个)
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `WECHAT_WEBHOOK_URL` | 企业微信 Webhook URL | 可选 |
| `FEISHU_WEBHOOK_URL` | 飞书 Webhook URL | 可选 |
| `TELEGRAM_BOT_TOKEN` | Telegram Bot Token(@BotFather 获取) | 可选 |
| `TELEGRAM_CHAT_ID` | Telegram Chat ID | 可选 |
| `TELEGRAM_MESSAGE_THREAD_ID` | Telegram Topic ID (用于发送到子话题) | 可选 |
| `DISCORD_WEBHOOK_URL` | Discord Webhook URL | 可选 |
| `DISCORD_BOT_TOKEN` | Discord Bot Token(与 Webhook 二选一) | 可选 |
| `DISCORD_MAIN_CHANNEL_ID` | Discord Channel ID(使用 Bot 时需要) | 可选 |
| `EMAIL_SENDER` | 发件人邮箱(如 `xxx@qq.com`) | 可选 |
| `EMAIL_PASSWORD` | 邮箱授权码(非登录密码) | 可选 |
| `EMAIL_RECEIVERS` | 收件人邮箱(多个用逗号分隔,留空则发给自己) | 可选 |
| `EMAIL_SENDER_NAME` | 邮件发件人显示名称(默认:daily_stock_analysis股票分析助手) | 可选 |
| `STOCK_GROUP_N` / `EMAIL_GROUP_N` | 股票分组发往不同邮箱(如 `STOCK_GROUP_1=600519,300750` `EMAIL_GROUP_1=user1@example.com`) | 可选 |
| `PUSHPLUS_TOKEN` | PushPlus Token([获取地址](https://www.pushplus.plus),国内推送服务) | 可选 |
| `PUSHPLUS_TOPIC` | PushPlus 群组编码(一对多推送,配置后消息推送给群组所有订阅用户) | 可选 |
| `SERVERCHAN3_SENDKEY` | Server酱³ Sendkey([获取地址](https://sc3.ft07.com/),手机APP推送服务) | 可选 |
| `CUSTOM_WEBHOOK_URLS` | 自定义 Webhook(支持钉钉等,多个用逗号分隔) | 可选 |
| `CUSTOM_WEBHOOK_BEARER_TOKEN` | 自定义 Webhook 的 Bearer Token(用于需要认证的 Webhook) | 可选 |
| `WEBHOOK_VERIFY_SSL` | Webhook HTTPS 证书校验(默认 true)。设为 false 可支持自签名证书。警告:关闭有严重安全风险,仅限可信内网 | 可选 |
| `SINGLE_STOCK_NOTIFY` | 单股推送模式:设为 `true` 则每分析完一只股票立即推送 | 可选 |
| `REPORT_TYPE` | 报告类型:`simple`(精简)、`full`(完整)、`brief`(3-5句概括),Docker环境推荐设为 `full` | 可选 |
| `REPORT_SUMMARY_ONLY` | 仅分析结果摘要:设为 `true` 时只推送汇总,不含个股详情 | 可选 |
| `REPORT_TEMPLATES_DIR` | Jinja2 模板目录(相对项目根,默认 `templates`) | 可选 |
| `REPORT_RENDERER_ENABLED` | 启用 Jinja2 模板渲染(默认 `false`,保证零回归) | 可选 |
| `REPORT_INTEGRITY_ENABLED` | 启用报告完整性校验,缺失必填字段时重试或占位补全(默认 `true`) | 可选 |
| `REPORT_INTEGRITY_RETRY` | 完整性校验重试次数(默认 `1`,`0` 表示仅占位不重试) | 可选 |
| `REPORT_HISTORY_COMPARE_N` | 历史信号对比条数,`0` 关闭(默认),`>0` 启用 | 可选 |
| `ANALYSIS_DELAY` | 个股分析和大盘分析之间的延迟(秒),避免API限流,如 `10` | 可选 |
| `MERGE_EMAIL_NOTIFICATION` | 个股与大盘复盘合并推送(默认 false),减少邮件数量 | 可选 |
| `MARKDOWN_TO_IMAGE_CHANNELS` | 将 Markdown 转为图片发送的渠道(逗号分隔):`telegram,wechat,custom,email` | 可选 |
| `MARKDOWN_TO_IMAGE_MAX_CHARS` | 超过此长度不转图片,避免超大图片(默认 `15000`) | 可选 |
| `MD2IMG_ENGINE` | 转图引擎:`wkhtmltoimage`(默认)或 `markdown-to-file`(emoji 更好) | 可选 |
> 至少配置一个渠道,配置多个则同时推送。图片发送与引擎安装细节请参考 [完整指南](docs/full-guide.md)
**其他配置**
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `STOCK_LIST` | 自选股代码,如 `600519,hk00700,AAPL,TSLA` | ✅ |
| `TAVILY_API_KEYS` | [Tavily](https://tavily.com/) 搜索 API(新闻搜索) | 推荐 |
| `MINIMAX_API_KEYS` | [MiniMax](https://platform.minimaxi.com/) Coding Plan Web Search(结构化搜索结果) | 可选 |
| `SERPAPI_API_KEYS` | [SerpAPI](https://serpapi.com/baidu-search-api?utm_source=github_daily_stock_analysis) 全渠道搜索 | 可选 |
| `BOCHA_API_KEYS` | [博查搜索](https://open.bocha.cn/) Web Search API(中文搜索优化,支持AI摘要,多个key用逗号分隔) | 可选 |
| `BRAVE_API_KEYS` | [Brave Search](https://brave.com/search/api/) API(隐私优先,美股优化,多个key用逗号分隔) | 可选 |
| `SEARXNG_BASE_URLS` | SearXNG 自建实例(无配额兜底,需在 settings.yml 启用 format: json) | 可选 |
| `TUSHARE_TOKEN` | [Tushare Pro](https://tushare.pro/weborder/#/login?reg=834638 ) Token | 可选 |
| `PREFETCH_REALTIME_QUOTES` | 实时行情预取开关:设为 `false` 可禁用全市场预取(默认 `true`) | 可选 |
| `WECHAT_MSG_TYPE` | 企微消息类型,默认 markdown,支持配置 text 类型,发送纯 markdown 文本 | 可选 |
| `NEWS_MAX_AGE_DAYS` | 新闻最大时效(天),默认 3,避免使用过时信息 | 可选 |
| `BIAS_THRESHOLD` | 乖离率阈值(%),默认 5.0,超过提示不追高;强势趋势股自动放宽 | 可选 |
| `AGENT_MODE` | 开启 Agent 策略问股模式(`true`/`false`,默认 false) | 可选 |
| `AGENT_SKILLS` | 激活的策略(逗号分隔),`all` 启用全部 11 个;不配置时默认 4 个,详见 `.env.example` | 可选 |
| `AGENT_MAX_STEPS` | Agent 最大推理步数(默认 10) | 可选 |
| `AGENT_STRATEGY_DIR` | 自定义策略目录(默认内置 `strategies/`) | 可选 |
| `TRADING_DAY_CHECK_ENABLED` | 交易日检查(默认 `true`):非交易日跳过执行;设为 `false` 或使用 `--force-run` 强制执行 | 可选 |
| `ENABLE_CHIP_DISTRIBUTION` | 启用筹码分布(Actions 默认 false;需筹码数据时在 Variables 中设为 true,接口可能不稳定) | 可选 |
| `ENABLE_FUNDAMENTAL_PIPELINE` | 基本面聚合总开关;关闭时保持主流程不变 | 可选 |
| `FUNDAMENTAL_STAGE_TIMEOUT_SECONDS` | 基本面阶段总预算(秒) | 可选 |
| `FUNDAMENTAL_FETCH_TIMEOUT_SECONDS` | 单能力源调用超时(秒) | 可选 |
| `FUNDAMENTAL_RETRY_MAX` | 基本面能力重试次数(包含首次) | 可选 |
| `FUNDAMENTAL_CACHE_TTL_SECONDS` | 基本面缓存 TTL(秒) | 可选 |
| `FUNDAMENTAL_CACHE_MAX_ENTRIES` | 基本面缓存最大条目数(避免长时间运行内存增长) | 可选 |
> 基本面超时语义(P0):
> - 当前采用 `best-effort` 软超时(fail-open),超时会立即降级并继续主流程;
> - 不承诺严格硬中断第三方调用线程,因此 `P95 <= 1.5s` 是阶段目标而非硬 SLA;
> - 若业务需要硬 SLA,可在后续阶段升级为“子进程隔离 + kill”的硬超时方案。
> - 字段契约:
> - `fundamental_context.boards.data` = `sector_rankings`(板块涨跌榜,结构 `{top, bottom}`);
> - `get_stock_info.belong_boards` = 个股所属板块列表;
> - `get_stock_info.boards` 为兼容别名,值与 `belong_boards` 相同(未来仅在大版本考虑移除);
> - `get_stock_info.sector_rankings` 与 `fundamental_context.boards.data` 保持一致。
> - 板块涨跌榜采用固定回退顺序:`AkShare(EM->Sina) -> Tushare -> efinance`。
#### 3. 启用 Actions
`Actions` 标签 → `I understand my workflows, go ahead and enable them`
#### 4. 手动测试
`Actions` → `每日股票分析` → `Run workflow` → `Run workflow`
#### 完成
默认每个**工作日 18:00(北京时间)**自动执行,也可手动触发。默认非交易日(含 A/H/US 节假日)不执行。
> 💡 **关于跳过交易日检查的两种机制:**
> | 机制 | 配置方式 | 生效范围 | 适用场景 |
> |------|----------|----------|----------|
> | `TRADING_DAY_CHECK_ENABLED=false` | 环境变量/Secrets | 全局、长期有效 | 测试环境、长期关闭检查 |
> | `force_run` (UI 勾选) | Actions 手动触发时选择 | 单次运行 | 临时在非交易日执行一次 |
>
> - **环境变量方式**:在 `.env` 或 GitHub Secrets 中设置,影响所有运行方式(定时触发、手动触发、本地运行)
> - **UI 勾选方式**:仅在 GitHub Actions 手动触发时可见,不影响定时任务,适合临时需求
### 方式二:本地运行 / Docker 部署
```bash
# 克隆项目
git clone https://github.com/ZhuLinsen/daily_stock_analysis.git && cd daily_stock_analysis
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env && vim .env
# 运行分析
python main.py
```
如果你不用 Web,推荐直接在 `.env` 里按条写渠道:
```env
LLM_CHANNELS=primary
LLM_PRIMARY_PROTOCOL=openai
LLM_PRIMARY_BASE_URL=https://api.deepseek.com/v1
LLM_PRIMARY_API_KEY=sk-xxxxxxxx
LLM_PRIMARY_MODELS=deepseek-chat
LITELLM_MODEL=openai/deepseek-chat
```
保存后也可以在 Web 设置页继续编辑同一组字段;不会要求额外配置文件。
如果同时启用了 `LITELLM_CONFIG`,YAML 仍然是运行时主模型 / fallback / Vision 的唯一来源;渠道编辑器只保存渠道条目,不会覆盖 YAML 的运行时选择。
> Docker 部署、定时任务配置请参考 [完整指南](docs/full-guide.md)
> 桌面客户端打包请参考 [桌面端打包说明](docs/desktop-package.md)
## 📱 推送效果
### 决策仪表盘
```
🎯 2026-02-08 决策仪表盘
共分析3只股票 | 🟢买入:0 🟡观望:2 🔴卖出:1
📊 分析结果摘要
⚪ 中钨高新(000657): 观望 | 评分 65 | 看多
⚪ 永鼎股份(600105): 观望 | 评分 48 | 震荡
🟡 新莱应材(300260): 卖出 | 评分 35 | 看空
⚪ 中钨高新 (000657)
📰 重要信息速览
💭 舆情情绪: 市场关注其AI属性与业绩高增长,情绪偏积极,但需消化短期获利盘和主力流出压力。
📊 业绩预期: 基于舆情信息,公司2025年前三季度业绩同比大幅增长,基本面强劲,为股价提供支撑。
🚨 风险警报:
风险点1:2月5日主力资金大幅净卖出3.63亿元,需警惕短期抛压。
风险点2:筹码集中度高达35.15%,表明筹码分散,拉升阻力可能较大。
风险点3:舆情中提及公司历史违规记录及重组相关风险提示,需保持关注。
✨ 利好催化:
利好1:公司被市场定位为AI服务器HDI核心供应商,受益于AI产业发展。
利好2:2025年前三季度扣非净利润同比暴涨407.52%,业绩表现强劲。
📢 最新动态: 【最新消息】舆情显示公司是AI PCB微钻领域龙头,深度绑定全球头部PCB/载板厂。2月5日主力资金净卖出3.63亿元,需关注后续资金流向。
---
生成时间: 18:00
```
### 大盘复盘
```
🎯 2026-01-10 大盘复盘
📊 主要指数
- 上证指数: 3250.12 (🟢+0.85%)
- 深证成指: 10521.36 (🟢+1.02%)
- 创业板指: 2156.78 (🟢+1.35%)
📈 市场概况
上涨: 3920 | 下跌: 1349 | 涨停: 155 | 跌停: 3
🔥 板块表现
领涨: 互联网服务、文化传媒、小金属
领跌: 保险、航空机场、光伏设备
```
## ⚙️ 配置说明
> 📖 完整环境变量、定时任务配置请参考 [完整配置指南](docs/full-guide.md)
## 🖥️ Web 界面

包含完整的配置管理、任务监控和手动分析功能。
**可选密码保护**:在 `.env` 中设置 `ADMIN_AUTH_ENABLED=true` 可启用 Web 登录,首次访问在网页设置初始密码,保护 Settings 中的 API 密钥等敏感配置。系统设置现支持运行时开启或关闭认证;关闭认证不会删除已保存密码,后续可直接重新启用。详见 [完整指南](docs/full-guide.md)。
### 智能导入
在 **设置 → 基础设置** 中找到「智能导入」区块,支持三种方式添加自选股:
1. **图片**:拖拽或选择自选股截图(如 APP 持仓页、行情列表),Vision AI 自动识别代码+名称,并给出置信度
2. **文件**:上传 CSV 或 Excel (.xlsx),自动解析代码/名称列
3. **粘贴**:从 Excel 或表格复制后粘贴,点击「解析」即可
**预览与合并**:高置信度默认勾选,中/低置信度需手动勾选;支持按代码去重、清空、全选;仅合并已勾选且解析成功的项。
**配置与限制**:
- 图片需配置 Vision API(`GEMINI_API_KEY`、`ANTHROPIC_API_KEY` 或 `OPENAI_API_KEY` 至少一个)
- 图片:JPG/PNG/WebP/GIF,≤5MB;文件:≤2MB;粘贴文本:≤100KB
**API**:`POST /api/v1/stocks/extract-from-image`(图片)、`POST /api/v1/stocks/parse-import`(文件/粘贴)。详见 [完整指南](docs/full-guide.md)。
**LLM 用量查询**:`GET /api/v1/usage/summary?period=today|month|all`,返回按调用类型和模型分组的 token 消耗汇总(`total_calls`、`total_tokens`、`by_call_type`、`by_model`)。
**分析 API 说明**:`POST /api/v1/analysis/analyze` 在 `async_mode=false` 时仅支持单只股票;批量 `stock_codes` 需要 `async_mode=true`。异步 `202` 响应对单股返回 `task_id`,对批量返回 `accepted` / `duplicates` 汇总结构;空白股票代码会在服务端过滤,若过滤后为空则返回 `400`。未知 `/api` 路径(含 `/api` 本身)返回 JSON `404`,不再回退到前端页面。详见 [API 规范](docs/architecture/api_spec.json)。
### 历史报告详情
在首页历史记录中选择一条分析记录后,点击「详细报告」按钮可在右侧抽屉中查看与推送通知格式一致的完整 Markdown 分析报告,包含舆情情报、核心结论、数据透视、作战计划等完整内容。
### 🤖 Agent 策略问股
在 `.env` 中设置 `AGENT_MODE=true` 后启动服务,访问 `/chat` 页面即可开始多轮策略问答。
- **选择策略**:均线金叉、缠论、波浪理论、多头趋势等 11 种内置策略
- **自然语言提问**:如「用缠论分析 600519」,Agent 自动调用实时行情、K线、技术指标、新闻等工具
- **流式进度反馈**:实时展示 AI 思考路径(行情获取 → 技术分析 → 新闻搜索 → 生成结论)
- **多轮对话**:支持追问上下文,会话历史持久化保存
- **导出与发送**:可将会话导出为 .md 文件,或发送到已配置的通知渠道
- **后台执行**:切换页面不中断分析,完成时 Dock 问股图标显示角标
- **Bot 命令**:`/ask` 策略分析(支持多股对比)、`/chat` 自由对话
- **自定义策略**:在 `strategies/` 目录下新建 YAML 文件即可添加策略,无需写代码
- **多 Agent 架构**(实验性):设置 `AGENT_ARCH=multi` 启用 Technical → Intel → Risk → Strategy → Decision 多 Agent 级联编排,通过 `AGENT_ORCHESTRATOR_MODE` 控制深度(quick/standard/full/strategy)。超时或中间阶段 JSON 解析失败时,系统会优先保留已完成阶段结果并降级生成最小可用仪表盘,避免整份报告直接退回默认占位。详见 [完整配置指南](docs/full-guide.md)
> **注意**:配置了任意 AI API Key 后,Agent 对话功能自动可用,无需手动设置 `AGENT_MODE=true`。如需显式关闭可设置 `AGENT_MODE=false`。每次对话会产生 LLM API 调用费用。若你手动修改了 `.env` 中的模型主备配置(如 `LITELLM_MODEL` / `LITELLM_FALLBACK_MODELS` / `LLM_CHANNELS`),需要重启服务或触发配置重载后,新进程才会按新模型生效。
### 启动方式
1. **启动服务**(默认会自动编译前端)
```bash
python main.py --webui # 启动 Web 界面 + 执行定时分析
python main.py --webui-only # 仅启动 Web 界面
```
启动时会在 `apps/dsa-web` 自动执行 `npm install && npm run build`。
如需关闭自动构建,设置 `WEBUI_AUTO_BUILD=false`,并改为手动执行:
```bash
cd ./apps/dsa-web
npm install && npm run build
cd ../..
```
访问 `http://127.0.0.1:8000` 即可使用。
> 也可以使用 `python main.py --serve` (等效命令)
## 🗺️ Roadmap
查看已支持的功能和未来规划:[更新日志](docs/CHANGELOG.md)
> 有建议?欢迎 [提交 Issue](https://github.com/ZhuLinsen/daily_stock_analysis/issues)
---
## ☕ 支持项目
如果本项目对你有帮助,欢迎支持项目的持续维护与迭代,感谢支持 🙏
赞赏可备注联系方式,祝股市长虹
| 支付宝 (Alipay) | 微信支付 (WeChat) | Ko-fi |
| :---: | :---: | :---: |
|
|
|
|
---
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
详见 [贡献指南](docs/CONTRIBUTING.md)
### 本地门禁(建议先跑)
```bash
pip install -r requirements.txt
pip install flake8 pytest
./scripts/ci_gate.sh
```
如修改前端(`apps/dsa-web`):
```bash
cd apps/dsa-web
npm ci
npm run lint
npm run build
```
## 📄 License
[MIT License](LICENSE) © 2026 ZhuLinsen
如果你在项目中使用或基于本项目进行二次开发,
非常欢迎在 README 或文档中注明来源并附上本仓库链接。
这将有助于项目的持续维护和社区发展。
## 📬 联系与合作
- GitHub Issues:[提交 Issue](https://github.com/ZhuLinsen/daily_stock_analysis/issues)
- 合作邮箱:zhuls345@gmail.com
## ⭐ Star History
**如果觉得有用,请给个 ⭐ Star 支持一下!**
## ⚠️ 免责声明
本项目仅供学习和研究使用,不构成任何投资建议。股市有风险,投资需谨慎。作者不对使用本项目产生的任何损失负责。
---
## Portfolio P0 PR1 (Core Ledger and Snapshot)
This phase introduces a minimal-intrusion portfolio core workflow for account/events/snapshot.
- New API group: `/api/v1/portfolio`
- Covered endpoints:
- `POST /accounts`, `GET /accounts`, `PUT /accounts/{account_id}`, `DELETE /accounts/{account_id}`
- `POST /trades`, `POST /cash-ledger`, `POST /corporate-actions`
- `GET /snapshot`
- Valuation replay supports `fifo` (default) and `avg`.
- Same-day deterministic ordering is fixed to: `cash -> corporate action -> trade`.
- Duplicate `trade_uid` in same account returns `409 conflict`.
- Snapshot cache persistence is fail-open and written atomically (positions/lots/snapshot in one transaction).
Rollback:
- PR1 scope is isolated to portfolio tables/repository/service/API module.
- Revert by removing portfolio route exposure and related portfolio module changes.
Validated scope:
- Replay consistency: FIFO vs AVG, partial sell
- Corporate actions: cash dividend and split adjustment
- Same-day ordering edge cases
- API contract: happy path + invalid cost method + duplicate trade_uid conflict
## Portfolio P0 PR2 (Import and Risk)
This phase extends portfolio capability with import and risk monitoring while keeping the existing architecture stable.
- Broker CSV import (`huatai` / `citic` / `cmb`) via unified parse/commit flow.
- Dedup strategy:
- `trade_uid` remains the primary duplicate key when available.
- Key-field hash is also persisted/checked for `trade_uid` records, so mixed imports with/without `trade_uid` stay idempotent.
- New risk API for concentration, drawdown, and stop-loss-near warnings.
- Risk drawdown now backfills missing daily snapshots inside the lookback window on first report call.
- FX online refresh with fail-open stale fallback when online quote fetch fails.
New endpoints:
- `POST /api/v1/portfolio/imports/csv/parse`
- `POST /api/v1/portfolio/imports/csv/commit`
- `GET /api/v1/portfolio/risk`
- `POST /api/v1/portfolio/fx/refresh`
## Portfolio P0 PR3 (Web + Agent Consumption Loop)
This phase delivers the consumption layer on top of PR1/PR2 without changing core ledger architecture.
- Web route:
- Added `/portfolio` page in `apps/dsa-web` with:
- portfolio snapshot cards
- full portfolio / single account switch
- concentration pie chart (Top Positions, via Recharts)
- risk summary blocks (concentration / drawdown / stop-loss-near)
- Agent tool:
- Added `get_portfolio_snapshot` in `src/agent/tools/data_tools.py`
- Default output is compact summary for low token usage
- Optional `include_positions=true` to return detailed positions
- Optional risk block with fail-open behavior
Compatibility and rollback:
- PR3 only appends a new web page, API client/types, and one Agent tool.
- No existing API schema is removed.
- Rollback by removing the `/portfolio` route and `get_portfolio_snapshot` tool registration.
## Portfolio P0 PR4 (Gap Closure)
This phase closes remaining P0 gaps on top of PR3 with additive changes only.
- API query closure:
- `GET /api/v1/portfolio/trades`
- `GET /api/v1/portfolio/cash-ledger`
- `GET /api/v1/portfolio/corporate-actions`
- Common filters: `account_id`, `date_from`, `date_to`, `page`, `page_size`
- CSV framework upgrade:
- parser registry for extensible broker adapters
- new broker discovery endpoint: `GET /api/v1/portfolio/imports/csv/brokers`
- Web portfolio page closure:
- added inline account creation entry (empty-state guided)
- manual entry forms for trade/cash/corporate action
- CSV parse/commit entry (`dry_run` supported)
- event list with type switch, filters, pagination
- broker selector fail-open fallback to built-in `huatai/citic/cmb` when broker-list API is unavailable
- Risk semantics extension:
- new `sector_concentration` block in risk response
- A-share sector mapping via `get_belong_boards`
- non-CN/lookup failure falls back to `UNCLASSIFIED` (fail-open)
- pie chart prefers sector concentration, then degrades to top positions
Compatibility and rollback:
- Existing endpoints and keys remain available.
- New fields are additive only (`sector_concentration`, list responses, broker list).
- Rollback can remove PR4-only endpoints/UI blocks without affecting PR1-PR3 core ledger flow.