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]