You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

473 lines
17 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Changelog
所有重要更改都会记录在此文件中。
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
## [Unreleased]
### 新增
- 📷 **Markdown 转图片** (Issue #289)
- 支持 `MARKDOWN_TO_IMAGE_CHANNELS` 配置,对 Telegram、企业微信、自定义 WebhookDiscord、邮件以图片形式发送报告
- 邮件为内联附件,增强对不支持 HTML 客户端的兼容性
- 需安装 `wkhtmltopdf``imgkit`
- 📧 **股票分组发往不同邮箱** (Issue #268)
- 支持 `STOCK_GROUP_N` + `EMAIL_GROUP_N` 配置,不同股票组报告发送到对应邮箱
- 大盘复盘发往所有配置的邮箱
## [3.0.5] - 2026-02-08
### 修复
- 🐛 修复信号 emoji 与建议不一致的问题(复合建议如"卖出/观望"未正确映射)
- 🐛 修复 `*ST` 股票名在微信/Dashboard 中 markdown 转义问题
- 🐛 修复 `idx.amount` 为 None 时大盘复盘 TypeError
- 🐛 修复分析 API 返回 `report=None` 及 ReportStrategy 类型不一致问题
- 🐛 修复 Tushare 返回类型错误dict → UnifiedRealtimeQuote及 API 端点指向
### 新增
- 📊 大盘复盘报告注入结构化数据(涨跌统计、指数表格、板块排名)
- 🔍 搜索结果 TTL 缓存500 条上限FIFO 淘汰)
- 🔧 Tushare Token 存在时自动注入实时行情优先级
- 📰 新闻摘要截断长度 50→200 字
### 优化
- ⚡ 补充行情字段请求限制为最多 1 次,减少无效请求
## [3.0.4] - 2026-02-07
### 新增
- 📈 **回测引擎** (PR #269)
- 新增基于历史分析记录的回测系统,支持收益率、胜率、最大回撤等指标评估
- WebUI 集成回测结果展示
## [3.0.3] - 2026-02-07
### 修复
- 🐛 修复狙击点位数据解析错误问题 (PR #271)
## [3.0.2] - 2026-02-06
### 新增
- ✉️ 可配置邮件发送者名称 (PR #272)
- 🌐 外国股票支持英文关键词搜索
## [3.0.1] - 2026-02-06
### 修复
- 🐛 修复 ETF 实时行情获取、市场数据回退、企业微信消息分块问题
- 🔧 CI 流程简化
## [3.0.0] - 2026-02-06
### 移除
- 🗑️ **移除旧版 WebUI**
- 删除基于 `http.server.ThreadingHTTPServer` 的旧版 WebUI`web/` 包)
- 旧版 WebUI 的功能已完全被 FastAPI`api/`+ React 前端替代
- `--webui` / `--webui-only` 命令行参数标记为弃用,自动重定向到 `--serve` / `--serve-only`
- `WEBUI_ENABLED` / `WEBUI_HOST` / `WEBUI_PORT` 环境变量保持兼容,自动转发到 FastAPI 服务
- `webui.py` 保留为兼容入口,启动时直接调用 FastAPI 后端
- Docker Compose 中移除 `webui` 服务定义,统一使用 `server` 服务
### 变更
- ♻️ **服务层重构**
-`web/services.py` 中的异步任务服务迁移至 `src/services/task_service.py`
- Bot 分析命令(`bot/commands/analyze.py`)改为使用 `src.services.task_service`
- Docker 环境变量 `WEBUI_HOST`/`WEBUI_PORT` 更名为 `API_HOST`/`API_PORT`(旧名仍兼容)
## [2.3.0] - 2026-02-01
### 新增
- 🇺🇸 **增强美股支持** (Issue #153)
- 实现基于 Akshare 的美股历史数据获取 (`ak.stock_us_daily()`)
- 实现基于 Yfinance 的美股实时行情获取(优先策略)
- 增加对不支持数据源Tushare/Baostock/Pytdx/Efinance的美股代码过滤和快速降级
### 修复
- 🐛 修复 AMD 等美股代码被误识别为 A 股的问题 (Issue #153)
## [2.2.5] - 2026-02-01
### 新增
- 🤖 **AstrBot 消息推送** (PR #217)
- 新增 AstrBot 通知渠道,支持推送到 QQ 和微信
- 支持 HMAC SHA256 签名验证,确保通信安全
- 通过 `ASTRBOT_URL``ASTRBOT_TOKEN` 配置
## [2.2.4] - 2026-02-01
### 新增
- ⚙️ **可配置数据源优先级** (PR #215)
- 支持通过环境变量(如 `YFINANCE_PRIORITY=0`)动态调整数据源优先级
- 无需修改代码即可优先使用特定数据源(如 Yahoo Finance
## [2.2.3] - 2026-01-31
### 修复
- 📦 更新 requirements.txt增加 `lxml_html_clean` 依赖以解决兼容性问题
## [2.2.2] - 2026-01-31
### 修复
- 🐛 修复代理配置区分大小写问题 (fixes #211)
## [2.2.1] - 2026-01-31
### 修复
- 🐛 **YFinance 兼容性修复** (PR #210, fixes #209)
- 修复新版 yfinance 返回 MultiIndex 列名导致的数据解析错误
## [2.2.0] - 2026-01-31
### 新增
- 🔄 **多源回退策略增强**
- 实现了更健壮的数据获取回退机制 (feat: multi-source fallback strategy)
- 优化了数据源故障时的自动切换逻辑
### 修复
- 🐛 修复 analyzer 运行后无法通过改 .env 文件的 stock_list 内容调整跟踪的股票
## [2.1.14] - 2026-01-31
### 文档
- 📝 更新 README 和优化 auto-tag 规则
## [2.1.13] - 2026-01-31
### 修复
- 🐛 **Tushare 优先级与实时行情** (Fixed #185)
- 修复 Tushare 数据源优先级设置问题
- 修复 Tushare 实时行情获取功能
## [2.1.12] - 2026-01-30
### 修复
- 🌐 修复代理配置在某些情况下的区分大小写问题
- 🌐 修复本地环境禁用代理的逻辑
## [2.1.11] - 2026-01-30
### 优化
- 🚀 **飞书消息流优化** (PR #192)
- 优化飞书 Stream 模式的消息类型处理
- 修改 Stream 消息模式默认为关闭,防止配置错误运行时报错
## [2.1.10] - 2026-01-30
### 合并
- 📦 合并 PR #154 贡献
## [2.1.9] - 2026-01-30
### 新增
- 💬 **微信文本消息支持** (PR #137)
- 新增微信推送的纯文本消息类型支持
- 添加 `WECHAT_MSG_TYPE` 配置项
## [2.1.8] - 2026-01-30
### 修复
- 🐛 修正日志中 API 提供商显示错误 (PR #197)
## [2.1.7] - 2026-01-30
### 修复
- 🌐 禁用本地环境的代理设置,避免网络连接问题
## [2.1.6] - 2026-01-29
### 新增
- 📡 **Pytdx 数据源 (Priority 2)**
- 新增通达信数据源,免费无需注册
- 多服务器自动切换
- 支持实时行情和历史数据
- 🏷️ **多源股票名称解析**
- DataFetcherManager 新增 `get_stock_name()` 方法
- 新增 `batch_get_stock_names()` 批量查询
- 自动在多数据源间回退
- Tushare 和 Baostock 新增股票名称/列表方法
- 🔍 **增强搜索回退**
- 新增 `search_stock_price_fallback()` 用于数据源全部失败时
- 新增搜索维度:市场分析、行业分析
- 最大搜索次数从 3 增加到 5
- 改进搜索结果格式(每维度 4 条结果)
### 改进
- 更新搜索查询模板以提高相关性
- 增强 `format_intel_report()` 输出结构
## [2.1.5] - 2026-01-29
### 新增
- 📡 新增 Pytdx 数据源和多源股票名称解析功能
## [2.1.4] - 2026-01-29
### 文档
- 📝 更新赞助商信息
## [2.1.3] - 2026-01-28
### 文档
- 📝 重构 README 布局
- 🌐 新增繁体中文翻译 (README_CHT.md)
### 修复
- 🐛 修复 WebUI 无法输入美股代码问题
- 输入框逻辑改成所有字母都转换成大写
- 支持 `.` 的输入(如 `BRK.B`
## [2.1.2] - 2026-01-27
### 修复
- 🐛 修复个股分析推送失败和报告路径问题 (fixes #166)
- 🐛 修改 CR 错误,确保微信消息最大字节配置生效
## [2.1.1] - 2026-01-26
### 新增
- 🔧 添加 GitHub Actions auto-tag 工作流
- 📡 添加 yfinance 兜底数据源及数据缺失警告
### 修复
- 🐳 修复 docker-compose 路径和文档命令
- 🐳 Dockerfile 补充 copy src 文件夹 (fixes #145)
## [2.1.0] - 2026-01-25
### 新增
- 🇺🇸 **美股分析支持**
- 支持美股代码直接输入(如 `AAPL`, `TSLA`
- 使用 YFinance 作为美股数据源
- 📈 **MACD 和 RSI 技术指标**
- MACD趋势确认、金叉死叉信号零轴上金叉⭐、金叉✅、死叉❌
- RSI超买超卖判断超卖⭐、强势✅、超买⚠
- 指标信号纳入综合评分系统
- 🎮 **Discord 推送支持** (PR #124, #125, #144)
- 支持 Discord Webhook 和 Bot API 两种方式
- 通过 `DISCORD_WEBHOOK_URL``DISCORD_BOT_TOKEN` + `DISCORD_CHANNEL_ID` 配置
- 🤖 **机器人命令交互**
- 钉钉机器人支持 `/分析 股票代码` 命令触发分析
- 支持 Stream 长连接模式
- 🌡️ **AI 温度参数可配置** (PR #142)
- 支持自定义 AI 模型温度参数
- 🐳 **Zeabur 部署支持**
- 添加 Zeabur 镜像部署工作流
- 支持 commit hash 和 latest 双标签
### 重构
- 🏗️ **项目结构优化**
- 核心代码移至 `src/` 目录,根目录更清爽
- 文档移至 `docs/` 目录
- Docker 配置移至 `docker/` 目录
- 修复所有 import 路径,保持向后兼容
- 🔄 **数据源架构升级**
- 新增数据源熔断机制,单数据源连续失败自动切换
- 实时行情缓存优化,批量预取减少 API 调用
- 网络代理智能分流,国内接口自动直连
- 🤖 Discord 机器人重构为平台适配器架构
### 修复
- 🌐 **网络稳定性增强**
- 自动检测代理配置,对国内行情接口强制直连
- 修复 EfinanceFetcher 偶发的 `ProtocolError`
- 增加对底层网络错误的捕获和重试机制
- 📧 **邮件渲染优化**
- 修复邮件中表格不渲染问题 (#134)
- 优化邮件排版,更紧凑美观
- 📢 **企业微信推送修复**
- 修复大盘复盘推送不完整问题
- 增强消息分割逻辑,支持更多标题格式
- 增加分批发送间隔,避免限流丢失
- 👷 **CI/CD 修复**
- 修复 GitHub Actions 中路径引用的错误
## [2.0.0] - 2026-01-24
### 新增
- 🇺🇸 **美股分析支持**
- 支持美股代码直接输入(如 `AAPL`, `TSLA`
- 使用 YFinance 作为美股数据源
- 🤖 **机器人命令交互** (PR #113)
- 钉钉机器人支持 `/分析 股票代码` 命令触发分析
- 支持 Stream 长连接模式
- 支持选择精简报告或完整报告
- 🎮 **Discord 推送支持** (PR #124)
- 支持 Discord Webhook 推送
- 添加 Discord 环境变量到工作流
### 修复
- 🐳 修复 WebUI 在 Docker 中绑定 0.0.0.0 (fixed #118)
- 🔔 修复飞书长连接通知问题
- 🐛 修复 `analysis_delay` 未定义错误
- 🔧 启动时 config.py 检测通知渠道,修复已配置自定义渠道情况下仍然提示未配置问题
### 改进
- 🔧 优化 Tushare 优先级判断逻辑,提升封装性
- 🔧 修复 Tushare 优先级提升后仍排在 Efinance 之后的问题
- ⚙️ 配置 TUSHARE_TOKEN 时自动提升 Tushare 数据源优先级
- ⚙️ 实现 4 个用户反馈 issue (#112, #128, #38, #119)
## [1.6.0] - 2026-01-19
### 新增
- 🖥️ WebUI 管理界面及 API 支持PR #72
- 全新 Web 架构分层设计Server/Router/Handler/Service
- 核心 API支持 `/analysis` (触发分析), `/tasks` (查询进度), `/health` (健康检查)
- 交互界面:支持页面直接输入代码并触发分析,实时展示进度
- 运行模式:新增 `--webui-only` 模式,仅启动 Web 服务
- 解决了 [#70](https://github.com/ZhuLinsen/daily_stock_analysis/issues/70) 的核心需求(提供触发分析的接口)
- ⚙️ GitHub Actions 配置灵活性增强([#79](https://github.com/ZhuLinsen/daily_stock_analysis/issues/79)
- 支持从 Repository Variables 读取非敏感配置(如 STOCK_LIST, GEMINI_MODEL
- 保持对 Secrets 的向下兼容
### 修复
- 🐛 修复企业微信/飞书报告截断问题([#73](https://github.com/ZhuLinsen/daily_stock_analysis/issues/73)
- 移除 notification.py 中不必要的长度硬截断逻辑
- 依赖底层自动分片机制处理长消息
- 🐛 修复 GitHub Workflow 环境变量缺失([#80](https://github.com/ZhuLinsen/daily_stock_analysis/issues/80)
- 修复 `CUSTOM_WEBHOOK_BEARER_TOKEN` 未正确传递到 Runner 的问题
## [1.5.0] - 2026-01-17
### 新增
- 📲 单股推送模式([#55](https://github.com/ZhuLinsen/daily_stock_analysis/issues/55)
- 每分析完一只股票立即推送,不用等全部分析完
- 命令行参数:`--single-notify`
- 环境变量:`SINGLE_STOCK_NOTIFY=true`
- 🔐 自定义 Webhook Bearer Token 认证([#51](https://github.com/ZhuLinsen/daily_stock_analysis/issues/51)
- 支持需要 Token 认证的 Webhook 端点
- 环境变量:`CUSTOM_WEBHOOK_BEARER_TOKEN`
## [1.4.0] - 2026-01-17
### 新增
- 📱 Pushover 推送支持PR #26
- 支持 iOS/Android 跨平台推送
- 通过 `PUSHOVER_USER_KEY``PUSHOVER_API_TOKEN` 配置
- 🔍 博查搜索 API 集成PR #27
- 中文搜索优化,支持 AI 摘要
- 通过 `BOCHA_API_KEYS` 配置
- 📊 Efinance 数据源支持PR #59
- 新增 efinance 作为数据源选项
- 🇭🇰 港股支持PR #17
- 支持 5 位代码或 HK 前缀(如 `hk00700`、`hk1810`
### 修复
- 🔧 飞书 Markdown 渲染优化PR #34
- 使用交互卡片和格式化器修复渲染问题
- ♻️ 股票列表热重载PR #42 修复)
- 分析前自动重载 `STOCK_LIST` 配置
- 🐛 钉钉 Webhook 20KB 限制处理
- 长消息自动分块发送,避免被截断
- 🔄 AkShare API 重试机制增强
- 添加失败缓存,避免重复请求失败接口
### 改进
- 📝 README 精简优化
- 高级配置移至 `docs/full-guide.md`
## [1.3.0] - 2026-01-12
### 新增
- 🔗 自定义 Webhook 支持
- 支持任意 POST JSON 的 Webhook 端点
- 自动识别钉钉、Discord、Slack、Bark 等常见服务格式
- 支持配置多个 Webhook逗号分隔
- 通过 `CUSTOM_WEBHOOK_URLS` 环境变量配置
### 修复
- 📝 企业微信长消息分批发送
- 解决自选股过多时内容超过 4096 字符限制导致推送失败的问题
- 智能按股票分析块分割,每批添加分页标记(如 1/3, 2/3
- 批次间隔 1 秒,避免触发频率限制
## [1.2.0] - 2026-01-11
### 新增
- 📢 多渠道推送支持
- 企业微信 Webhook
- 飞书 Webhook新增
- 邮件 SMTP新增
- 自动识别渠道类型,配置更简单
### 改进
- 统一使用 `NOTIFICATION_URL` 配置,兼容旧的 `WECHAT_WEBHOOK_URL`
- 邮件支持 Markdown 转 HTML 渲染
## [1.1.0] - 2026-01-11
### 新增
- 🤖 OpenAI 兼容 API 支持
- 支持 DeepSeek、通义千问、Moonshot、智谱 GLM 等
- Gemini 和 OpenAI 格式二选一
- 自动降级重试机制
## [1.0.0] - 2026-01-10
### 新增
- 🎯 AI 决策仪表盘分析
- 一句话核心结论
- 精确买入/止损/目标点位
- 检查清单(✅⚠️❌)
- 分持仓建议(空仓者 vs 持仓者)
- 📊 大盘复盘功能
- 主要指数行情
- 涨跌统计
- 板块涨跌榜
- AI 生成复盘报告
- 🔍 多数据源支持
- AkShare主数据源免费
- Tushare Pro
- Baostock
- YFinance
- 📰 新闻搜索服务
- Tavily API
- SerpAPI
- 💬 企业微信机器人推送
- ⏰ 定时任务调度
- 🐳 Docker 部署支持
- 🚀 GitHub Actions 零成本部署
### 技术特性
- Gemini AI 模型gemini-3-flash-preview
- 429 限流自动重试 + 模型切换
- 请求间延时防封禁
- 多 API Key 负载均衡
- SQLite 本地数据存储
---
[Unreleased]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.3.0...HEAD
[2.3.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.5...v2.3.0
[2.2.5]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.4...v2.2.5
[2.2.4]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.3...v2.2.4
[2.2.3]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.2...v2.2.3
[2.2.2]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.1...v2.2.2
[2.2.1]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.2.0...v2.2.1
[2.2.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.14...v2.2.0
[2.1.14]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.13...v2.1.14
[2.1.13]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.12...v2.1.13
[2.1.12]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.11...v2.1.12
[2.1.11]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.10...v2.1.11
[2.1.10]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.9...v2.1.10
[2.1.9]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.8...v2.1.9
[2.1.8]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.7...v2.1.8
[2.1.7]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.6...v2.1.7
[2.1.6]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.5...v2.1.6
[2.1.5]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.4...v2.1.5
[2.1.4]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.3...v2.1.4
[2.1.3]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.2...v2.1.3
[2.1.2]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.1...v2.1.2
[2.1.1]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.1.0...v2.1.1
[2.1.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.6.0...v2.0.0
[1.6.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.5.0...v1.6.0
[1.5.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.3.0...v1.4.0
[1.3.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/ZhuLinsen/daily_stock_analysis/releases/tag/v1.0.0