数据表分表设计文档
设计原则
所有K线数据表按照数据类型和更新频率进行拆分:
- 基础表(Base): OHLCV等原始行情数据,更新频率高
- 行情表(Quote): 技术指标(均线/MACD/涨跌幅),需要计算
- 财务表(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实现类似接口。
性能优势
- 查询优化: 只需基础数据时,只查询轻量的base表
- 更新解耦:
- 基础数据: 每日收盘后更新
- 行情指标: 计算后批量更新
- 财务数据: 财报季更新
- 存储优化: 热点数据(base)和冷数据(finance)分离存储
- 扩展性: 新增指标只需修改quote表,不影响其他表
后续扩展
- 分钟线行情表: 为高频策略提供分钟级技术指标
- 跨表查询视图: 创建联合视图方便查询
- 数据分区: 按trade_date对大表进行分区
- 缓存层: Redis缓存热点基础数据