Files
claude_dev 774170ec05 feat(data): 数据源融合 P0 补全 + 每日增量脚本
采集层(多源各下):
- baostock: 日线全字段全量(baostock_daily_fullmarket) + 15min全市场 + 静态(基础/复权/分红/季频/三表) + 成份股
- akshare: 静态(估值/龙虎榜/大宗/融资融券/北向/指数成分/行业/股本/解禁/业绩预告)
- xtdata(miniQMT): build_daily_from_xtdata + daily_update_xtdata

数据补全 P0:
- ETF全市场: universe 扩展 沪深A股∪ETF∪基金(7414), dividend_type='front' 前复权
- 历史成份股(治幸存者偏差): index_const_hist_download 深证/国证 adjust_cni 4指数 + 中证1000/2000快照 + 新浪交叉校验
- 退市K线: baostock_delisted_download + import_delisted_to_db(实证 Day1 fetch_all_stocks 已含退市)

灌库:
- import_baostock_to_db: daily_baostock_full(5537股/1826万行,18字段)+ bs_index_constituent + bs_adjust_factor
- INSERT OR REPLACE 幂等, WAL+busy_timeout, dbbardata 不碰

每日增量 #7(用户决策A: VPS直跑):
- daily_update_static: login探针防黑名单graceful skip + LOOKBACK7 + query_stock_basic含退市 + INSERT OR REPLACE + QUERY_COUNT守48000/天

设计文档: spec(13节三层融合) + P0 plan + 数据gap设计
2026-07-22 10:34:22 +08:00

51 lines
1.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""验证主库 data(非 staging) 的 ETF + A股 max_date。
检查: sh510300/sh513050/sz159919 max_date==2026-07-21;sh600519 max_date==2026-07-21(未被 staging 覆盖)。
"""
import os
import sys
import pandas as pd
DATA = r"C:\sanguo_vnpy_v2\data"
def check(sym_prefix, kind="qfq"):
"""逐年合并所有年份的 parquet。"""
root = os.path.join(DATA, kind)
if not os.path.isdir(root):
return {"err": f"no {kind} dir"}
all_dfs = []
for yr in sorted(os.listdir(root)):
if not yr.isdigit():
continue
p = os.path.join(root, yr, f"{sym_prefix}_daily.parquet")
if os.path.exists(p):
all_dfs.append(pd.read_parquet(p))
if not all_dfs:
return {"err": "not found"}
df = pd.concat(all_dfs).sort_values("date")
return {
"rows": len(df),
"min_date": str(df["date"].min().date()),
"max_date": str(df["date"].max().date()),
"tail_close": float(df["close"].iloc[-1]),
"nan_close": bool(df["close"].isnull().any()),
}
def main():
print("=== ETF 抽样 (qfq) ===")
for sym in ("sh510300", "sh513050", "sz159919"):
print(f" {sym}: {check(sym, 'qfq')}")
print("\n=== A 股对照 (qfq, 验证未被 staging 覆盖) ===")
print(f" sh600519: {check('sh600519', 'qfq')}")
print(f"\n=== raw 同抽样(完整性对照) ===")
print(f" sh510300 raw: {check('sh510300', 'raw')}")
print(f" sh600519 raw: {check('sh600519', 'raw')}")
sys.stdout.flush()
if __name__ == "__main__":
main()