import pandas as pd, glob, numpy as np
fs = sorted(glob.glob('backtest_zt_full/daily_*/*.csv'))
nA = nB = nN = 0   # A: pct 与 pre_close 自洽; B: pct 与 前日raw_close 自洽; N: 都不
samples = []
for f in fs[:1200]:
    d = pd.read_csv(f, dtype={'trade_date': str}).sort_values('trade_date').reset_index(drop=True)
    if len(d) < 3: continue
    prev = d['raw_close'].shift(1).values; pc = d['pct_chg'].values
    a = (d['raw_close'].values / d['pre_close'].values - 1) * 100
    b = (d['raw_close'].values / prev - 1) * 100
    m = np.isfinite(prev) * np.isfinite(pc)
    okA = np.abs(a - pc) < 0.05; okB = np.abs(b - pc) < 0.05
    sel = np.logical_and(m, np.logical_not(okA))
    for i in np.where(sel)[0]:
        if okB[i]: nB += 1
        else: nN += 1
        if len(samples) < 8:
            samples.append((f.split('/')[-1], d['trade_date'].values[i], round(float(d['raw_close'].values[i]),3),
                            round(float(prev[i]),3), round(float(d['pre_close'].values[i]),3), round(float(pc[i]),4),
                            round(float(a[i]),4), round(float(b[i]),4)))
    for i in np.logical_and(np.logical_and(m, okA), np.abs(d['pre_close'].values - prev) > 0.01).nonzero()[0]:
        nA += 1
print('pre_close 与 前日raw_close 不一致的行中:')
print('  与 pre_close 自洽(A, 说明前日raw_close行有问题)', nA)
print('  与前日raw_close 自洽(B, 说明pre_close是除权另有因)', nB)
print('  两者都不自洽', nN)
print('样本: code, date, raw_close, 前日raw_close, pre_close, pct_chg, A算, B算')
for s in samples: print(s)