"""隔离实验: 用**当前(修准后)**数据重跑交易集生成, 与
   记录版 5837 键(88438d5^ baseline) / 重建版 5776 键(88438d5 baseline) 对比。
判读: 若当前数据 → 5776 键 = 交易集变化来自数据修准(方案B); 若 → 5837 = 来自重建路径(方案A)。"""
import io, json, subprocess, sys
import pandas as pd
sys.path.insert(0, '/Users/xpresso/zt_app/code')
import grid_or as g
import ideal_engine as ie
from scan_daily_tb import COMBO, SELL_COMBO
from plot_ideal_top10 import chain_for_buy

APP = '/Users/xpresso/zt_app'
keys = []
for pool in COMBO:
    bp = COMBO[pool]; sc = SELL_COMBO[pool]
    members, dailies = g.load_pool(pool)
    sig = g.build_sig(dailies, bp)
    trades = ie.ideal_backtest(pool, members, dailies, sig, sc['profit'], sc['dd'],
                               mode=sc['mode'], stop=sc['stop'], hold=sc['hold'], start='20240201')
    n_ok = 0
    for t in trades:
        d = dailies[t['code']].sort_values('trade_date').reset_index(drop=True)
        t0i, tai, tbi = chain_for_buy(d, t['code'], bp, str(t['buy_date']))
        if t0i is None:
            continue
        n_ok += 1
        keys.append((t['code'], str(t['buy_date'])))
    print(f'{pool}: {len(trades)}笔(链可定位 {n_ok})', flush=True)

now = set(keys)
print('\n当前数据生成的键 (buy_date<=20260911):', len({k for k in now if k[1] <= '20260911'}),
      '| 含 0914:', len(now))

def baseline_keys(ref):
    r = subprocess.run(['git', '-C', APP, 'show', f'{ref}:backtest_zt_full/strength_baseline.csv'], capture_output=True)
    df = pd.read_csv(io.BytesIO(r.stdout), dtype={'buy_date': str})
    df = df[df['buy_date'] <= '20260911']
    return set(zip(df['code'], df['buy_date']))

rec = baseline_keys('88438d5^')   # 记录版(5837)
reb = baseline_keys('88438d5')    # 重建版(5776)
cur = baseline_keys('HEAD')       # 现行(6013 含回补)
print('记录版 88438d5^:', len(rec), '| 重建版 88438d5:', len(reb), '| 现行 HEAD:', len(cur))
for nm, s in [('记录版5837', rec), ('重建版5776', reb), ('现行6013', cur)]:
    inter = now & s
    print(f'  与「当前数据重跑」交集 {len(inter)} | 仅重跑有 {len(now - s)} | 仅{nm}有 {len(s - now)}')