#!/usr/bin/env python3
"""核对: ①列顺序统一 ②factor=真实 ③三档关系正确 ④无NaN污染"""
import glob, os
import pandas as pd
from collections import Counter
BASE = os.path.expanduser('~/zt_app/backtest_zt_full')

# ① 列顺序统一
orders = Counter()
for f in glob.glob(f'{BASE}/daily_*/*.csv')[:3000]:
    with open(f) as fh:
        orders[tuple(fh.readline().strip().split(','))] += 1
print('① 列顺序种类:', len(orders), '| 主序文件数:', list(orders.values())[0])
main_order = list(orders.most_common(1)[0][0])
print('   标准列含 adj_factor:', 'adj_factor' in main_order)

# ② factor 与真实因子表一致(最新日)
af = pd.read_csv(f'{BASE}/adj_factor_all.csv', dtype={'trade_date': str})
bad = 0; n = 0
for f in glob.glob(f'{BASE}/daily_*/*.csv')[:400]:
    d = pd.read_csv(f, dtype={'trade_date': str}).sort_values('trade_date')
    code = os.path.basename(f)[:-4]
    real = af[af['ts_code'] == code]['adj_factor'].values
    if len(real):
        n += 1
        if abs(d['adj_factor'].iloc[-1] - real[0]) > 0.02:
            bad += 1
print(f'② 最新日 factor vs 真实表: 抽{n}只, 不一致 {bad}')

# ③ 三档关系(含除权日一致性)
#    hfq_close == raw_close*factor ; qfq_close == raw_close*factor/latest_factor
import random
random.seed(7)
check = 0; hfq_bad = 0; qfq_bad = 0; nan_factor = 0
for f in random.sample(glob.glob(f'{BASE}/daily_*/*.csv'), 300):
    d = pd.read_csv(f, dtype={'trade_date': str}).sort_values('trade_date').reset_index(drop=True)
    if 'adj_factor' not in d.columns or d['adj_factor'].isna().all():
        nan_factor += 1; continue
    rc = d['raw_close'].astype(float); hf = d['hfq_close'].astype(float)
    fac = d['adj_factor'].astype(float)
    lt = fac.iloc[-1]
    # 预留对照: hfq≈raw*factor
    dh = (hf - rc*fac).abs().max()
    if dh > 0.05: hfq_bad += 1
    # qfq≈raw*factor/latest
    dq = (d['qfq_close'].astype(float) - rc*fac/lt).abs().max()
    if dq > 0.05: qfq_bad += 1
    check += 1
print(f'③ 三档关系抽{check}只: hfq≠raw*factor {hfq_bad} | qfq≠raw*factor/latest {qfq_bad} | factor全NaN {nan_factor}')

# ④ NaN factor 全局统计
tot = tot_nan = 0
for f in glob.glob(f'{BASE}/daily_*/*.csv'):
    d = pd.read_csv(f, dtype={'trade_date': str}, usecols=['adj_factor'])
    tot += len(d); tot_nan += d['adj_factor'].isna().sum()
print(f'④ factor NaN: {tot_nan}/{tot} ({tot_nan/max(1,tot)*100:.3f}%)')
