774170ec05
采集层(多源各下): - 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设计
51 lines
1.6 KiB
Python
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()
|