"""退化股因子列体检：本地 distinct vs tushare 真值 distinct + 全库 B-误报定位。

用法: ./zt_venv/bin/python code/_chk_degenerate_factors.py
"""
import os, 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"
CODES = ['600705.SH', '000627.SZ', '600837.SH', '000961.SZ', '000671.SZ', '600068.SH']

a = pd.read_csv(f"{ROOT}/adj_factor_all.csv")
print("adj_factor_all:", a.shape, list(a.columns))
print("  dates", a['trade_date'].min(), "->", a['trade_date'].max(), "distinct", a['trade_date'].nunique(),
      "| codes", a['ts_code'].nunique())

for c in CODES:
    fs = glob.glob(f"{ROOT}/daily_*/{c}.csv")
    if not fs:
        print(f"{c}: 无文件"); continue
    d = pd.read_csv(fs[0])
    t = None
    for _ in range(3):
        try:
            t = pro.adj_factor(ts_code=c)
            if t is not None and len(t): break
        except Exception:
            pass
        time.sleep(2)
    if t is None or not len(t):
        print(f"{c}: tushare 无返回"); continue
    t = t.sort_values('trade_date')
    tsteps = int((t['adj_factor'].diff().abs() > 1e-9).sum())
    print(f"{c} [{fs[0].split('/')[1]}]: 行 {len(d)} 末行 {d['trade_date'].iloc[-1]} | "
          f"本地 distinct {d['adj_factor'].nunique()} vs tushare distinct {t['adj_factor'].nunique()} "
          f"(tushare 步 {tsteps} 次, 末日 {t['trade_date'].iloc[-1]}) | 两端行数 {len(d)} vs {len(t)}")
