|
|
|
|
|
# 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
|
|
|
|
|
|
```
|