#!/usr/bin/env python3
"""chk_exdiv_miss_detail.py — 列出 B-only 判据的"漏判"明细(真值=因子跳幅≥阈值)。

用于核查漏判集是否都是亚阈噪声; 若出现大幅跳幅漏判, 单列出来人工看。
用法: python code/chk_exdiv_miss_detail.py [跳幅阈值% 默认0.5]
"""
import sys, glob
import numpy as np
import pandas as pd

BASE = '/Users/xpresso/zt_app/backtest_zt_full'
THR = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5
TOL = 0.05
out = []
for f in sorted(glob.glob(f'{BASE}/daily_*/*.csv')):
    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
    fr = d['adj_factor'].values / d['adj_factor'].shift(1).values
    pct = d['pct_chg'].values; rc = d['raw_close'].values; pc = d['pre_close'].values
    ok = np.isfinite(prev) * np.isfinite(fr) * np.isfinite(pct)
    jump = np.abs(fr - 1) * 100
    B = (rc / prev - 1) * 100
    miss = np.logical_and(np.logical_and(ok, jump >= THR), np.abs(B - pct) < TOL)
    for i in np.where(miss)[0]:
        out.append((f.split('/')[-1][:-4], d['trade_date'].values[i], round(jump[i], 4),
                    round(float(rc[i]), 3), round(float(prev[i]), 3), round(float(pc[i]), 3),
                    round(float(pct[i]), 4), round(float(B[i]), 4)))
print(f'B-only 漏判明细(真值跳幅 ≥{THR}%): {len(out)} 条')
print('代码 | 日期 | 跳幅% | raw_close | 前日raw_close | pre_close | pct_chg | B')
for r in sorted(out, key=lambda x: -x[2]):
    print(r)