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.

199 lines
5.0 KiB

# 新表结构快速开始指南
## 1. 创建新表
```bash
# 进入项目目录
cd d:\\alpha_workspace\\python_market_data_service
# 激活虚拟环境
.\\venv\\Scripts\\activate
# 创建新表
python scripts/create_split_tables.py
# 如果需要重新创建(会删除已有数据)
python scripts/create_split_tables.py --drop-existing
```
## 2. 启动服务
```bash
# 启动主服务
python main.py
```
## 3. 同步数据
### 全量同步示例
```bash
# 同步茅台和平安银行的历史数据
curl -X POST "http://localhost:8080/admin/data/sync" \
-H "Content-Type: application/json" \
-d '{
"symbols": ["600519.SH", "000001.SZ"],
"sync_type": "full",
"start_date": "20230101",
"end_date": "20240301"
}'
```
### 增量同步示例
```bash
# 同步最近30天的数据
curl -X POST "http://localhost:8080/admin/data/sync/incremental" \
-H "Content-Type: application/json" \
-d '["600519.SH", "000001.SZ"]'
```
### 只同步基础数据
```bash
curl -X POST "http://localhost:8080/admin/data/sync" \
-H "Content-Type: application/json" \
-d '{
"symbols": ["600519.SH"],
"sync_type": "base",
"start_date": "20240101",
"end_date": "20240301"
}'
```
## 4. 查询数据
### 使用 Repository 查询
```python
from app.repositories.stock_repository_v2 import StockRepositoryV2
from app.repositories.database import SessionLocal
from app.models import Frequency
from datetime import datetime
# 创建会话
db = SessionLocal()
repo = StockRepositoryV2(db)
# 查询基础K线数据高效字段少
base_data = repo.get_klines_base(
symbol="600519.SH",
freq=Frequency.FREQ_1D,
start=datetime(2024, 1, 1),
end=datetime(2024, 3, 1)
)
print(f"Base records: {len(base_data)}")
# 查询行情指标包含均线、MACD等
quote_data = repo.get_klines_quote(
symbol="600519.SH",
start_date="2024-01-01",
end_date="2024-03-01"
)
for item in quote_data[:3]:
print(f"{item['trade_date']}: close={item.get('ma5')}")
# 查询财务数据(市值、股本等)
finance_data = repo.get_klines_finance(
symbol="600519.SH",
start_date="2024-01-01",
end_date="2024-03-01"
)
for item in finance_data[:3]:
print(f"{item['trade_date']}: 市值={item.get('total_market_cap')}")
```
## 5. 定时任务配置
创建每日定时同步脚本 `scripts/daily_sync.py`:
```python
#!/usr/bin/env python3
"""每日增量同步脚本"""
import asyncio
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from app.services.adapter_service import AdapterService
from app.services.data_sync_service import DataSyncService
from app.repositories.stock_repository_v2 import StockRepositoryV2
from app.repositories.database import SessionLocal
async def main():
# 获取热门股票列表
db = SessionLocal()
repo = StockRepositoryV2(db)
# 这里可以从配置或数据库读取需要同步的标的列表
symbols = ["600519.SH", "000001.SZ", "000858.SZ"] # 示例
# 获取适配器
adapter_service = AdapterService()
adapter = adapter_service.get_active_adapter("stock")
# 同步
sync_service = DataSyncService(adapter)
results = await sync_service.sync_daily_incremental(symbols)
print("Sync completed:", results)
if __name__ == "__main__":
asyncio.run(main())
```
添加到定时任务Linux crontab
```bash
# 每天凌晨2点执行增量同步
0 2 * * * cd /path/to/project && python scripts/daily_sync.py >> logs/sync.log 2>&1
```
## 6. 表结构说明
| 表名 | 用途 | 数据来源 | 更新频率 |
|------|------|----------|----------|
| stock_klines_1d_base | 基础K线(OHLCV) | query_kline | 每日 |
| stock_klines_1d_quote | 行情指标 | 本地计算 | 每日 |
| stock_klines_1d_finance | 财务数据 | 股本/财报接口 | 财报季 |
| stock_realtime_quotes | 实时行情 | 行情推送 | 实时 |
| stock_symbols | 股票列表 | 基础数据接口 | 每日 |
| stock_trading_calendar | 交易日历 | 交易所数据 | 每年 |
## 7. 常见问题
### Q: 旧表数据如何迁移?
A: 使用以下SQL迁移基础数据
```sql
INSERT INTO stock_klines_1d_base
(symbol_id, ts, trade_date, open, high, low, close, volume, amount)
SELECT
symbol_id, ts, trade_date, open, high, low, close, volume, amount
FROM stock_klines_1d
WHERE trade_date >= '2024-01-01';
```
### Q: 如何只查询基础数据提高性能?
A: 使用 `StockRepositoryV2.get_klines_base()` 方法它只查询轻量的base表。
### Q: 行情指标如何计算?
A: 指标在 `AmazingDataAdapter._fetch_kline_quote_sync()` 中本地计算:
- 均线: 基于收盘价计算MA5/10/20/30/60/120/250
- MACD: 使用pandas ewm计算
- 乖离率: (收盘价-均线)/均线
- 涨跌停: 对比收盘价和涨跌停价
### Q: 市值数据如何计算?
A: 市值 = 收盘价 × 股本,股本从 `get_equity_structure` 接口获取。
## 8. 下一步
- [ ] 配置定时自动同步
- [ ] 添加Redis缓存热点数据
- [ ] 实现分钟线行情指标表
- [ ] 添加数据一致性校验任务