import pandas as pd, glob, numpy as np
fs = sorted(glob.glob('backtest_zt_full/daily_*/*.csv'))
n = 0; ok = 0; worst = 0.0; bars = 0
for f in fs:
    d = pd.read_csv(f, dtype={'trade_date': str}).sort_values('trade_date').reset_index(drop=True)
    if len(d) < 3: continue
    fp = d['adj_factor'].shift(1).values; prev = d['raw_close'].shift(1).values
    fr = d['adj_factor'].values / fp                      # 因子比
    real = np.logical_and(np.isfinite(fr), np.abs(fr - 1) > 1e-4)
    i = np.where(np.logical_and(real, np.isfinite(prev)))[0]
    if len(i) == 0: continue
    imp = prev[i] / d['pre_close'].values[i]
    err = np.abs(imp - fr[i]) / fr[i]
    n += len(i); ok += int((err < 1e-4).sum()); worst = max(worst, float(np.median(err)))
    if err.max() > 1e-3: bars += 1
print('真实除权日行数(因子比偏离>1e-4)', n, '| 其中 pre_close 反推因子吻合(<1e-4)', ok, f'({ok/max(n,1)*100:.2f}%)', '| 中位误差上界', worst, '| 有偏差的股票数', bars)