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.

5.0 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.

新表结构快速开始指南

1. 创建新表

# 进入项目目录
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. 启动服务

# 启动主服务
python main.py

3. 同步数据

全量同步示例

# 同步茅台和平安银行的历史数据
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"
  }'

增量同步示例

# 同步最近30天的数据
curl -X POST "http://localhost:8080/admin/data/sync/incremental" \
  -H "Content-Type: application/json" \
  -d '["600519.SH", "000001.SZ"]'

只同步基础数据

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 查询

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:

#!/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

# 每天凌晨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迁移基础数据

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缓存热点数据
  • 实现分钟线行情指标表
  • 添加数据一致性校验任务