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.

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

数据表分表设计文档

设计原则

所有K线数据表按照数据类型更新频率进行拆分:

  1. 基础表(Base): OHLCV等原始行情数据更新频率高
  2. 行情表(Quote): 技术指标(均线/MACD/涨跌幅),需要计算
  3. 财务表(Finance): 市值/股本等财务数据,更新频率低

股票数据表

日线数据 (1d)

表名 说明 主要字段
stock_klines_1d_base 日线基础表 symbol_id, trade_date, open, high, low, close, volume, amount, adj_factor
stock_klines_1d_quote 日线行情表 change_pct, ma5/10/20/30/60/120/250, macd_dif/dea/bar, bias5/10/20, is_limit_up/down, is_st
stock_klines_1d_finance 日线财务表 total_market_cap, float_market_cap, total_shares, float_shares, inst_holding_ratio, net_profit, revenue, eps, roe

分钟线数据

表名 说明 主要字段
stock_klines_1m 1分钟线 symbol_id, ts, trade_date, open, high, low, close, volume, amount, change_pct, macd_dif/dea/bar
stock_klines_5m 5分钟线 同上
stock_klines_15m 15分钟线 同上
stock_klines_30m 30分钟线 同上
stock_klines_60m 60分钟线 同上

周月线数据

表名 说明 主要字段
stock_klines_1w 周线 symbol_id, ts, trade_date, open, high, low, close, volume, amount
stock_klines_1month 月线 同上

实时数据

表名 说明 主要字段
stock_realtime_quotes 实时行情快照 symbol_id, last_price, open, high, low, volume, amount, bid1, ask1

基础数据

表名 说明 主要字段
stock_symbols 股票列表 symbol_id, name, exchange, list_date, industry, status
stock_trading_calendar 交易日历 trade_date, is_trading_day, week_day
stock_adjust_factors 复权系数 symbol_id, trade_date, qfq_factor, hfq_factor

期货数据表

日线数据 (1d)

表名 说明 主要字段
futures_klines_1d_base 日线基础表 symbol_id, trade_date, open, high, low, close, volume, amount, open_interest, settlement, pre_settlement
futures_klines_1d_quote 日线行情表 change_pct, ma5/10/20/30/60, macd_dif/dea/bar, oi_change, oi_change_pct, amplitude

分钟线数据

表名 说明 主要字段
futures_klines_1m_base 1分钟基础表 symbol_id, ts, trade_date, open, high, low, close, volume, amount, open_interest
futures_klines_5m_base 5分钟基础表 同上
futures_klines_15m_base 15分钟基础表 同上
futures_klines_30m_base 30分钟基础表 同上
futures_klines_60m_base 60分钟基础表 同上

周月线数据

表名 说明 主要字段
futures_klines_1w_base 周线基础表 symbol_id, ts, trade_date, open, high, low, close, volume, amount, open_interest
futures_klines_1month_base 月线基础表 同上

实时数据

表名 说明 主要字段
futures_realtime_quotes 实时行情快照 symbol_id, last_price, open, high, low, volume, amount, open_interest, bid1, ask1, limit_up, limit_down

基础数据

表名 说明 主要字段
futures_symbols 合约列表 symbol_id, name, exchange, underlying, contract_month, list_date, delist_date
futures_trading_calendar 交易日历 trade_date, is_trading_day, has_night_session, week_day

代码实现

Repository 结构

app/repositories/
├── stock_repository_v2.py      # 股票分表仓库
├── futures_repository_v2.py    # 期货分表仓库
└── models.py                    # 所有模型定义

关键方法

StockRepositoryV2

# 基础数据操作
get_klines_base(symbol, freq, start, end) -> List[Dict]
save_klines_base(freq, items) -> int

# 行情数据操作
get_klines_quote(symbol, start_date, end_date) -> List[Dict]
save_klines_quote(items) -> int

# 财务数据操作
get_klines_finance(symbol, start_date, end_date) -> List[Dict]
save_klines_finance(items) -> int

# 实时行情
get_realtime_quote(symbol) -> Optional[Dict]
save_realtime_quote(data) -> None

FuturesRepositoryV2

# 基础数据操作
get_klines_base(symbol, freq, start, end) -> List[Dict]
save_klines_base(freq, items) -> int

# 行情数据操作
get_klines_quote(symbol, start_date, end_date) -> List[Dict]
save_klines_quote(items) -> int

# 实时行情
get_realtime_quote(symbol) -> Optional[Dict]
save_realtime_quote(data) -> None

使用示例

股票数据查询

from app.repositories.stock_repository_v2 import StockRepositoryV2
from app.repositories.database import SessionLocal
from app.models import Frequency

db = SessionLocal()
repo = StockRepositoryV2(db)

# 只查询基础数据(高效)
base_data = repo.get_klines_base(
    symbol="600519.SH",
    freq=Frequency.FREQ_1D,
    start=datetime(2024, 1, 1),
    end=datetime(2024, 3, 1)
)

# 查询行情指标
quote_data = repo.get_klines_quote(
    symbol="600519.SH",
    start_date="2024-01-01",
    end_date="2024-03-01"
)

# 查询财务数据
finance_data = repo.get_klines_finance(
    symbol="600519.SH",
    start_date="2024-01-01",
    end_date="2024-03-01"
)

期货数据查询

from app.repositories.futures_repository_v2 import FuturesRepositoryV2

db = SessionLocal()
repo = FuturesRepositoryV2(db)

# 查询期货基础数据
base_data = repo.get_klines_base(
    symbol="RB2410.SH",
    freq=Frequency.FREQ_1D,
    start=datetime(2024, 1, 1),
    end=datetime(2024, 3, 1)
)

# 查询期货行情指标
quote_data = repo.get_klines_quote(
    symbol="RB2410.SH",
    start_date="2024-01-01",
    end_date="2024-03-01"
)

创建表的脚本

# 创建所有分表
python scripts/create_split_tables.py

# 重新创建(会删除已有数据)
python scripts/create_split_tables.py --drop-existing

数据同步

股票数据同步

# 全量同步
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": "20240101",
    "end_date": "20240301"
  }'

期货数据同步

期货数据同步API待实现可参考股票同步API实现类似接口。


性能优势

  1. 查询优化: 只需基础数据时只查询轻量的base表
  2. 更新解耦:
    • 基础数据: 每日收盘后更新
    • 行情指标: 计算后批量更新
    • 财务数据: 财报季更新
  3. 存储优化: 热点数据(base)和冷数据(finance)分离存储
  4. 扩展性: 新增指标只需修改quote表不影响其他表

后续扩展

  1. 分钟线行情表: 为高频策略提供分钟级技术指标
  2. 跨表查询视图: 创建联合视图方便查询
  3. 数据分区: 按trade_date对大表进行分区
  4. 缓存层: Redis缓存热点基础数据