内容
# 自动新闻 - 印度尼西亚股票市场分析平台
具有**新闻管道 + 技术分析 + MCP 集成**的综合性印度尼西亚股票市场分析平台 - 所有服务均在Docker容器中运行。
**功能:**
- 自动新闻抓取和语义搜索(Milvus 向量数据库)
- 技术分析 API(RSI,MACD,布林线,智能资金流)
- 交易策略筛选(PREOPEN,BPJS,BSJP,日交易设置)
- 用于 AI 助手集成的 MCP 服务器(Claude Desktop/Code)
- 用于程序化访问的 RESTful API
连接任何与 MCP 兼容的 AI 助手(Claude 或其他大型语言模型)并询问: *"显示我今天的印度尼西亚股票市场新闻"* 以获取即时的市场洞察!
## 最新动态
### 主要更新
**🐳 统一 Docker 架构**
- 所有服务现在通过 `docker-compose.yml` 在项目根目录中运行在容器中
- `idx-stock-api` 容器 - 用于数据处理的内部 API(端口 13052)
- `idx-report-server` 容器 - 用于报告的公共 Web UI(端口 3131,只读)
- 用于无缝更新和重启的持久数据卷
- 不再需要手动安装依赖!
**🚀 全面的股票 API**
- **20+ REST 端点** 用于新闻、股票数据、技术分析和筛选
- **端口 13052** - 新的统一 API 服务器(取代旧端口 13051)
- 技术指标:RSI,MACD,布林线,成交量分析
- 盘口分析/智能资金流检测
- 交易策略筛选(PREOPEN,BPJS,BSJP,日交易)
- 市场上下文端点(全球情绪,交易时间,股票列表)
**🔌 增强的 MCP 集成**
- MCP 服务器现在通过 `docker exec` 在 Docker 中运行
- 与 FastAPI 服务器共享相同的 `/app/data` 卷
- 5 个 MCP 工具用于新闻管道管理
- 与 Claude Desktop/Code 无缝集成
**🔐 安全功能**
- 可选的 `CLAUDE_SECRET_KEY` 身份验证,用于敏感端点
- localhost/Docker 网络 IP 白名单,用于 `/api/news/analyze`(openclaw 集成)
- Claude CLI 凭证存储在持久卷中
- 基于环境的配置,通过 `.env` 文件
**📁 重组项目结构**
- 管道脚本移至 `src/helper/`
- 股票 API 代码在 `src/stock_api/`
- 数据持久性在 `volumes/` 目录中
- Docker-compose 在项目根目录(不再有 `rag/` 子目录)
**📋 有关从旧版本迁移的详细指南,请参阅本文末尾的 changelog。**
## 目录
- [完整工作流程](#完整工作流程)
- [快速入门](#快速入门)
- [安装](#安装)
- [选项 1:与 MCP 兼容的 AI 助手(推荐)](#选项-1与-mcp-兼容的-ai-助手推荐)
- [选项 2:手动 CLI 使用](#选项-2手动-cli-使用)
- [选项 3:REST API 使用](#选项-3rest-api-使用)
- [MCP 集成详情](#mcp-集成详情)
- [REST API 集成](#rest-api-集成)
- [文件概述](#文件概述)
- [手动逐步使用](#手动逐步使用)
- [Web 服务器功能](#web-服务器功能)
- [配置](#配置)
- [使用 Cron 进行每日自动化](#使用-cron-进行每日自动化)
- [故障排除](#故障排除)
- [依赖项](#依赖项)
- [示例输出](#示例输出)
- [功能](#功能)
- [未来增强](#未来增强)
- [免责声明](#免责声明)
## 架构概述
```
┌───────────────────────────────────────────────────────────────────────┐
│ Docker Compose 堆栈 │
├───────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌───────────────────────┐ ┌────────────────┐ │
│ │ Milvus 堆栈 │ │ 股票 API 容器 │ │ 报告服务器 │ │
│ │ ───────────── │ │ (idx-stock-api) │ │ (公共 Web) │ │
│ │ • Milvus DB │←─┤ ───────────────── │ │ ────────────── │ │
│ │ • etcd │ │ • FastAPI (13052) │ │ • Web UI │ │
│ │ • MinIO │ │ [仅内部] │ │ (端口 3131) │ │
│ │ • Attu UI │ │ • 新闻管道 │ │ • 只读 │ │
│ └──────────────────┘ │ • 技术 API │ │ /app/data │ │
│ │ • MCP 服务器 │←─┤ • 自动刷新 │ │
│ └───────────────────────┘ └────────────────┘ │
│ │
│ volumes/news_data/(共享) │
│ ├─ news.txt │
│ ├─ news_condensed.txt │
│ └─ daily_report.md ←─────(只读) │
└───────────────────────────────────────────────────────────────────────┘
↑
┌───────────────┼───────────────┐
│ │ │
┌──────▼─────┐ ┌──────▼─────┐ ┌──────▼─────┐
│ MCP │ │ REST API │ │ 浏览器 │
│ 客户端 │ │ 客户端 │ │ (公共) │
│ (Claude) │ │ (curl/app)│ │ :3131 │
└────────────┘ └────────────┘ └────────────┘
```
### 完整工作流程
**新闻管道:**
```
1. 抓取无限文章 → 2. 在 Milvus 中索引 → 3. 语义搜索 → 4. AI 分析
```
**股票分析:**
```
1. 从 Yahoo Finance 获取 OHLCV → 2. 计算指标 → 3. 生成信号 → 4. 返回分析
```
### 为什么选择此架构?
**容器化:** 所有服务都在 Docker 中运行 - 环境一致,部署容易
**安全第一:** 股票 API(端口 13052)保持内部,只有报告服务器(端口 3131)公开暴露
**关注点分离:**
- `idx-stock-api` - 用于数据处理的内部 API(新闻 + 股票分析)
- `idx-report-server` - 具有报告只读访问权限的公共 Web 服务器
**语义搜索:** Milvus 向量数据库高效处理 500+ 篇文章(无令牌限制)
**MCP 集成:** 将 AI 助手直接连接到您的股票分析基础设施
## 快速入门
### 安装
```bash
# 1. 克隆仓库
git clone <您的仓库网址>
cd auto-news
# 2. 创建 Docker 网络(容器间通信所需)
docker network create tunnel
# 3. (可选)为 Claude 分析端点配置安全
cp .env.example .env
# 编辑 .env 并为生产环境设置 CLAUDE_SECRET_KEY
# 4. 启动所有服务(Milvus + 股票 API)
docker-compose up -d
# 5. 验证服务是否正在运行
docker ps
# 您应该看到:etcd,minio,milvus-standalone,attu,idx-stock-api,idx-report-server
# 6. 检查服务健康状况
curl http://localhost:13052/ # 股票 API(内部)
curl http://localhost:3131/ # 报告服务器(公共 Web UI)
# 7. (可选)为 /api/news/analyze 端点配置 Claude CLI
# 这允许 API 使用 Claude 分析新闻
docker exec -it idx-stock-api su appuser -c "claude /login"
# 按照提示使用您的 Claude 账户进行身份验证
```
**服务端口:**
- **13052** - 股票 API(保持内部,仅限 API/MCP 访问)
- **3131** - 报告服务器(可以公开暴露,只读 Web UI)
- **19530** - Milvus(仅内部)
- **1233** - Attu UI(可选,数据库管理)
**注意:**
- 股票 API 容器包括所有依赖项(Python 包、嵌入模型等)- 除非您想在 Docker 外运行脚本,否则无需在本地安装任何内容。
- 报告服务器是一个最小的(~50MB)Alpine 容器,对报告具有只读访问权限。
- Claude CLI 配置是可选的,仅在您要使用 `/api/news/analyze` 端点进行自动 AI 分析时需要。
### 选项 1:与 MCP 兼容的 AI 助手(推荐!)
**将任何与 MCP 兼容的 AI 连接到您的新闻管道 - 现已在 Docker 中运行!**
1. **确保 Docker 容器正在运行:**
```bash
docker ps | grep idx-stock-api
# 应该显示股票 API 容器
```
2. **配置您的 MCP 客户端** - 将以下内容添加到您的 MCP 客户端配置文件中:
- **Claude Code**: `~/.claude/claude_code_config.json`
- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **其他 MCP 客户端**: 请查阅您的客户端文档以获取配置位置
```json
{
"mcpServers": {
"stock-news": {
"type": "stdio",
"command": "docker",
"args": ["exec", "-i", "idx-stock-api", "python3", "/app/mcp_server.py"]
}
}
}
```
**这会:** 使用 `docker exec` 在 `idx-stock-api` 容器中运行 MCP 服务器,允许它与 FastAPI 服务器共享相同的数据卷(`/app/data`)和网络。
3. **重启您的 MCP 客户端**(Claude Desktop,Claude Code 等)
4. **询问您的 AI 助手:**
- *"显示我今天的印度尼西亚股票市场新闻"*
- *"获取最新新闻并检查状态"*
- *"阅读简要新闻报告"*
- *"检查数据文件夹中已经存在哪些文件"*
就这样!您的 AI 助手将自动调用 MCP 工具,这些工具与运行在 Docker 中的 FastAPI 服务器通信。
**可用的 MCP 工具:**
- `get_news_status` - 检查管道状态
- `run_news_pipeline_async` - 在后台启动新闻抓取
- `run_news_pipeline_sync` - 同步运行新闻抓取
- `check_existing_files` - 查看哪些报告已经存在
- `read_news_report` - 读取简要新闻输出
**MCP 兼容性:** 此服务器实现了 [Model Context Protocol](https://modelcontextprotocol.io/) 标准,并与任何兼容的 MCP 客户端配合使用,不仅仅是 Claude。
**示例结果(简化):**
```md
我将为您获取今天的印度尼西亚股票市场新闻。
**主要市场亮点:**
**IHSG:** 下跌 0.71% 至 8,584.78(12 月 23 日),今天开盘弱势 8,607,然后下跌至 8,583
**外资流入:** 今日第一交易时段净买入 25 亿印尼盾 - 目标是采矿/大宗商品股票
**领涨股:**
- **BUMI:** -3.55%(大量获利了结,在周一上涨 14% 后)
- **INCO:** +12.39%(外资累计 10.1 亿印尼盾,周二 +1.7% 开盘今日)
- **ANTM:** +74 亿印尼盾外资买入(镍行业热门)
- **BBCA:** -1.83% 至 8,025(尽管股息收益率 3.73%)
**情绪:**
- 圣诞节前夕,Santa Rally 停滞 - 窗口装饰 + 获利了结冲突
- 采矿股票是外资的磁铁
- IHSG 目标 9,000 仍然可能根据 IPOT 需要大市值银行/基础设施激增
- 投资者谨慎过圣诞节假期
**可交易设置:**
- **INCO/ANTM:** 强大的 Bandarmology,外资持续积累
- **银行(BBCA/BMRI):** 在股息游戏下被低估,但有获利风险
- **基础设施:** TLKM,BREN,TOWR 出现净买入
**风险:** 成交量小,假日前获利了结
```
### 选项 2:手动 CLI 使用
```bash
# 运行完整管道(抓取 → 索引 → 语义搜索)
bash prepare_news.sh
# 使用 Claude Code CLI 分析
bash run_daily_analysis.sh
# 在浏览器中查看报告(报告服务器已经运行!)
open http://localhost:3131
```
报告服务器容器会自动显示 `volumes/news_data/daily_report.md` 当您访问 **http://localhost:3131**
### 选项 3:REST API 使用
**股票 API 服务器在 Docker 中自动运行**(无需手动启动!):
```bash
# API 已经运行在端口 13052
curl http://localhost:13052/
# 查看交互式 API 文档
open http://localhost:13052/docs
```
API 提供全面的 **新闻管道 + 股票分析 + 筛选** 端点:
**新闻管道端点:**
- `POST /api/news/get` - 异步运行新闻管道(立即返回)
- `POST /api/news/get/sync` - 同步运行新闻管道(等待完成)
- `GET /api/news/status` - 检查管道状态
- `GET /api/news/read` - 读取简要新闻报告(纯文本)
- `GET /api/news/read/json` - 获取 JSON 格式的报告及元数据
- `GET /api/news/analyze` - 使用 Claude CLI 分析新闻(仅限 localhost,适用于 openclaw 集成)
- `GET /api/news/check_files` - 检查哪些输出文件存在
**注意:** `/api/news/analyze` - 此端点设计用于本地编排和 openclaw 通道集成。它需要容器内的 Claude CLI 身份验证,默认情况下仅接受来自 localhost/Docker 网络的请求。有关设置说明,请参阅 [安全性和 Claude CLI 集成](#安全性和-claude-cli-集成)。
**股票数据和端点:**
- `POST /api/stock/price` - 获取当前股票价格和信息
- `POST /api/stock/history` - 获取历史 OHLCV 数据
- `POST /api/stock/technicals` - 获取技术指标(RSI,MACD,MA,布林线)
- `POST /api/stock/bandarmology` - 获取 bandarmology/智能资金流分析
- `POST /api/stock/fundamentals` - 获取基本面数据(P/E,P/B,ROE 等)
- `POST /api/stock/mandiri-report` - 生成 Mandiri Sekuritas 风格的报告
**市场上下文端点:**
- `POST /api/market/global` - 检查全球市场情绪(S&P500,Nikkei,大宗商品)
- `POST /api/market/time-context` - 获取 WIB 时间和交易时段上下文
- `POST /api/market/stock-list` - 获取 LQ45/IDX30 股票列表
**交易策略筛选端点:**
- `POST /api/screen/preopen` - 筛选 PRE-OPEN 设置(执行 08:45-08:58 WIB)
- `POST /api/screen/bpjs` - 筛选 BPJS(买入早晨卖出下午)设置
- `POST /api/screen/bsjp` - 筛选 BSJP(下午买入早晨卖出)设置
- `POST /api/screen/day-trade` - 筛选日交易机会(Mandiri 风格)
**API 调用示例:**
```bash
# 获取 BBCA 的技术分析
curl -X POST http://localhost:13052/api/stock/technicals \
-H "Content-Type: application/json" \
-d '{"symbol": "BBCA", "period": "6mo"}'
# 运行新闻管道
curl -X POST http://localhost:13052/api/news/get \
-H "Content-Type: application/json" \
-d '{"max_items": 100, "top_k": 50}'
```
### 有用的链接
- **每日报告 Web UI**: http://localhost:3131 (公共访问安全)
- **股票 API 文档** (Swagger UI): http://localhost:13052/docs (保持内部)
- **Attu UI** (Milvus 数据库资源管理器): http://localhost:1233 (可选)
## MCP 集成详情
MCP 服务器 (`src/stock_api/mcp_server.py`) 在 **Docker 容器内运行**,并为新闻管道管理提供 5 个工具:
| 工具 | 描述 | 参数 |
|------|-------------|------------|
| `get_news_status` | 检查管道状态 | 无 |
| `run_news_pipeline_async` | 在后台启动管道 | `max_items` (100),`query`,`top_k` (30),`days_back` (2),`max_chars` (2000),`skip_scrape`,`skip_index` |
| `run_news_pipeline_sync` | 同步运行管道 | 与异步相同 |
| `check_existing_files` | 检查哪些报告存在 | 无 |
| `read_news_report` | 读取简要新闻输出 | `file` (news_condensed.txt) |
**关键参数:**
- `max_items`: 抓取的文章总数(默认:100)
- `query`: 语义搜索查询(默认:市场动态,价格变化,交易分析)
- `top_k`: 检索的相关文章数量(默认:30)
- `days_back`: 从过去 N 天过滤文章(默认:2)
- `max_chars`: 每篇文章的最大字符数(默认:2000)
- `skip_scrape`: 如果已经完成,则跳过抓取(默认:false)
- `skip_index`: 如果已经完成,则跳过索引(默认:false)
**架构:**
```
MCP 客户端(Claude)→ docker exec → mcp_server.py → HTTP 调用 → stock_api_server.py → 管道/Milvus
```
**为什么使用 Docker exec?**
- 与 FastAPI 服务器共享相同的 `/app/data` 卷
- 路径问题已解决 - 所有内容都已容器化
- 主机操作系统无关的稳定环境
**了解更多关于 MCP 的信息:** [https://modelcontextprotocol.io/](https://modelcontextprotocol.io/)
## REST API 集成
股票 API 服务器 (`src/stock_api/stock_api_server.py`) 在 Docker 中自动运行,并提供全面的 REST API。
### 快速入门
```bash
# API 已经运行!无需手动启动。
# 只需验证它是否正常:
curl http://localhost:13052/
# 访问交互式文档:
open http://localhost:13052/docs
```
服务器在 **http://localhost:13052** 上运行,交互式 Swagger 文档位于 **/docs**。
### API 服务
API 提供三大服务:
#### 1. 新闻管道服务
自动新闻抓取、索引和语义搜索:
- **异步运行管道** - `POST /api/news/get`(立即返回,稍后检查状态)
- **同步运行管道** - `POST /api/news/get/sync`(等待完成)
- **检查执行状态** - `GET /api/news/status`
- **阅读简要报告** - `GET /api/news/read`(纯文本)或 `GET /api/news/read/json`(JSON 及元数据)
- **使用 Claude 分析** - `GET /api/news/analyze`(需要 Claude CLI 凭证)
- **检查现有文件** - `GET /api/news/check_files`
**示例:** 获取过去 3 天的 100 篇文章:
```bash
curl -X POST http://localhost:13052/api/news/get \
-H "Content-Type: application/json" \
-d '{
"max_items": 100,
"days_back": 3,
"top_k": 50
}'
```
#### 2. 股票分析服务
印度尼西亚股票(IDX)的技术和基本面分析:
- **当前价格和信息** - `POST /api/stock/price`
- **历史 OHLCV 数据** - `POST /api/stock/history`
- **技术指标** - `POST /api/stock/technicals`(RSI,MACD,移动平均线,布林线)
- **Bandarmology 分析** - `POST /api/stock/bandarmology`(智能资金流检测)
- **基本面** - `POST /api/stock/fundamentals`(P/E,P/B,ROE,债务比率等)
- **Mandiri 风格报告** - `POST /api/stock/mandiri-report`(综合分析报告)
**示例:** 获取 BBCA 的技术分析:
```bash
curl -X POST http://localhost:13052/api/stock/technicals \
-H "Content-Type: application/json" \
-d '{
"symbol": "BBCA",
"period": "6mo"
}'
```
#### 3. 交易策略筛选
在 LQ45/IDX30 中筛选特定的交易设置:
- **开盘前设置** - `POST /api/screen/preopen` (分析隔夜行情,执行时间 08:45-08:58 WIB)
- **BPJS 设置** - `POST /api/screen/bpjs` (上午买入,下午卖出 - 当日)
- **BSJP 设置** - `POST /api/screen/bsjp` (下午买入,次日上午卖出)
- **日内交易设置** - `POST /api/screen/day-trade` (Mandiri Sekuritas 风格的筛选)
**示例:** 筛选日内交易机会:
```bash
curl -X POST http://localhost:13052/api/screen/day-trade \
-H "Content-Type: application/json" \
-d '{
"stock_index": "LQ45",
"limit": 10,
"mode": "mandiri"
}'
```
### 使用场景
- **与交易机器人集成** - 自动新闻监控和技术分析
- **构建仪表盘** - 使用 API 创建自定义 Web 接口
- **定时分析** - 使用 cron 作业触发管道运行
- **多客户端访问** - 多个应用程序可以访问同一个管道
- **移动应用程序** - 为市场监控构建移动接口
- **策略回测** - 历史数据 + 技术指标用于测试
### 安全性和 Claude CLI 集成
#### Claude CLI 设置(适用于 /api/news/analyze 端点)
`/api/news/analyze` 端点允许使用 Claude CLI 进行自动 AI 分析。要使用此功能:
**步骤 1: 在容器内验证 Claude CLI**
```bash
# 在容器内登录 Claude
docker exec -it idx-stock-api su appuser -c "claude /login"
# 按照交互式提示进行身份验证
# 您的凭证将存储在 volumes/claude_config/ 中
```
**步骤 2:测试端点**
```bash
# 分析新闻(来自 localhost)
curl http://localhost:13052/api/news/analyze
# API 将读取 news_condensed.txt 并生成 daily_report.md
```
#### 安全模型
`/api/news/analyze` 端点设计用于**本地编排和 openclaw 频道集成**,因此它具有更严格的安全性:
**默认安全(未设置 CLAUDE_SECRET_KEY):**
- ✅ 接受来自:`localhost`、`127.0.0.1`、`::1`、`Docker 内部网络(172.*,192.168.*)`
- ❌ 拒绝来自:外部/公共 IP 地址
- **用例:** 本地自动化、cron 作业、同一台机器上的 openclaw 频道集成
**可选增强安全(设置 CLAUDE_SECRET_KEY):**
```bash
# 在 .env 文件中设置
CLAUDE_SECRET_KEY=your-secret-key-here
# 重启容器以应用
docker-compose restart stock-api
# 然后使用秘密密钥标头调用:
curl -X GET http://localhost:13052/api/news/analyze \
-H "X-Secret-Key: your-secret-key-here"
```
**为什么采用这种安全模型?**
- `/api/news/analyze` 端点使用您的个人 Claude CLI 凭证
- 设计用于**openclaw 频道集成**(本地 AI 编排)
- 防止对您的 Claude 账户进行未经授权的外部访问
- 其他端点(股票数据、筛选)开放供更广泛的集成使用
**注意:** 如果您需要 AI 分析的外部访问,请考虑:
1. 改用 MCP 集成(设计更安全)
2. 设置具有适当身份验证的反向代理
3. 仅将端点用于本地 cron 作业/自动化
## 文件概述
### Docker 基础设施
- **`docker-compose.yml`** - 完整的堆栈(Milvus + Stock API + Report Server)
- **`src/stock_api/Dockerfile`** - Stock API 容器定义
- **`Dockerfile.report`** - 极简报告服务器容器(~50MB Alpine)
- **`src/stock_api/entrypoint.sh`** - 容器初始化脚本
- **`.env.example`** - 安全配置模板
- **`.dockerignore`** - 优化报告服务器构建上下文
### 核心 API 服务器
- **`src/stock_api/stock_api_server.py`** - 主要 FastAPI 服务器(所有端点)
- 新闻管道管理
- 股票数据和技术分析
- 交易策略筛选
- 市场上下文端点
- **`src/stock_api/mcp_server.py`** - 用于 AI 助手的 MCP 服务器(在 Docker 内运行)
### 管道脚本(在容器内)
- **`src/helper/scraper.py`** - 抓取印度尼西亚财经新闻
- **`src/helper/rag_indexer.py`** - 在 Milvus 中嵌入和索引文章
- **`src/helper/rag_query.py`** - 相关文章的语义搜索
- **`src/helper/news_pipeline.py`** - 端到端管道编排器
- **`src/helper/serve_report.py`** - 显示 Markdown 报告的 Web 服务器
### 自动化脚本(主机)
- **`prepare_news.sh`** - 新闻管道包装器(抓取 → 索引 → 语义搜索)
- **`run_daily_analysis.sh`** - 完整的自动化 + AI 分析
- **`analysis_prompt.txt`** - AI 分析的提示模板(CLI 模式)
### 持久化数据卷
- **`volumes/news_data/`** - 生成的文件(news.txt、news_condensed.txt、daily_report.md)
- **`volumes/claude_config/`** - Claude CLI 凭证挂载点
- **`volumes/milvus/`** - Milvus 数据库存储
- **`volumes/etcd/`** - etcd 配置存储
- **`volumes/minio/`** - MinIO 对象存储
### 生成的文件(在 volumes/news_data/ 中)
- **`news.txt`** - 原始抓取的文章
- **`news_condensed.txt`** - 最相关的文章(来自语义搜索)
- **`daily_report.md`** - 最终分析报告(由 AI 生成)
## 手动分步使用
您可以以多种方式与系统交互:
### 方法 1:使用 REST API(推荐)
```bash
# 步骤 1:通过 API 运行新闻管道
curl -X POST http://localhost:13052/api/news/get/sync \
-H "Content-Type: application/json" \
-d '{"max_items": 100, "top_k": 50}'
# 步骤 2:读取浓缩新闻
curl http://localhost:13052/api/news/read
# 步骤 3:(可选)使用 Claude 分析
curl http://localhost:13052/api/news/analyze
```
### 方法 2:使用主机脚本
```bash
# 步骤 1:运行完整的管道
bash prepare_news.sh
# 步骤 2:使用 Claude CLI 分析
bash run_daily_analysis.sh
# 步骤 3:在浏览器中查看报告(服务器已运行!)
open http://localhost:3131
# 报告服务器容器自动提供 daily_report.md
```
### 方法 3:使用 Docker Exec(直接容器访问)
```bash
# 步骤 1:在容器内抓取新闻
docker exec -it idx-stock-api python3 /app/helper/scraper.py --max_items 100
# 步骤 2:在 Milvus 中索引
docker exec -it idx-stock-api python3 /app/helper/rag_indexer.py
# 步骤 3:语义搜索
docker exec -it idx-stock-api python3 /app/helper/rag_query.py --top_k 50
# 步骤 4:查看生成的文件
docker exec -it idx-stock-api ls -lh /app/data/
docker exec -it idx-stock-api cat /app/data/news_condensed.txt
```
### 方法 4:使用 MCP 工具
只需询问您的 MCP 连接的 AI 助手:
```
"获取今日印尼股市新闻"
```
AI 将自动运行适当的 MCP 工具!
## 报告服务器功能
`idx-report-server` 容器提供了一个轻量级的 Web UI,用于查看每日市场报告:
**功能:**
- 自动将 Markdown 转换为 HTML,并具有语法高亮
- 清洁、响应式 UI,优化了可读性
- 每 5 分钟自动刷新
- 手动刷新按钮
- 显示报告生成时间戳(雅加达时区)
- 只读访问 `/app/data` 卷(安全)
- 在 `0.0.0.0:3131` 上提供服务(可从网络访问)
- 微小占用量(基于 Alpine 的容器,~50MB)
**安全:**
- 无数据卷的写访问(只读挂载)
- 安全公开 - 仅显示报告
- 无 API 密钥或敏感数据暴露
- 与 Stock API 独立(关注点分离)
**访问:**
- 本地:http://localhost:3131
- 网络:http://your-server-ip:3131
- 可以通过 Nginx/Caddy 反向代理以启用 HTTPS
## 配置
### 环境变量
从 `.env.example` 创建 `.env` 文件:
```bash
cp .env.example .env
```
**可用选项:**
- `CLAUDE_SECRET_KEY` - `/api/news/analyze` 端点的可选秘密密钥(用于 openclaw 集成)
- 如果未设置:仅接受 localhost/Docker 网络请求
- 如果设置:需要 `X-Secret-Key` 标头用于所有请求
- `MILVUS_HOST` - Milvus 服务器主机名(默认:milvus-standalone)
- `MILVUS_PORT` - Milvus 服务器端口(默认:19530)
### Claude CLI 配置
要启用 `/api/news/analyze` 端点(用于自动 AI 分析):
```bash
# 1. 在容器内登录 Claude CLI
docker exec -it idx-stock-api su appuser -c "claude /login"
# 2. 验证凭证已保存
docker exec -it idx-stock-api su appuser -c "ls -la /home/appuser/.claude"
# 3. 测试分析端点
curl http://localhost:13052/api/news/analyze
```
**存储内容:**
- Claude 凭证存储在 `volumes/claude_config/` 中
- 此目录挂载到容器内的 `/home/appuser/.claude`
- 凭证在容器重启后持续存在
**用例:**
- 本地 cron 作业,用于每日自动分析
- Openclaw 频道集成,用于 AI 驱动的市场报告
- 自动化报告生成工作流
### 更改 API 服务器端口
编辑 `docker-compose.yml`:
```yaml
services:
stock-api:
ports:
- "13052:13052" # 更改主机端口(左侧)
```
然后重启:`docker-compose up -d`
### 抓取来源
编辑 `src/helper/scraper.py` - 修改 `get_sites()` 函数以添加/删除新闻源。
在 Docker 中更新:
```bash
# 编辑文件后重建容器
docker-compose up -d --build stock-api
```
### 分析风格
编辑 `analysis_prompt.txt` 以自定义 AI 的分析方法(主机脚本使用)。
## 使用 cron 进行每日自动化
### 选项 1:使用 API 的 cron(推荐)
Stock API 服务器 24/7 在 Docker 中运行,因此您只需要触发它:
```bash
# 编辑 crontab
crontab -e
# 添加此行 - 每天上午 9 点运行
0 9 * * * curl -X POST http://localhost:13052/api/news/get -H "Content-Type: application/json" -d '{"max_items": 100, "top_k": 50}' >> /path/to/auto-news/cron.log 2>&1
# 可选:也在 9:05 AM 触发 Claude 分析(用于 openclaw 集成)
# 需要 Claude CLI 身份验证:docker exec -it idx-stock-api su appuser -c "claude /login"
5 9 * * * curl http://localhost:13052/api/news/analyze >> /path/to/auto-news/cron_analysis.log 2>&1
```
**适用于 openclaw 集成:** 设置 cron 自动生成每日市场报告,然后使用 openclaw 将它们发送到 Slack/Discord 频道!
### 选项 2:使用主机的 cron
```bash
# 编辑 crontab
crontab -e
# 添加此行:
0 9 * * * cd /path/to/auto-news && bash run_daily_analysis.sh >> cron.log 2>&1
```
### 保持服务运行
Docker 容器自动重启(配置为 `restart: unless-stopped`):
```bash
# 验证所有容器正在运行
docker ps | grep -E "idx-stock-api|idx-report-server|milvus|etcd|minio"
# 检查服务健康状况
curl http://localhost:13052/ # Stock API
curl http://localhost:3131/ # 报告服务器
```
所有服务,包括报告服务器,都 24/7 运行并自动重启!
## 故障排除
### Docker:容器未启动
```bash
# 检查隧道网络是否存在
docker network ls | grep tunnel
# 如果丢失
docker network create tunnel
# 启动所有服务
docker-compose up -d
# 如果任何容器失败,请检查日志
docker-compose logs stock-api
docker-compose logs milvus-standalone
```
### MCP:服务器未连接到 AI 客户端
1. **验证 Docker 容器正在运行:**
```bash
docker ps | grep idx-stock-api ```
2. **手动测试 MCP 服务器:**
```bash
docker exec -i idx-stock-api python3 /app/mcp_server.py
# 应该没有错误启动
```
3. **检查 MCP 配置语法:**
```json
{
"mcpServers": {
"stock-news": {
"type": "stdio",
"command": "docker",
"args": ["exec", "-i", "idx-stock-api", "python3", "/app/mcp_server.py"]
}
}
}
```
4. **重启您的 MCP 客户端**(Claude Desktop/Code 或其他)
### API:无法连接到 http://localhost:13052
```bash
# 检查容器是否正在运行
docker ps | grep idx-stock-api
# 检查容器日志
docker logs idx-stock-api
# 如果需要重启
docker-compose restart stock-api
# 检查健康端点
curl http://localhost:13052/
```
### API:Milvus 连接错误
```bash
# 验证 Milvus 是否正在运行
docker ps | grep milvus-standalone
# 检查 Milvus 日志
docker logs milvus-standalone
# 如果需要重启
docker-compose restart milvus-standalone etcd minio
# 等待 30 秒以初始化 Milvus
sleep 30
# 从 stock-api 容器内测试连接
docker exec -it idx-stock-api python3 -c "from pymilvus import connections; connections.connect(host='milvus-standalone', port='19530'); print('Connected!')"
```
### API:股票数据不可用
一些印度尼西亚股票可能有不同的 ticker 格式:
- IDX 格式:`BBCA`
- Yahoo Finance 格式:`BBCA.JK`(API 自动追加)
如果问题仍然存在:
1. 验证股票符号是否正确(检查 IDX 网站)
2. 尝试不同的时间段(一些股票的可用历史数据有限)
3. 检查容器内的互联网连接:
```bash
docker exec -it idx-stock-api curl -I https://finance.yahoo.com
```
### 端口冲突
**端口 13052(Stock API)已使用:```bash
# 查找正在使用端口的进程
lsof -ti:13052
# 选项 1:杀死进程
lsof -ti:13052 | xargs kill -9
# 选项 2:更改 docker-compose.yml
# ports: - "13053:13052"
# 3. 重新启动
docker-compose up -d
```bash
# 验证所有容器正在运行
docker ps | grep -E "idx-stock-api|idx-report-server|milvus|etcd|minio"
# 检查服务健康状况
curl http://localhost:13052/ # Stock API
curl http://localhost:3131/ # 报告服务器
```bash
# 验证所有容器正在运行
docker ps | grep -E "idx-stock-api|idx-report-server|milvus|etcd|minio"
# 检查服务健康状况
curl http://localhost:13052/ # Stock API
curl -1:13052
# 选项 2:更改端口
# docker-compose.yml 中的 ports: - "13053:13052"
```
### 数据持久性问题
```bash
# 检查卷挂载
docker inspect idx-stock-api | grep -A 5 Mounts
# 验证数据目录权限
docker exec -it idx-stock-api ls -la /app/data/
# 手动检查生成的文件
ls -lh volumes/news_data/
```
### 重建代码更改后
```bash
# 重建 stock-api 容器
docker-compose up -d --build stock-api
# 或重建所有内容
docker-compose down
docker-compose up -d --build
```
### 报告服务器:“未找到报告”错误
```bash
# 检查 daily_report.md 是否存在
ls -la volumes/news_data/daily_report.md
# 如果丢失,则通过 API 生成:
curl http://localhost:13052/api/news/analyze
# 或通过主机脚本运行:
bash run_daily_analysis.sh
# 报告服务器会自动刷新并显示报告
# 访问:http://localhost:3131
```
### 报告服务器:无法连接到 http://localhost:3131
```bash
# 检查报告服务器容器是否正在运行
docker ps | grep idx-report-server
# 检查容器日志
docker logs idx-report-server
# 如果需要重启
docker-compose restart report-server
# 验证它是否正在监听
curl http://localhost:3131/
```
### 报告服务器:未显示最新报告
报告服务器每 5 分钟自动刷新。要强制立即刷新:
```bash
# 选项 1:刷新浏览器(Ctrl+R 或 Cmd+R)
# 选项 之二:单击顶部右侧的“🔄 刷新”按钮
# 选项 3:重启容器以清除任何缓存
docker-compose restart report-server
```
### Claude CLI:身份验证问题
**问题:`/api/news/analyze` 返回“Claude CLI 未配置”**
```bash
# 1. 检查容器内是否安装了 Claude CLI
docker exec -it idx-stock-api which claude
# 应该返回:/usr/local/bin/claude
# 2. 检查凭证是否存在
docker exec -it idx-stock-api su appuser -c "ls -la /home/appuser/.claude"
# 应该显示会话文件
# 3. 如果未验证,请登录
docker exec -it idx-stock-api su appuser -c "claude /login"
# 4. 验证登录是否成功
docker exec -it idx-stock-api su appuser -c "claude -p 'test'" --dangerously-skip-permissions
# 应该从 Claude 返回响应
```
**问题:调用 /api/news/analyze 时出现“禁止”错误**
此端点出于设计原因(用于 openclaw 集成)仅接受来自 localhost/Docker 网络的请求:
```bash
# ✅ 此方法有效(来自同一台机器):
curl http://localhost:13052/api/news/analyze
# ❌ 此方法失败(来自外部 IP):
curl http://your-server-ip:13052/api/news/analyze
# 要允许外部访问,请在 .env 中设置 CLAUDE_SECRET_KEY:
# 1. 生成一个密钥:
openssl rand -hex 32
# 2. 添加到 .env:
echo "CLAUDE_SECRET_KEY=your-generated-key" >> .env
# 3. 重启容器:
docker-compose restart stock-api
# 4. 使用标头调用:
curl http://your-server-ip:13052/api/news/analyze \
-H "X-Secret-Key: your-generated-key"
```
**问题:Claude CLI 凭证不持久**
```bash
# 检查卷挂载
docker inspect idx-stock-api | grep claude_config
# 确保 volumes/claude_config/ 存在且具有正确权限
mkdir -p volumes/claude_config
chmod 755 volumes/claude_config
# 重启容器并再次登录
docker-compose restart stock-api
docker exec -it idx-stock-api su appuser -c "claude /login"
```
## 依赖项
### Docker(必需)
所有 Python 依赖项都在 Docker 容器内安装。除非您想在本地运行脚本,否则您不需要在本地安装任何内容。
**系统需求:**
- Docker Engine 20.10+
- Docker Compose 2.0+
- 4GB RAM minimum (8GB recommended for Milvus)
- 10GB disk space
### Python 包(在容器内自动安装)
参见 `src/stock_api/requirements.txt` 以获取完整列表。
**关键包:**
- `fastapi`, `uvicorn` - REST API 服务器
- `pymilvus` - 向量数据库客户端
- `sentence-transformers` - 多语言嵌入(paraphrase-multilingual-mpnet-base-v2)
- `torch` - 深度学习后端
- `mcp` - 模型上下文协议 SDK
- `requests`, `beautifulsoup4` - Web 抓取
- `yfinance` - 来自 Yahoo Finance 的股票市场数据
- `pandas`, `numpy` - 数据分析
- `ta` - 技术分析指标(RSI, MACD, 布林带等)
- `python-dotenv` - 环境变量管理
### 手动安装(可选)
仅当您想在 Docker 外运行脚本时需要:
```bash
pip install -r requirements.txt
```
## 示例输出
生成的 `daily_report.md` 包括:
- 市场概述和情绪
- 提及最多的股票
- 价格变动和催化剂
- 3 个最有行动的推荐
- 单个文章分析
## 功能
### ✅ 已实现的功能
#### 1. 容器化架构
- **统一 Docker Compose 栈** - 所有服务都在容器中运行
- **持久数据卷** - 新闻数据、数据库和配置信息得到保存
- **自动重启** - 容器在故障时自动重启
- **健康检查** - 为所有服务提供内置监控
- **关注点分离** - 股票 API(内部)+ 报告服务器(公共 Web UI)
- **安全性优先的设计** - 报告服务器对数据卷具有只读访问权限
#### 2. 新闻流水线
- **多源抓取** - 从印度尼西亚的金融网站聚合新闻
- **语义搜索** - 使用多语言嵌入的 Milvus 矢量数据库
- **重复数据删除** - 基于链接的重复数据删除,以避免重复文章
- **可配置过滤** - 按日期范围、文章数量、相关性进行过滤
- **后台处理** - 使用状态跟踪的异步流水线执行
#### 3. 股票分析 API
- **实时数据** - 与雅虎财经集成,获取 IDX 股票数据
- **技术指标**:
- 移动平均线(SMA 20/50,EMA 12/26)
- RSI(相对强弱指数)
- MACD(移动平均收敛/发散指标)
- 布林带
- 交易量分析(OBV,ADL,VPT,MFI)
- 平均真实范围(ATR)
- **Bandarmology 分析** - 智能资金流检测:
- 累积/分布阶段(Wyckoff 风格)
- 交易量模式识别
- 价格结构分析
- 突破触发器
- 风险管理水平(止损,止盈)
- **基本面数据** - 市盈率、市净率、净资产收益率、债务比率、股息收益率等
- **Mandiri Sekuritas 风格报告** - 全面的分析报告
#### 4. 交易策略筛选
- **PREOPEN 设置** - 分析隔夜行情,在市场开盘时执行(08:45-08:58 WIB)
- **BPJS(Beli Pagi Jual Sore)** - 买入早晨,卖出下午,当日交易
- **BSJP(Beli Sore Jual Pagi)** - 买入下午,卖出次日早晨
- **日内交易筛选** - Mandiri 风格的日内交易机会
- **可自定义过滤器** - 最低评分、交易量、Bandarmology 开关
#### 5. 市场背景
- **全球情绪** - S&P500、日经指数、大宗商品对 IDX 的影响
- **交易时间背景** - WIB 时间、当前交易时段、推荐策略
- **股票列表** - LQ45、IDX30 成分股
#### 6. MCP 集成
- **基于 Docker 的 MCP 服务器** - 在容器内运行,用于共享数据卷
- **5 个 MCP 工具** - 流水线状态、异步/同步执行、文件检查、报告读取
- **通用兼容性** - 与 Claude Desktop、Claude Code 和其他 MCP 客户端兼容
#### 7. REST API 和 Web UI
- **全面的 FastAPI 服务器** - 所有功能均可通过 HTTP 访问(内部端口 13052)
- **公共 Web UI** - 报告服务器在端口 3131(可安全公开)
- **交互式文档** - 在 `/docs` 处的 Swagger UI
- **安全选项** - 为敏感端点提供可选的密钥认证
- **启用 CORS** - 准备好与 Web 仪表盘集成
- **只读报告访问** - Web 服务器无写入权限
**快速 API 示例:**
```bash
# 获取技术分析
curl -X POST http://localhost:13052/api/stock/technicals \
-d '{"symbol": "BBCA", "period": "6mo"}'
# 筛选日内交易
curl -X POST http://localhost:13052/api/screen/day-trade \
-d '{"stock_index": "LQ45", "limit": 10}'
# 运行新闻流水线
curl -X POST http://localhost:13052/api/news/get \
-d '{"max_items": 100, "top_k": 50}'
```
## 未来增强功能
### 计划功能
#### 高优先级
- **统一分析端点** ⏳
- 将基本面新闻与技术信号相互参照
- 确定两种分析都匹配的股票(强烈的买入/卖出信号)
- 标记差异(例如,积极新闻但技术面看跌)
- 根据多因素协议生成置信度评分
- 示例:`POST /api/stock/unified_analysis` → 综合推荐
- **MCP 股票分析工具** ⏳
- 通过 MCP 公开股票分析(目前仅新闻流水线可用)
- `get_stock_price` - 从 AI 助手查询价格
- `get_technical_analysis` - 通过 AI 获取指标
- `get_bandarmology` - 通过 AI 获取智能资金流
- `screen_stocks` - 通过 AI 运行筛选策略
- **情绪分析** ⏳
- 对新闻文章进行 NLP 情绪评分
- 按股票代码聚合情绪
- 与价格变动的相关性
#### 中等优先级
- **警报系统**
- 针对关键市场事件的 WhatsApp/Telegram 通知
- 可配置的阈值(价格变化、交易量激增、新闻提及)
- 通过消息应用程序的每日总结报告
- **投资组合跟踪**
- 监控您的持仓与新闻/技术信号
- 绩效分析和盈亏跟踪
- 股票出现在新闻或筛选结果时的警报
- **实时更新**
- 用于实时市场数据的 WebSocket 集成
- 价格变动的推送通知
- 市场条件变化时的实时筛选结果
#### 低优先级
- **多语言支持**
- 抓取英文金融新闻来源(彭博社、路透社)
- 印度尼西亚和全球新闻的相互参照
- **回测框架**
- 根据历史数据测试策略绩效
- 评估筛选标准的有效性
- 风险/回报指标和夏普比率
- **高级重复数据删除**
- 内容相似性检测(基于链接之外)
- 相关新闻故事的聚类
- 主题建模以实现更好的组织
- **Web 仪表盘**
- 用于数据探索的交互式 UI
- 制图和可视化
- 自定义筛选构建器
**欢迎贡献!** 随时可以实施这些功能中的任何一个。在开始开发大型功能之前,请先创建一个问题讨论。
## 迁移指南
### 从以前的版本升级
如果您从 auto-news 的旧版本升级,请遵循以下步骤:
#### 1. 停止旧服务
```bash
# 如果您有 rag/ 目录和 docker-compose
cd rag
docker-compose down
cd ..
# 停止任何正在运行的 unified_api_server.py
pkill -f unified_api_server.py
```
#### 2. 更新配置
**MCP 配置更新:**
旧配置(不再工作):
```json
{
"mcpServers": {
"auto-news": {
"command": "python3",
"args": ["/path/to/auto-news/src/mcp_server.py"]
}
}
}
```
新配置(基于 Docker):
```json
{
"mcpServers": {
"stock-news": {
"type": "stdio",
"command": "docker",
"args": ["exec", "-i", "idx-stock-api", "python3", "/app/mcp_server.py"]
}
}
}
```
**API 端口更改:**
- 旧:`http://localhost:13051`
- 新:`http://localhost:13052`
更新任何使用旧端口的脚本或应用程序。
#### 3. 创建 Docker 网络
```bash
docker network create tunnel
```
#### 4. 启动新栈
```bash
# 从项目根目录
docker-compose up -d
# 验证所有服务正在运行(包括新的 report-server)
docker ps
# 应该看到:etcd, minio, milvus-standalone, attu, idx-stock-api, idx-report-server
```
#### 5. 验证迁移
```bash
# 测试股票 API
curl http://localhost:13052/
# 测试报告服务器(新的!)
curl http://localhost:3131/
open http://localhost:3131
# 测试 MCP(重新启动您的 MCP 客户端后)
# 然后询问: "检查新闻流水线状态"
```
### 破坏性更改
- **MCP 服务器位置**:从 `src/mcp_server.py` 移动到 `src/stock_api/mcp_server.py`
- **API 端口**:从 13051 更改为 13052
- **报告服务器**:现在在 Docker 容器中运行(端口 3131),无需手动运行 `serve_report.py`
- **Docker 架构**:`rag/docker-compose.yml` 合并到根目录 `docker-compose.yml`
- **文件路径**:流水线脚本从根目录移动到 `src/helper/`
- **MCP 工具**:从 3 个工具更改为 5 个工具(添加了状态检查和文件管理)
- **数据位置**:现在在 `volumes/news_data/` 而不是项目根目录
### 此版本中的新功能
- **报告服务器容器**:专用的轻量级容器用于公共 Web UI
- **只读数据访问**:报告服务器以只读方式挂载 news_data 卷
- **安全改进**:股票 API 可以保持内部,而仅公开暴露报告服务器
- **自动重启**:API 和报告服务器都自动重启
- **健康检查**:所有服务的监控
### 保留的内容
- 所有现有的数据文件(news.txt, daily_report.md)都可以复制到 `volumes/news_data/`
- Milvus 集合和嵌入在 `volumes/milvus/` 中得到保留
- 分析提示和脚本仍然以相同的方式工作
## 免责声明
**投资风险:** 本工具仅用于教育和信息目的。在做出投资决策之前,请始终进行自己的研究。
**网页抓取:** 本工具抓取公开可用的新闻供个人使用。请:
- 尊重被抓取网站的服务条款
- 负责使用并避免过度服务器负载
- 不用于商业重新分发抓取内容
- 检查目标网站的 `robots.txt` 策略
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器