c2a89d01a4
spec §14 方案A 数据层迁移完成 + E2E 验证(read_db_daily: 在市/退市治偏差/ETF 全OK):
- dbbardata('d') 1826万含退市(治回测幸存者偏差, INSERT OR REPLACE staging迁移, WHERE OHLC NOT NULL+COALESCE)
- constituent_unified 7110行/9指数(300/500/50 baostock全集 + 深证4指 akshare cni union + 中证1000/2000 snapshot)
- pe/pb 不进DB -> valuation_baostock/<year>.parquet 按年宽表(2003-2026)
- 废弃 daily_baostock_full/bs_index_constituent(rename _old 保留); 旧4 schtask disabled
- 新 schtask sanguo-bs-eod 18:05(baostock个股日线+15min+拆pe/pb DAILY_LIMIT 48000) + sanguo-xt-eod 18:40(ETF/基金xtata)
- 权威源: baostock个股日线+估值+15min+复权+300/500/50 / xtata ETF+基金+当天实时 / akshare三表+事件+深证中证成份股
- 全程备份+staging+_old保留可回滚; 脚本 audit/probe/migrate/merge/cleanup/fix_config/verify/bs_eod/xt_eod/wrapper/register_schtasks
- 待办(spec §6 使用层): LocalParquetProvider 接 constituent_unified+valuation_baostock + 实时拼接
33 lines
1.3 KiB
Python
33 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""probe_dbbardata_unique.py — 单元4 merge 前置: 查 dbbardata UNIQUE 约束 + verify staging。
|
|
|
|
INSERT OR REPLACE 依赖 dbbardata 有 UNIQUE(symbol,exchange,datetime,interval) 才能去重,
|
|
否则插重复。vnpy DbBarData 通常有 UniqueConstraint, 此处确认。
|
|
"""
|
|
import sqlite3
|
|
|
|
DB = r"C:\sanguo_vnpy_v2\data\quant_trading.db"
|
|
c = sqlite3.connect(DB, timeout=120)
|
|
c.execute("PRAGMA busy_timeout = 120000")
|
|
|
|
print("dbbardata sql:", c.execute(
|
|
"SELECT sql FROM sqlite_master WHERE name='dbbardata'").fetchone())
|
|
print("\ndbbardata indexes:")
|
|
for idx in c.execute("PRAGMA index_list('dbbardata')").fetchall():
|
|
cols = c.execute(f"PRAGMA index_info('{idx[1]}')").fetchall()
|
|
print(f" {idx} cols={cols}")
|
|
|
|
print("\n--- staging verify ---")
|
|
print("staging rows:", c.execute(
|
|
"SELECT COUNT(*) FROM dbbardata_staging_daily").fetchone()[0])
|
|
print("staging distinct symbol:", c.execute(
|
|
"SELECT COUNT(DISTINCT symbol) FROM dbbardata_staging_daily").fetchone()[0])
|
|
for sym, label in [("000005", "退市"), ("000023", "退市"),
|
|
("600519", "在市"), ("510300", "ETF")]:
|
|
r = c.execute(
|
|
"SELECT COUNT(*), MIN(datetime), MAX(datetime) "
|
|
"FROM dbbardata_staging_daily WHERE symbol=?", (sym,)).fetchone()
|
|
print(f" {sym}({label}): {r}")
|
|
c.close()
|