|
|
# 统一行情数据服务
|
|
|
|
|
|
提供股票和期货的标准化行情数据查询服务,支持多周期K线、复权计算、数据源热切换等功能。
|
|
|
|
|
|
**🎉 重大更新**: 现已支持 **Go** 和 **Python** 双实现,所有接口完全一致!
|
|
|
|
|
|
| 实现 | 推荐场景 | 目录 |
|
|
|
|------|----------|------|
|
|
|
| **Go** | 生产环境、高并发 | `market-data-service/` (本目录) |
|
|
|
| **Python** | 快速开发、原型验证 | `python_market_data_service/` |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 特性
|
|
|
|
|
|
- **多周期K线支持**:1m/5m/15m/30m/60m/1d/1w/1month
|
|
|
- **股票复权支持**:前复权(qfq)/后复权(hfq)
|
|
|
- **数据源热切换**:支持Wind、Tushare等多个数据源动态切换
|
|
|
- **双轨设计**:股票和期货接口独立,数据存储隔离
|
|
|
- **WebSocket实时订阅**:支持实时行情推送
|
|
|
- **数据质量监控**:自动检测数据缺失并告警
|
|
|
- **交易日历**:支持查询股票和期货的交易日历
|
|
|
- **期货合约查询**:根据品种获取可交易合约列表
|
|
|
- **双语言实现**:Go高性能 + Python快速开发
|
|
|
|
|
|
---
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
### Go实现
|
|
|
- **语言**: Go 1.21+
|
|
|
- **Web框架**: Gin
|
|
|
- **WebSocket**: Gorilla WebSocket
|
|
|
- **数据库**: PostgreSQL 15+ (原生SQL)
|
|
|
- **数据源**: Tushare
|
|
|
|
|
|
### Python实现
|
|
|
- **语言**: Python 3.10+
|
|
|
- **Web框架**: FastAPI
|
|
|
- **WebSocket**: FastAPI原生
|
|
|
- **数据库**: PostgreSQL 15+ (SQLAlchemy ORM)
|
|
|
- **数据源**: Tushare (原生支持)
|
|
|
|
|
|
---
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
### Go实现
|
|
|
|
|
|
```
|
|
|
market-data-service/
|
|
|
├── api/ # API接口定义
|
|
|
│ ├── types.go # 请求/响应类型定义
|
|
|
│ ├── router.go # HTTP路由注册
|
|
|
│ ├── admin_types.go # 管理后台类型定义
|
|
|
│ └── admin_router.go # 管理后台路由
|
|
|
├── internal/ # 内部实现
|
|
|
│ ├── handler/ # HTTP Handler实现
|
|
|
│ ├── service/ # 业务逻辑层
|
|
|
│ ├── repository/ # 数据访问层
|
|
|
│ ├── websocket/ # WebSocket服务
|
|
|
│ └── monitor/ # 数据质量监控
|
|
|
├── adapter/ # 数据源适配器框架
|
|
|
│ ├── adapter.go # 适配器接口定义
|
|
|
│ └── tushare/ # Tushare适配器实现
|
|
|
├── pkg/ # 公共包
|
|
|
├── cmd/ # 程序入口
|
|
|
├── config.example.json # 配置文件示例
|
|
|
├── go.mod
|
|
|
├── Makefile
|
|
|
└── README.md
|
|
|
```
|
|
|
|
|
|
### Python实现
|
|
|
|
|
|
```
|
|
|
python_market_data_service/
|
|
|
├── app/
|
|
|
│ ├── main.py # FastAPI主应用
|
|
|
│ ├── api/ # API路由 (FastAPI)
|
|
|
│ ├── core/ # 核心模块 (配置、日志、错误)
|
|
|
│ ├── models/ # 数据模型 (Pydantic)
|
|
|
│ ├── repositories/ # 数据访问 (SQLAlchemy)
|
|
|
│ ├── services/ # 业务逻辑层
|
|
|
│ ├── adapters/ # 数据源适配器
|
|
|
│ ├── websocket/ # WebSocket服务
|
|
|
│ └── monitor/ # 数据质量监控
|
|
|
├── scripts/ # 数据同步工具
|
|
|
├── requirements.txt # Python依赖
|
|
|
├── pyproject.toml # 项目配置
|
|
|
├── config.json # 配置文件 (与Go相同)
|
|
|
├── README.md # Python项目说明
|
|
|
└── MIGRATION_GUIDE.md # 迁移对照指南
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 快速开始
|
|
|
|
|
|
**最快方式**: 查看 [QUICKSTART.md](QUICKSTART.md) - 30秒启动指南
|
|
|
|
|
|
### 方式一:Go实现(推荐生产环境)
|
|
|
|
|
|
#### 1. 环境准备
|
|
|
|
|
|
- Go 1.21+
|
|
|
- PostgreSQL 15+
|
|
|
- Tushare Token (从 [Tushare官网](https://tushare.pro) 获取)
|
|
|
|
|
|
#### 2. 配置环境变量
|
|
|
|
|
|
```bash
|
|
|
export TUSHARE_TOKEN="your_tushare_token"
|
|
|
export DATABASE_URL="postgres://user:password@localhost:5432/marketdata?sslmode=disable"
|
|
|
export PORT="8080"
|
|
|
export GIN_MODE="debug"
|
|
|
```
|
|
|
|
|
|
#### 3. 初始化数据库
|
|
|
|
|
|
```bash
|
|
|
# 创建数据库
|
|
|
createdb marketdata
|
|
|
|
|
|
# 执行初始化脚本
|
|
|
psql $DATABASE_URL -f memory/2026-03-07-database-schema.sql
|
|
|
```
|
|
|
|
|
|
#### 4. 下载依赖并启动
|
|
|
|
|
|
```bash
|
|
|
make deps
|
|
|
make run
|
|
|
```
|
|
|
|
|
|
### 方式二:Python实现(推荐开发环境)
|
|
|
|
|
|
#### 1. 环境准备
|
|
|
|
|
|
- Python 3.10+
|
|
|
- PostgreSQL 15+
|
|
|
- Tushare Token
|
|
|
|
|
|
#### 2. 安装依赖
|
|
|
|
|
|
```bash
|
|
|
cd python_market_data_service
|
|
|
|
|
|
# 创建虚拟环境
|
|
|
python -m venv venv
|
|
|
source venv/bin/activate # Linux/Mac
|
|
|
# 或
|
|
|
venv\Scripts\activate # Windows
|
|
|
|
|
|
# 安装依赖
|
|
|
pip install -r requirements.txt
|
|
|
pip install tushare
|
|
|
```
|
|
|
|
|
|
#### 3. 配置环境变量
|
|
|
|
|
|
```bash
|
|
|
export TUSHARE_TOKEN="your_tushare_token"
|
|
|
export DATABASE_URL="postgresql://user:password@localhost:5432/marketdata"
|
|
|
export PORT="8080"
|
|
|
```
|
|
|
|
|
|
#### 4. 初始化数据库并启动
|
|
|
|
|
|
```bash
|
|
|
# 初始化数据库(SQLAlchemy自动创建表)
|
|
|
python -c "from app.repositories.database import init_db; init_db()"
|
|
|
|
|
|
# 启动服务
|
|
|
python -m app.main
|
|
|
# 或使用 uvicorn
|
|
|
uvicorn app.main:app --reload --port 8080
|
|
|
```
|
|
|
|
|
|
服务将启动在 `http://localhost:8080`
|
|
|
|
|
|
---
|
|
|
|
|
|
## API接口
|
|
|
|
|
|
> **注意**: Go和Python实现的API接口完全一致!
|
|
|
|
|
|
### 股票接口
|
|
|
|
|
|
| 接口 | 方法 | 说明 |
|
|
|
|------|------|------|
|
|
|
| `/v1/stock/klines/:symbol` | GET | 查询K线数据 |
|
|
|
| `/v1/stock/symbols` | GET | 查询标的列表 |
|
|
|
| `/v1/stock/klines/batch` | POST | 批量查询K线 |
|
|
|
| `/v1/stock/trading-dates` | GET | 获取交易日历 |
|
|
|
|
|
|
**查询K线示例**:
|
|
|
```bash
|
|
|
curl "http://localhost:8080/v1/stock/klines/000001.SZ?start=20250301&end=20250307&freq=1d&adjust=qfq" \
|
|
|
-H "X-API-Key: your_api_key"
|
|
|
```
|
|
|
|
|
|
### 期货接口
|
|
|
|
|
|
| 接口 | 方法 | 说明 |
|
|
|
|------|------|------|
|
|
|
| `/v1/futures/klines/:symbol` | GET | 查询K线数据 |
|
|
|
| `/v1/futures/symbols` | GET | 查询标的列表 |
|
|
|
| `/v1/futures/klines/batch` | POST | 批量查询K线 |
|
|
|
| `/v1/futures/continuous/:underlying` | GET | 查询主力连续合约(预留) |
|
|
|
| `/v1/futures/trading-dates` | GET | 获取交易日历 |
|
|
|
| `/v1/futures/contracts` | GET | 获取品种合约列表 |
|
|
|
|
|
|
### 管理后台
|
|
|
|
|
|
服务启动后,访问 `http://localhost:8080/admin` 进入管理后台。
|
|
|
|
|
|
**Python特有**: 自动生成API文档
|
|
|
- Swagger UI: `http://localhost:8080/docs`
|
|
|
- ReDoc: `http://localhost:8080/redoc`
|
|
|
|
|
|
---
|
|
|
|
|
|
## 数据同步工具
|
|
|
|
|
|
### Go实现
|
|
|
|
|
|
```bash
|
|
|
# 同步股票列表
|
|
|
go run ./cmd/sync -type stocks
|
|
|
|
|
|
# 同步期货列表
|
|
|
go run ./cmd/sync -type futures
|
|
|
|
|
|
# 同步交易日历
|
|
|
go run ./cmd/sync -type calendar -start 20240101 -end 20241231
|
|
|
|
|
|
# 同步K线数据
|
|
|
go run ./cmd/sync -type klines -symbol 000001.SZ -start 20240301 -end 20240307 -freq 1d
|
|
|
```
|
|
|
|
|
|
### Python实现
|
|
|
|
|
|
```bash
|
|
|
# 同步股票列表
|
|
|
python scripts/sync_data.py --type stocks
|
|
|
|
|
|
# 同步期货列表
|
|
|
python scripts/sync_data.py --type futures
|
|
|
|
|
|
# 同步交易日历
|
|
|
python scripts/sync_data.py --type calendar --start 20240101 --end 20241231
|
|
|
|
|
|
# 同步K线数据
|
|
|
python scripts/sync_data.py --type klines --symbol 000001.SZ --start 20240301 --end 20240307 --freq 1d
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 部署
|
|
|
|
|
|
### Docker部署
|
|
|
|
|
|
**Go实现:**
|
|
|
```bash
|
|
|
docker build -t market-data-service:go .
|
|
|
docker run -p 8080:8080 market-data-service:go
|
|
|
```
|
|
|
|
|
|
**Python实现:**
|
|
|
```bash
|
|
|
cd python_market_data_service
|
|
|
docker build -t market-data-service:python .
|
|
|
docker run -p 8080:8080 market-data-service:python
|
|
|
```
|
|
|
|
|
|
详细部署文档请参考 [DEPLOY.md](./DEPLOY.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
## 实现方式对比
|
|
|
|
|
|
| 特性 | Go | Python |
|
|
|
|------|----|--------|
|
|
|
| 性能 | ⭐⭐⭐ 高性能 | ⭐⭐ 良好 |
|
|
|
| 开发效率 | ⭐⭐ 中等 | ⭐⭐⭐ 高 |
|
|
|
| 数据源生态 | ⭐⭐ 需自行封装 | ⭐⭐⭐ Tushare原生支持 |
|
|
|
| 内存占用 | ⭐⭐⭐ 低 (~50MB) | ⭐⭐ 中等 (~100MB) |
|
|
|
| 启动速度 | ⭐⭐⭐ 快 (~100ms) | ⭐⭐ 中等 (~2s) |
|
|
|
| 类型安全 | ⭐⭐⭐ 编译期检查 | ⭐⭐ 运行时检查 (Pydantic) |
|
|
|
| 部署复杂度 | ⭐⭐⭐ 单二进制 | ⭐⭐ 依赖较多 |
|
|
|
| API文档 | ⭐⭐ 需手动维护 | ⭐⭐⭐ 自动生成 |
|
|
|
|
|
|
**推荐**:
|
|
|
- **生产环境**: Go实现
|
|
|
- **开发测试**: Python实现
|
|
|
- **数据源对接**: Python实现(生态更好)
|
|
|
|
|
|
---
|
|
|
|
|
|
## 文档
|
|
|
|
|
|
### 🚀 启动部署
|
|
|
- [QUICKSTART.md](./QUICKSTART.md) - **30秒快速启动指南**(推荐先看)
|
|
|
- [启动指南](./docs/startup-guide.md) - 完整的启动教程
|
|
|
- [部署文档](./DEPLOY.md) - 详细部署指南(含Docker和Systemd)
|
|
|
|
|
|
### 📚 开发文档
|
|
|
- [开发指南](./docs/development-guide.md) - 开发新功能指南
|
|
|
- [架构设计](./docs/architecture.md) - 系统架构文档
|
|
|
- [API速查表](./docs/admin-api-quick-reference.md) - API快速参考
|
|
|
- [Python迁移指南](./python_market_data_service/MIGRATION_GUIDE.md) - Go到Python迁移对照
|
|
|
|
|
|
### 📋 项目信息
|
|
|
- [项目进度](./PROGRESS.md) - 开发进度和计划
|
|
|
|
|
|
---
|
|
|
|
|
|
## 常见问题
|
|
|
|
|
|
### Q: 应该选择Go还是Python实现?
|
|
|
|
|
|
A:
|
|
|
- 如果需要**生产环境高并发**,选择**Go**
|
|
|
- 如果需要**快速开发、原型验证**,选择**Python**
|
|
|
- 如果需要**频繁对接数据源**,选择**Python**(生态更好)
|
|
|
|
|
|
### Q: 两个实现的API是否兼容?
|
|
|
|
|
|
A: **完全兼容**。所有接口、请求参数、响应格式完全一致,客户端可无缝切换。
|
|
|
|
|
|
### Q: 数据库Schema是否相同?
|
|
|
|
|
|
A: **相同**。两个实现使用相同的数据库Schema,可共享数据。
|
|
|
|
|
|
### Q: 如何实现股票复权?
|
|
|
|
|
|
A: 查询时传入 `adjust=qfq` 或 `adjust=hfq` 参数,服务会自动应用复权系数。
|
|
|
|
|
|
### Q: 期货主力连续合约何时支持?
|
|
|
|
|
|
A: 主力连续合约功能在预留表结构中,将在后续版本实现。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 贡献
|
|
|
|
|
|
欢迎提交Issue和PR!
|
|
|
|
|
|
- Go实现相关: 提交到本仓库
|
|
|
- Python实现相关: 提交到 `python_market_data_service/` 目录
|
|
|
|
|
|
---
|
|
|
|
|
|
## License
|
|
|
|
|
|
MIT
|