"""逐池副本 vs tushare 的 adj_factor 偏差（按日全市场口径，1 次 API/日）。
用法: ./zt_venv/bin/python code/chk_pool_factor_vs_tushare.py 20250115 20210802 20260828
"""
import os, sys, glob, time
import numpy as np
import pandas as pd

os.environ.setdefault('HTTP_PROXY', 'http://127.0.0.1:7897')
os.environ.setdefault('HTTPS_PROXY', 'http://127.0.0.1:7897')
import tushare as ts
ts.set_token('edf6739fe1a4de0d747600cc753a8b4bf335cf27ef0f5aea2d2aa64c')
pro = ts.pro_api()
ROOT = "backtest_zt_full"
POOLS = ["hs300", "zz500", "zz1000", "zz2000"]
COLS = ['raw_close', 'adj_factor', 'pct_chg']

for dt in sys.argv[1:] or ['20250115']:
    s = pro.adj_factor(trade_date=dt).set_index('ts_code')['adj_factor'].astype(float)
    dly = pro.daily(trade_date=dt).set_index('ts_code')
    print(f"=== {dt} ===")
    for p in POOLS:
        tot = bad_f = bad_p = bad_r = 0
        worst = []
        for f in glob.glob(f"{ROOT}/daily_{p}/*.csv"):
            c = os.path.basename(f)[:-4]
            d = pd.read_csv(f, usecols=['trade_date', 'raw_close', 'adj_factor', 'pct_chg'])
            r = d[d.trade_date == int(dt)]
            if not len(r):
                continue
            tot += 1
            r = r.iloc[0]
            if c in s.index and s[c] > 0:
                rel = abs(float(r['adj_factor']) / s[c] - 1)
                if rel > 1e-4:
                    bad_f += 1
                    worst.append((rel, c))
            if c in dly.index:
                if abs(float(r['raw_close']) - float(dly.loc[c, 'close'])) > 1e-9:
                    bad_r += 1
                if abs(float(r['pct_chg']) - float(dly.loc[c, 'pct_chg'])) > 1e-4:
                    bad_p += 1
        worst.sort(reverse=True)
        w = f"{worst[0][0]:.2e} @{worst[0][1]}" if worst else '-'
        print(f"  {p:<7} n={tot:<5} adj_factor>1e-4 {bad_f:>5} ({bad_f/max(tot,1):>6.1%}) | "
              f"pct_chg>1e-4 {bad_p:>5} | raw_close≠ {bad_r:>4} | max {w}")
    time.sleep(0.5)
