from pathlib import Path
import json,hashlib
import numpy as np
import pandas as pd
O=Path(__file__).resolve().parent
def read(p):return json.loads(p.read_text(encoding='utf-8-sig'))
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
r=read(O/'风险预算实验结果.json');a=read(O/'风险预算实验路径.json');p=pd.read_csv(r['source_path']).pivot(index='date',columns='symbol',values='adjusted_close')[a['assets']]
assert sha(Path(r['source_path']))==r['source_sha256']
errors={};c=.0005
# Independent ledger: adjusted-price units; fee solved analytically for each buy/sell sign regime.
for t in a['trades_5bps']:
    name=t['strategy'];orders={x['execution']:x for x in t['orders']};path=a['paths'][name+'_5'];units=np.zeros(4);cash=100000.;navs=[];fees=0.
    for d in path['dates']:
        prices=p.loc[d].to_numpy();hold=units*prices;nav=float(hold.sum()+cash)
        if d in orders:
            w=np.array(orders[d]['weights']);after=nav
            for _ in range(20):
                signs=np.sign(after*w-hold);new=(nav+c*float(signs@hold))/(1+c*float(signs@w))
                if abs(new-after)<1e-9:after=new;break
                after=new
            cost=c*float(np.abs(after*w-hold).sum());assert abs(after+cost-nav)<1e-6
            units=after*w/prices;cash=0.;fees+=cost
        navs.append(float(units@prices+cash))
    gap=float(np.max(np.abs(np.array(navs)-np.array(path['nav']))));assert gap<1e-6;errors[name]=gap
    m=next(x for x in r['results'] if x['strategy']==name and x['one_way_bps']==5)
    assert abs(m['fees_USD']-fees)<1e-7
    nv=np.r_[100000.,navs];assert abs((1-nv/np.maximum.accumulate(nv)).max()-m['max_drawdown'])<1e-12
    if m['max_drawdown_recovered']:
        peaknav=nv[np.argmax(nv[:np.argmax(1-nv/np.maximum.accumulate(nv))+1])]
        k=path['dates'].index(m['max_drawdown_recovered']);assert navs[k]>=peaknav and navs[k-1]<peaknav
    assert m['rolling_years']['20']['observations']==0
erc_gaps=[]
for s in a['signals']:
    i=p.index.get_loc(s['signal']);window=p.iloc[i-252:i+1].pct_change(fill_method=None).iloc[1:]
    cov=window.cov().to_numpy();assert np.allclose(cov,np.array(s['covariance']),atol=1e-15)
    w=np.array(s['weights']['nominal_erc'])[:3];contrib=w*(cov[:3,:3]@w);erc_gaps.append(float(np.max(abs(contrib/contrib.sum()-1/3))))
assert max(erc_gaps)<1e-9
q=Path('C:/Users/Administrator/Documents/ChatGPT/长期投资系统/docs/research/2026-11-07-three-track-selection-v2.json')
assert sha(q)=='54862eb2f32bbe265559721d289605e09ba793e5081780ac2ab55f29594ec523'
out={'independent_adjusted_price_unit_ledger_max_USD_error':errors,'independent_fee_regime_solver':True,'drawdown_and_recovery_crosscheck':True,'all_signal_covariances_recomputed':True,'max_erc_share_gap':max(erc_gaps),'no_20_year_fabrication':True,'C6_registry_sha256':sha(q),'old_price_sha256':sha(Path(r['source_path'])),'scope':'Offline mathematical/replay verification only; not data vendor independent certification or live validation'}
(O/'风险预算独立验收.json').write_text(json.dumps(out,ensure_ascii=False,indent=2),encoding='utf-8');print(json.dumps(out,ensure_ascii=False))
