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.
MomentumLab/docs/PYTHON_DATA_SERVICE_DOCKER.md

315 lines
8.2 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.

# Python 数据服务 Docker 化部署指南
## 概述
本指南介绍如何将 Python AKShare 数据服务 Docker 化部署,并连接 Docker 中的 MySQL 数据库。
## 架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ Docker Network │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ MySQL │◄───┤ AKShare │ │ Node.js │ │
│ │ :3306 │ │ :8000 │◄───┤ :3000 │ │
│ │ │ │ │ │ │ │
│ │ aguzhitou │ │ 数据获取 │ │ API服务 │ │
│ │ │ │ 数据存储 │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ▲ │ │ │
│ │ │ │ │
│ ┌─────────────┐ │ │ │
│ │ Redis │◄──────────┴───────────────────┘ │
│ │ :6379 │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
## 数据表说明
Python 数据服务需要以下数据表:
### 1. 市场指数表 (market_indices)
```sql
- id: 主键
- name: 指数名称(如上证指数)
- code: 指数代码(如000001
- current: 当前点位
- change: 涨跌额
- change_percent: 涨跌幅
- volume: 成交量
- turnover: 成交额
```
### 2. 板块信息表 (sectors)
```sql
- id: UUID主键
- name: 板块名称
- code: 板块代码
```
### 3. 板块行情表 (sector_quotes)
```sql
- id: 主键
- sector_code: 板块代码
- current/change/change_percent: 行情数据
- momentum_score: 动量分数
- rank/previous_rank: 排名信息
- quote_time: 行情时间
```
### 4. 板块K线数据表 (sector_klines)
```sql
- id: 主键
- sector_code: 板块代码
- period: 周期(day/week/month)
- date: 日期
- open/high/low/close/volume: K线数据
```
### 5. 股票信息表 (stocks) ⭐核心表
```sql
- id: UUID主键
- code: 股票代码(如000001
- name: 股票名称
- sector_code: 所属板块
- market_cap: 市值
- pe/pb: 市盈率/市净率
```
### 6. 股票行情表 (stock_quotes) ⭐高频写入
```sql
- id: 主键
- stock_code: 股票代码
- price/open/high/low/pre_close: 价格数据
- volume/turnover: 成交数据
- change_percent: 涨跌幅
- turnover_rate/amplitude: 换手率/振幅
- quote_time: 行情时间
```
### 7. 股票K线数据表 (stock_klines) ⭐核心表
```sql
- id: 主键
- stock_code: 股票代码
- period: 周期
- date: 日期
- open/high/low/close/volume: K线数据
- ma5/ma10/ma20/ma30/ma60: 移动平均线
```
### 8. 新高新低记录表 (high_low_stocks)
```sql
- id: 主键
- stock_code: 股票代码
- type: high(新高) / low(新低)
- price: 触发价格
- date: 日期
- days_to_highlow: 距离前高/低天数
```
### 9. 动量股票推荐表 (momentum_stocks)
```sql
- id: 主键
- stock_code: 股票代码
- momentum_score: 动量分数(0-100)
- tags: 标签JSON(如["强势突破","量价齐升"]
- volume_ratio: 量比
- break_through: 是否突破
- date: 日期
```
## 快速启动
### 方式一:完整 Docker 部署(推荐)
```bash
cd app/backend
# 启动所有服务MySQL + Redis + AKShare + Node.js后端
docker-compose up -d
# 查看日志
docker-compose logs -f akshare
```
### 方式二:仅数据库 + Python 服务
```bash
cd app/backend
# 使用简化配置
docker-compose up -d mysql redis akshare
# 后端在宿主机运行(开发模式)
cd ../backend
npm install
npx prisma db push
npm run dev
```
## 服务地址
启动后各服务地址:
| 服务 | 容器内地址 | 宿主机访问地址 |
|------|-----------|--------------|
| MySQL | mysql:3306 | localhost:3306 |
| Redis | redis:6379 | localhost:6379 |
| AKShare | akshare:8000 | localhost:8000 |
| Node.js后端 | app:3000 | localhost:3000 |
## Python 服务接口
### 原始数据接口从AKShare实时获取
```
GET /stock_zh_a_spot # A股实时行情
GET /stock_zh_a_hist # A股历史K线
GET /stock_zh_index_spot # 指数行情
GET /stock_sector_spot # 板块行情
```
### 数据库查询接口从MySQL查询
```
GET /db/stocks # 获取股票列表
GET /db/klines/{symbol} # 获取K线数据
```
### 数据同步接口
```
POST /sync/stocks # 同步股票列表
POST /sync/quotes # 同步实时行情
POST /sync/klines # 同步K线数据
POST /sync/all # 执行全量同步
POST /sync/daily # 执行每日增量同步
GET /sync/status # 获取同步状态
```
## 数据同步流程
### 首次部署 - 全量同步
```bash
# 1. 初始化数据库表
docker exec aguzhitou-akshare python -c "from database import init_db; init_db()"
# 2. 执行全量同步(快速模式,只同步少量数据测试)
curl -X POST http://localhost:8000/sync/all?quick=true
# 3. 查看同步状态
curl http://localhost:8000/sync/status
```
### 定时同步 - 增量更新
设置定时任务crontab
```bash
# 编辑 crontab
crontab -e
# 添加定时任务每5分钟同步一次实时行情
*/5 * * * 1-5 curl -X POST http://localhost:8000/sync/quotes > /dev/null 2>&1
# 每晚8点执行每日同步
0 20 * * 1-5 curl -X POST http://localhost:8000/sync/daily > /dev/null 2>&1
```
## 环境变量配置
Python 服务支持以下环境变量:
| 变量 | 说明 | 默认值 |
|------|------|--------|
| DB_HOST | MySQL主机 | mysql |
| DB_PORT | MySQL端口 | 3306 |
| DB_NAME | 数据库名 | aguzhitou |
| DB_USER | 用户名 | root |
| DB_PASSWORD | 密码 | 1qazse42W3 |
## 数据量预估
| 表名 | 预估数据量 | 存储空间 |
|------|-----------|---------|
| stocks | ~5000条 | ~1MB |
| stock_quotes | ~5000条/天 | ~500MB/年 |
| stock_klines | ~120万条/年 | ~2GB/年 |
| sector_klines | ~3万条/年 | ~50MB/年 |
| high_low_stocks | ~1万条/年 | ~10MB/年 |
| momentum_stocks | ~5000条/年 | ~5MB/年 |
## 常见问题
### 1. 数据库连接失败
```bash
# 检查MySQL是否运行
docker-compose ps mysql
# 查看MySQL日志
docker-compose logs mysql
# 测试连接
docker exec aguzhitou-akshare python -c "from database import check_connection; print(check_connection())"
```
### 2. 表不存在
如果使用 Prisma执行
```bash
cd app/backend
npx prisma db push
```
如果使用 SQL 脚本,执行:
```bash
docker exec -i aguzhitou-mysql mysql -uroot -p1qazse42W3 aguzhitou < app/backend/init-scripts/01-init-database.sql
```
### 3. 数据同步太慢
```bash
# 只同步部分股票max_stocks参数
curl -X POST "http://localhost:8000/sync/klines?max_stocks=100"
# 减少同步天数
curl -X POST "http://localhost:8000/sync/klines?days=30"
```
### 4. 清理旧数据
```sql
-- 清理3个月前的行情数据
DELETE FROM stock_quotes WHERE quote_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
-- 优化表空间
OPTIMIZE TABLE stock_quotes;
```
## 开发调试
### 进入 Python 容器
```bash
docker exec -it aguzhitou-akshare bash
# 测试数据同步
python -c "from data_sync import sync_all_stocks; sync_all_stocks()"
```
### 查看实时日志
```bash
docker-compose logs -f akshare --tail 100
```
### 重启服务
```bash
docker-compose restart akshare
```