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.

720 lines
23 KiB

This file contains ambiguous Unicode 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.

# 📖 完整配置与部署指南
本文档包含 A股智能分析系统的完整配置说明适合需要高级功能或特殊部署方式的用户。
> 💡 快速上手请参考 [README.md](../README.md),本文档为进阶配置。
## <20> 项目结构
```
daily_stock_analysis/
├── main.py # 主程序入口
├── src/ # 核心业务逻辑
│ ├── analyzer.py # AI 分析器
│ ├── config.py # 配置管理
│ ├── notification.py # 消息推送
│ └── ...
├── data_provider/ # 多数据源适配器
├── bot/ # 机器人交互模块
├── api/ # FastAPI 后端服务
├── apps/dsa-web/ # React 前端
├── docker/ # Docker 配置
├── docs/ # 项目文档
└── .github/workflows/ # GitHub Actions
```
## 📑 目录
- [项目结构](#项目结构)
- [GitHub Actions 详细配置](#github-actions-详细配置)
- [环境变量完整列表](#环境变量完整列表)
- [Docker 部署](#docker-部署)
- [本地运行详细配置](#本地运行详细配置)
- [定时任务配置](#定时任务配置)
- [通知渠道详细配置](#通知渠道详细配置)
- [数据源配置](#数据源配置)
- [高级功能](#高级功能)
- [回测功能](#回测功能)
- [本地 WebUI 管理界面](#本地-webui-管理界面)
---
## GitHub Actions 详细配置
### 1. Fork 本仓库
点击右上角 `Fork` 按钮
### 2. 配置 Secrets
进入你 Fork 的仓库 → `Settings``Secrets and variables``Actions``New repository secret`
<div align="center">
<img src="../sources/secret_config.png" alt="GitHub Secrets 配置示意图" width="600">
</div>
#### AI 模型配置(二选一)
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `GEMINI_API_KEY` | [Google AI Studio](https://aistudio.google.com/) 获取免费 Key | ✅* |
| `OPENAI_API_KEY` | OpenAI 兼容 API Key支持 DeepSeek、通义千问等 | 可选 |
| `OPENAI_BASE_URL` | OpenAI 兼容 API 地址(如 `https://api.deepseek.com/v1` | 可选 |
| `OPENAI_MODEL` | 模型名称(如 `deepseek-chat` | 可选 |
> *注:`GEMINI_API_KEY` 和 `OPENAI_API_KEY` 至少配置一个
#### 通知渠道配置(可同时配置多个,全部推送)
| 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[创建方法](https://support.discord.com/hc/en-us/articles/228383668) | 可选 |
| `DISCORD_BOT_TOKEN` | Discord Bot Token与 Webhook 二选一) | 可选 |
| `DISCORD_CHANNEL_ID` | Discord Channel ID使用 Bot 时需要) | 可选 |
| `EMAIL_SENDER` | 发件人邮箱(如 `xxx@qq.com` | 可选 |
| `EMAIL_PASSWORD` | 邮箱授权码(非登录密码) | 可选 |
| `EMAIL_RECEIVERS` | 收件人邮箱(多个用逗号分隔,留空则发给自己) | 可选 |
| `EMAIL_SENDER_NAME` | 发件人显示名称默认daily_stock_analysis股票分析助手 | 可选 |
| `PUSHPLUS_TOKEN` | PushPlus Token[获取地址](https://www.pushplus.plus),国内推送服务) | 可选 |
| `SERVERCHAN3_SENDKEY` | Server酱³ Sendkey[获取地址](https://sc3.ft07.com/)手机APP推送服务 | 可选 |
| `CUSTOM_WEBHOOK_URLS` | 自定义 Webhook支持钉钉等多个用逗号分隔 | 可选 |
| `CUSTOM_WEBHOOK_BEARER_TOKEN` | 自定义 Webhook 的 Bearer Token用于需要认证的 Webhook | 可选 |
> *注:至少配置一个渠道,配置多个则同时推送
#### 推送行为配置
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `SINGLE_STOCK_NOTIFY` | 单股推送模式:设为 `true` 则每分析完一只股票立即推送 | 可选 |
| `REPORT_TYPE` | 报告类型:`simple`(精简) 或 `full`(完整)Docker环境推荐设为 `full` | 可选 |
| `ANALYSIS_DELAY` | 个股分析和大盘分析之间的延迟避免API限流`10` | 可选 |
| `MARKDOWN_TO_IMAGE_CHANNELS` | 将 Markdown 转为图片发送的渠道用逗号分隔telegram,wechat,custom,email需安装 wkhtmltopdf | 可选 |
| `MARKDOWN_TO_IMAGE_MAX_CHARS` | 超过此长度不转图片,避免超大图片(默认 15000 | 可选 |
#### 其他配置
| Secret 名称 | 说明 | 必填 |
|------------|------|:----:|
| `STOCK_LIST` | 自选股代码,如 `600519,300750,002594` | ✅ |
| `TAVILY_API_KEYS` | [Tavily](https://tavily.com/) 搜索 API新闻搜索 | 推荐 |
| `BOCHA_API_KEYS` | [博查搜索](https://open.bocha.cn/) Web Search API中文搜索优化支持AI摘要多个key用逗号分隔 | 可选 |
| `BRAVE_API_KEYS` | [Brave Search](https://brave.com/search/api/) API隐私优先美股优化多个key用逗号分隔 | 可选 |
| `SERPAPI_API_KEYS` | [SerpAPI](https://serpapi.com/baidu-search-api?utm_source=github_daily_stock_analysis) 备用搜索 | 可选 |
| `TUSHARE_TOKEN` | [Tushare Pro](https://tushare.pro/weborder/#/login?reg=834638 ) Token | 可选 |
#### ✅ 最小配置示例
如果你想快速开始,最少需要配置以下项:
1. **AI 模型**`GEMINI_API_KEY`(推荐)或 `OPENAI_API_KEY`
2. **通知渠道**:至少配置一个,如 `WECHAT_WEBHOOK_URL``EMAIL_SENDER` + `EMAIL_PASSWORD`
3. **股票列表**`STOCK_LIST`(必填)
4. **搜索 API**`TAVILY_API_KEYS`(强烈推荐,用于新闻搜索)
> 💡 配置完以上 4 项即可开始使用!
### 3. 启用 Actions
1. 进入你 Fork 的仓库
2. 点击顶部的 `Actions` 标签
3. 如果看到提示,点击 `I understand my workflows, go ahead and enable them`
### 4. 手动测试
1. 进入 `Actions` 标签
2. 左侧选择 `每日股票分析` workflow
3. 点击右侧的 `Run workflow` 按钮
4. 选择运行模式
5. 点击绿色的 `Run workflow` 确认
### 5. 完成!
默认每个工作日 **18:00北京时间** 自动执行。
---
## 环境变量完整列表
### AI 模型配置
| 变量名 | 说明 | 默认值 | 必填 |
|--------|------|--------|:----:|
| `GEMINI_API_KEY` | Google Gemini API Key | - | ✅* |
| `GEMINI_MODEL` | 主模型名称 | `gemini-3-flash-preview` | 否 |
| `GEMINI_MODEL_FALLBACK` | 备选模型 | `gemini-2.5-flash` | 否 |
| `OPENAI_API_KEY` | OpenAI 兼容 API Key | - | 可选 |
| `OPENAI_BASE_URL` | OpenAI 兼容 API 地址 | - | 可选 |
| `OPENAI_MODEL` | OpenAI 模型名称 | `gpt-4o` | 可选 |
> *注:`GEMINI_API_KEY` 和 `OPENAI_API_KEY` 至少配置一个
### 通知渠道配置
| 变量名 | 说明 | 必填 |
|--------|------|:----:|
| `WECHAT_WEBHOOK_URL` | 企业微信机器人 Webhook URL | 可选 |
| `FEISHU_WEBHOOK_URL` | 飞书机器人 Webhook URL | 可选 |
| `TELEGRAM_BOT_TOKEN` | Telegram Bot Token | 可选 |
| `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_CHANNEL_ID` | Discord Channel ID使用 Bot 时需要) | 可选 |
| `EMAIL_SENDER` | 发件人邮箱 | 可选 |
| `EMAIL_PASSWORD` | 邮箱授权码(非登录密码) | 可选 |
| `EMAIL_RECEIVERS` | 收件人邮箱(逗号分隔,留空发给自己) | 可选 |
| `EMAIL_SENDER_NAME` | 发件人显示名称 | 可选 |
| `STOCK_GROUP_N` / `EMAIL_GROUP_N` | 股票分组发往不同邮箱Issue #268),如 `STOCK_GROUP_1=600519,300750``EMAIL_GROUP_1=user1@example.com` 配对 | 可选 |
| `CUSTOM_WEBHOOK_URLS` | 自定义 Webhook逗号分隔 | 可选 |
| `CUSTOM_WEBHOOK_BEARER_TOKEN` | 自定义 Webhook Bearer Token | 可选 |
| `PUSHOVER_USER_KEY` | Pushover 用户 Key | 可选 |
| `PUSHOVER_API_TOKEN` | Pushover API Token | 可选 |
| `PUSHPLUS_TOKEN` | PushPlus Token国内推送服务 | 可选 |
| `SERVERCHAN3_SENDKEY` | Server酱³ Sendkey | 可选 |
#### 飞书云文档配置(可选,解决消息截断问题)
| 变量名 | 说明 | 必填 |
|--------|------|:----:|
| `FEISHU_APP_ID` | 飞书应用 ID | 可选 |
| `FEISHU_APP_SECRET` | 飞书应用 Secret | 可选 |
| `FEISHU_FOLDER_TOKEN` | 飞书云盘文件夹 Token | 可选 |
> 飞书云文档配置步骤:
> 1. 在 [飞书开发者后台](https://open.feishu.cn/app) 创建应用
> 2. 配置 GitHub Secrets
> 3. 创建群组并添加应用机器人
> 4. 在云盘文件夹中添加群组为协作者(可管理权限)
### 搜索服务配置
| 变量名 | 说明 | 必填 |
|--------|------|:----:|
| `TAVILY_API_KEYS` | Tavily 搜索 API Key推荐 | 推荐 |
| `BOCHA_API_KEYS` | 博查搜索 API Key中文优化 | 可选 |
| `BRAVE_API_KEYS` | Brave Search API Key美股优化 | 可选 |
| `SERPAPI_API_KEYS` | SerpAPI 备用搜索 | 可选 |
### 数据源配置
| 变量名 | 说明 | 必填 |
|--------|------|:----:|
| `TUSHARE_TOKEN` | Tushare Pro Token | 可选 |
### 其他配置
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `STOCK_LIST` | 自选股代码(逗号分隔) | - |
| `MAX_WORKERS` | 并发线程数 | `3` |
| `MARKET_REVIEW_ENABLED` | 启用大盘复盘 | `true` |
| `SCHEDULE_ENABLED` | 启用定时任务 | `false` |
| `SCHEDULE_TIME` | 定时执行时间 | `18:00` |
| `LOG_DIR` | 日志目录 | `./logs` |
---
## Docker 部署
Dockerfile 使用多阶段构建,前端会在构建镜像时自动打包并内置到 `static/`
如需覆盖静态资源,可挂载本地 `static/` 到容器内 `/app/static`
### 快速启动
```bash
# 1. 克隆仓库
git clone https://github.com/ZhuLinsen/daily_stock_analysis.git
cd daily_stock_analysis
# 2. 配置环境变量
cp .env.example .env
vim .env # 填入 API Key 和配置
# 3. 启动容器
docker-compose -f ./docker/docker-compose.yml up -d server # Web 服务模式(推荐,提供 API 与 WebUI
docker-compose -f ./docker/docker-compose.yml up -d analyzer # 定时任务模式
docker-compose -f ./docker/docker-compose.yml up -d # 同时启动两种模式
# 4. 访问 WebUI
# http://localhost:8000
# 5. 查看日志
docker-compose -f ./docker/docker-compose.yml logs -f server
```
### 运行模式说明
| 命令 | 说明 | 端口 |
|------|------|------|
| `docker-compose -f ./docker/docker-compose.yml up -d server` | Web 服务模式,提供 API 与 WebUI | 8000 |
| `docker-compose -f ./docker/docker-compose.yml up -d analyzer` | 定时任务模式,每日自动执行 | - |
| `docker-compose -f ./docker/docker-compose.yml up -d` | 同时启动两种模式 | 8000 |
### Docker Compose 配置
`docker-compose.yml` 使用 YAML 锚点复用配置:
```yaml
version: '3.8'
x-common: &common
build:
context: ..
dockerfile: docker/Dockerfile
restart: unless-stopped
env_file:
- ../.env
environment:
- TZ=Asia/Shanghai
volumes:
- ../data:/app/data
- ../logs:/app/logs
- ../reports:/app/reports
- ../.env:/app/.env
services:
# 定时任务模式
analyzer:
<<: *common
container_name: stock-analyzer
# FastAPI 模式
server:
<<: *common
container_name: stock-server
command: ["python", "main.py", "--serve-only", "--host", "0.0.0.0", "--port", "8000"]
ports:
- "8000:8000"
```
### 常用命令
```bash
# 查看运行状态
docker-compose -f ./docker/docker-compose.yml ps
# 查看日志
docker-compose -f ./docker/docker-compose.yml logs -f server
# 停止服务
docker-compose -f ./docker/docker-compose.yml down
# 重建镜像(代码更新后)
docker-compose -f ./docker/docker-compose.yml build --no-cache
docker-compose -f ./docker/docker-compose.yml up -d server
```
### 手动构建镜像
```bash
docker build -f docker/Dockerfile -t stock-analysis .
docker run -d --env-file .env -p 8000:8000 -v ./data:/app/data stock-analysis python main.py --serve-only --host 0.0.0.0 --port 8000
```
---
## 本地运行详细配置
### 安装依赖
```bash
# Python 3.10+ 推荐
pip install -r requirements.txt
# 或使用 conda
conda create -n stock python=3.10
conda activate stock
pip install -r requirements.txt
```
### 命令行参数
```bash
python main.py # 完整分析(个股 + 大盘复盘)
python main.py --market-review # 仅大盘复盘
python main.py --no-market-review # 仅个股分析
python main.py --stocks 600519,300750 # 指定股票
python main.py --dry-run # 仅获取数据,不 AI 分析
python main.py --no-notify # 不发送推送
python main.py --schedule # 定时任务模式
python main.py --debug # 调试模式(详细日志)
python main.py --workers 5 # 指定并发数
```
---
## 定时任务配置
### GitHub Actions 定时
编辑 `.github/workflows/daily_analysis.yml`:
```yaml
schedule:
# UTC 时间,北京时间 = UTC + 8
- cron: '0 10 * * 1-5' # 周一到周五 18:00北京时间
```
常用时间对照:
| 北京时间 | UTC cron 表达式 |
|---------|----------------|
| 09:30 | `'30 1 * * 1-5'` |
| 12:00 | `'0 4 * * 1-5'` |
| 15:00 | `'0 7 * * 1-5'` |
| 18:00 | `'0 10 * * 1-5'` |
| 21:00 | `'0 13 * * 1-5'` |
### 本地定时任务
```bash
# 启动定时模式(默认 18:00 执行)
python main.py --schedule
# 或使用 crontab
crontab -e
# 添加0 18 * * 1-5 cd /path/to/project && python main.py
```
---
## 通知渠道详细配置
### 企业微信
1. 在企业微信群聊中添加"群机器人"
2. 复制 Webhook URL
3. 设置 `WECHAT_WEBHOOK_URL`
### 飞书
1. 在飞书群聊中添加"自定义机器人"
2. 复制 Webhook URL
3. 设置 `FEISHU_WEBHOOK_URL`
### Telegram
1.@BotFather 对话创建 Bot
2. 获取 Bot Token
3. 获取 Chat ID可通过 @userinfobot
4. 设置 `TELEGRAM_BOT_TOKEN``TELEGRAM_CHAT_ID`
5. (可选) 如需发送到 Topic设置 `TELEGRAM_MESSAGE_THREAD_ID` (从 Topic 链接末尾获取)
### 邮件
1. 开启邮箱的 SMTP 服务
2. 获取授权码(非登录密码)
3. 设置 `EMAIL_SENDER`、`EMAIL_PASSWORD`、`EMAIL_RECEIVERS`
支持的邮箱:
- QQ 邮箱smtp.qq.com:465
- 163 邮箱smtp.163.com:465
- Gmailsmtp.gmail.com:587
**股票分组发往不同邮箱**Issue #268,可选):
配置 `STOCK_GROUP_N``EMAIL_GROUP_N` 可实现不同股票组的报告发送到不同邮箱,例如多人共享分析时互不干扰。大盘复盘会发往所有配置的邮箱。
```bash
STOCK_GROUP_1=600519,300750
EMAIL_GROUP_1=user1@example.com
STOCK_GROUP_2=002594,AAPL
EMAIL_GROUP_2=user2@example.com
```
### 自定义 Webhook
支持任意 POST JSON 的 Webhook包括
- 钉钉机器人
- Discord Webhook
- Slack Webhook
- BarkiOS 推送)
- 自建服务
设置 `CUSTOM_WEBHOOK_URLS`,多个用逗号分隔。
### Discord
Discord 支持两种方式推送:
**方式一Webhook推荐简单**
1. 在 Discord 频道设置中创建 Webhook
2. 复制 Webhook URL
3. 配置环境变量:
```bash
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/xxx/yyy
```
**方式二Bot API需要更多权限**
1. 在 [Discord Developer Portal](https://discord.com/developers/applications) 创建应用
2. 创建 Bot 并获取 Token
3. 邀请 Bot 到服务器
4. 获取频道 ID开发者模式下右键频道复制
5. 配置环境变量:
```bash
DISCORD_BOT_TOKEN=your_bot_token
DISCORD_CHANNEL_ID=your_channel_id
```
### PushoveriOS/Android 推送)
[Pushover](https://pushover.net/) 是一个跨平台的推送服务,支持 iOS 和 Android。
1. 注册 Pushover 账号并下载 App
2. 在 [Pushover Dashboard](https://pushover.net/) 获取 User Key
3. 创建 Application 获取 API Token
4. 配置环境变量:
```bash
PUSHOVER_USER_KEY=your_user_key
PUSHOVER_API_TOKEN=your_api_token
```
特点:
- 支持 iOS/Android 双平台
- 支持通知优先级和声音设置
- 免费额度足够个人使用(每月 10,000 条)
- 消息可保留 7 天
### Markdown 转图片(可选)
配置 `MARKDOWN_TO_IMAGE_CHANNELS` 可将报告以图片形式发送至不支持 Markdown 的渠道telegram, wechat, custom, email
**依赖安装**
1. **imgkit**:已包含在 `requirements.txt`,执行 `pip install -r requirements.txt` 时会自动安装
2. **wkhtmltopdf**:系统级依赖,需手动安装:
- **macOS**`brew install wkhtmltopdf`
- **Debian/Ubuntu**`apt install wkhtmltopdf`
未安装或安装失败时,将自动回退为 Markdown 文本发送。
---
## 数据源配置
系统默认使用 AkShare免费也支持其他数据源
### AkShare默认
- 免费,无需配置
- 数据来源:东方财富爬虫
### Tushare Pro
- 需要注册获取 Token
- 更稳定,数据更全
- 设置 `TUSHARE_TOKEN`
### Baostock
- 免费,无需配置
- 作为备用数据源
### YFinance
- 免费,无需配置
- 支持美股/港股数据
---
## 高级功能
### 港股支持
使用 `hk` 前缀指定港股代码:
```bash
STOCK_LIST=600519,hk00700,hk01810
```
### 多模型切换
配置多个模型,系统自动切换:
```bash
# Gemini主力
GEMINI_API_KEY=xxx
GEMINI_MODEL=gemini-3-flash-preview
# OpenAI 兼容(备选)
OPENAI_API_KEY=xxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chat
```
### 调试模式
```bash
python main.py --debug
```
日志文件位置:
- 常规日志:`logs/stock_analysis_YYYYMMDD.log`
- 调试日志:`logs/stock_analysis_debug_YYYYMMDD.log`
---
## 回测功能
回测模块自动对历史 AI 分析记录进行事后验证,评估分析建议的准确性。
### 工作原理
1. 选取已过冷却期(默认 14 天)的 `AnalysisHistory` 记录
2. 获取分析日之后的日线数据(前向 K 线)
3. 根据操作建议推断预期方向,与实际走势对比
4. 评估止盈/止损命中情况,模拟执行收益
5. 汇总为整体和单股两个维度的表现指标
### 操作建议映射
| 操作建议 | 仓位推断 | 预期方向 | 胜利条件 |
|---------|---------|---------|---------|
| 买入/加仓/strong buy | long | up | 涨幅 ≥ 中性带 |
| 卖出/减仓/strong sell | cash | down | 跌幅 ≥ 中性带 |
| 持有/hold | long | not_down | 未显著下跌 |
| 观望/等待/wait | cash | flat | 价格在中性带内 |
### 配置
`.env` 中设置以下变量(均有默认值,可选):
| 变量 | 默认值 | 说明 |
|------|-------|------|
| `BACKTEST_ENABLED` | `true` | 是否在每日分析后自动运行回测 |
| `BACKTEST_EVAL_WINDOW_DAYS` | `10` | 评估窗口(交易日数) |
| `BACKTEST_MIN_AGE_DAYS` | `14` | 仅回测 N 天前的记录,避免数据不完整 |
| `BACKTEST_ENGINE_VERSION` | `v1` | 引擎版本号,升级逻辑时用于区分结果 |
| `BACKTEST_NEUTRAL_BAND_PCT` | `2.0` | 中性区间阈值(%±2% 内视为震荡 |
### 自动运行
回测在每日分析流程完成后自动触发(非阻塞,失败不影响通知推送)。也可通过 API 手动触发。
### 评估指标
| 指标 | 说明 |
|------|------|
| `direction_accuracy_pct` | 方向预测准确率(预期方向与实际一致) |
| `win_rate_pct` | 胜率(胜 / (胜+负),不含中性) |
| `avg_stock_return_pct` | 平均股票收益率 |
| `avg_simulated_return_pct` | 平均模拟执行收益率(含止盈止损退出) |
| `stop_loss_trigger_rate` | 止损触发率(仅统计配置了止损的记录) |
| `take_profit_trigger_rate` | 止盈触发率(仅统计配置了止盈的记录) |
---
## FastAPI API 服务
FastAPI 提供 RESTful API 服务,支持配置管理和触发分析。
### 启动方式
| 命令 | 说明 |
|------|------|
| `python main.py --serve` | 启动 API 服务 + 执行一次完整分析 |
| `python main.py --serve-only` | 仅启动 API 服务,手动触发分析 |
### 功能特性
- 📝 **配置管理** - 查看/修改自选股列表
- 🚀 **快速分析** - 通过 API 接口触发分析
- 📊 **实时进度** - 分析任务状态实时更新,支持多任务并行
- 📈 **回测验证** - 评估历史分析准确率,查询方向胜率与模拟收益
- 🔗 **API 文档** - 访问 `/docs` 查看 Swagger UI
### API 接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/v1/analysis/analyze` | POST | 触发股票分析 |
| `/api/v1/analysis/tasks` | GET | 查询任务列表 |
| `/api/v1/analysis/status/{task_id}` | GET | 查询任务状态 |
| `/api/v1/history` | GET | 查询分析历史 |
| `/api/v1/backtest/run` | POST | 触发回测 |
| `/api/v1/backtest/results` | GET | 查询回测结果(分页) |
| `/api/v1/backtest/performance` | GET | 获取整体回测表现 |
| `/api/v1/backtest/performance/{code}` | GET | 获取单股回测表现 |
| `/api/health` | GET | 健康检查 |
| `/docs` | GET | API Swagger 文档 |
**调用示例**
```bash
# 健康检查
curl http://127.0.0.1:8000/api/health
# 触发分析A股
curl -X POST http://127.0.0.1:8000/api/v1/analysis/analyze \
-H 'Content-Type: application/json' \
-d '{"stock_code": "600519"}'
# 查询任务状态
curl http://127.0.0.1:8000/api/v1/analysis/status/<task_id>
# 触发回测(全部股票)
curl -X POST http://127.0.0.1:8000/api/v1/backtest/run \
-H 'Content-Type: application/json' \
-d '{"force": false}'
# 触发回测(指定股票)
curl -X POST http://127.0.0.1:8000/api/v1/backtest/run \
-H 'Content-Type: application/json' \
-d '{"code": "600519", "force": false}'
# 查询整体回测表现
curl http://127.0.0.1:8000/api/v1/backtest/performance
# 查询单股回测表现
curl http://127.0.0.1:8000/api/v1/backtest/performance/600519
# 分页查询回测结果
curl "http://127.0.0.1:8000/api/v1/backtest/results?page=1&limit=20"
```
### 自定义配置
修改默认端口或允许局域网访问:
```bash
python main.py --serve-only --host 0.0.0.0 --port 8888
```
### 支持的股票代码格式
| 类型 | 格式 | 示例 |
|------|------|------|
| A股 | 6位数字 | `600519`、`000001`、`300750` |
| 港股 | hk + 5位数字 | `hk00700`、`hk09988` |
### 注意事项
- 浏览器访问:`http://127.0.0.1:8000`(或您配置的端口)
- 分析完成后自动推送通知到配置的渠道
- 此功能在 GitHub Actions 环境中会自动禁用
---
## 常见问题
### Q: 推送消息被截断?
A: 企业微信/飞书有消息长度限制,系统已自动分段发送。如需完整内容,可配置飞书云文档功能。
### Q: 数据获取失败?
A: AkShare 使用爬虫机制,可能被临时限流。系统已配置重试机制,一般等待几分钟后重试即可。
### Q: 如何添加自选股?
A: 修改 `STOCK_LIST` 环境变量,多个代码用逗号分隔。
### Q: GitHub Actions 没有执行?
A: 检查是否启用了 Actions以及 cron 表达式是否正确(注意是 UTC 时间)。
---
更多问题请 [提交 Issue](https://github.com/ZhuLinsen/daily_stock_analysis/issues)