"""落盘 adj_factor 与 tushare 真值抽样对账（只读）。

用法: ./zt_venv/bin/python code/_chk_factor_vs_tushare.py 20250115 20260828
原理: pro.adj_factor(trade_date=...) 一次返回全市场当日因子 -> 与四池文件同列逐只比对。
阈值: 链特征对账阈值 1e-4；超过即视为因子列偏差（hfq 派生价会继承）。
"""
import os, sys, glob
import pandas as pd

if len(sys.argv) < 2:
    print(__doc__); sys.exit(1)
os.environ.setdefault('HTTP_PROXY', 'http://127.0.0.1:7897')
os.environ.setdefault('HTTPS_PROXY', 'http://127.0.0.1:7897')
os.environ.setdefault('NO_PROXY', '100.76.168.126,localhost,127.0.0.1')

import tushare as ts
ts.set_token('edf6739fe1a4de0d747600cc753a8b4bf335cf27ef0f5aea2d2aa64c')
pro = ts.pro_api()

POOLS = ["hs300", "zz500", "zz1000", "zz2000"]
ROOT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "backtest_zt_full")

for dt in sys.argv[1:]:
    loc = {}
    for p in POOLS:
        for f in glob.glob(f"{ROOT}/daily_{p}/*.csv"):
            code = os.path.basename(f)[:-4]
            d = pd.read_csv(f, usecols=['trade_date', 'adj_factor'])
            r = d[d.trade_date == int(dt)]
            if len(r):
                loc[code] = float(r['adj_factor'].iloc[0])
    t = pro.adj_factor(trade_date=dt).set_index('ts_code')['adj_factor']
    rows = sorted([(abs(v / float(t[c]) - 1), c, v, float(t[c])) for c, v in loc.items() if c in t.index],
                  reverse=True)
    n = len(rows)
    over = [r for r in rows if r[0] > 1e-4]
    print(f"[{dt}] 比对 {n} 只 | >1e-4: {len(over)} ({len(over)/n:.1%}) | "
          f">1e-3: {sum(1 for r in rows if r[0] > 1e-3)} | max {rows[0][0]:.2e} ({rows[0][1]})"
          if n else f"[{dt}] 无匹配")
    for e, c, v, tv in rows[:5]:
        print(f"    {c}: local {v:.4f} vs tushare {tv:.4f}  rel {e:.2e}")