"""R636:完整持有区间监测,未知行业保留,终点合规不掩盖中途超限。""" from math import isfinite,isclose SHARES={'A':4,'B':4,'C':1};SECTORS={'A':'Tech','B':'Health','C':'Utilities'} PRICES={'A':[100,140,150,110,100],'B':[100]*5,'C':[100]*5} def monitor(shares,cash,prices,sectors): if not isfinite(cash) or cash<0:raise ValueError('invalid cash') rows=[] for t in range(5): if any(prices[s][t] is None or not isfinite(prices[s][t]) or prices[s][t]<=0 for s in shares):raise ValueError('missing or invalid price') values={s:shares[s]*prices[s][t] for s in shares} if any(not isfinite(v) or v<0 for v in values.values()):raise ValueError('invalid quote') nav=cash+sum(values.values()) if not isfinite(nav) or nav<=0:raise ValueError('invalid NAV') w={s:value/nav for s,value in values.items()};sector={} for s,weight in w.items(): group=sectors.get(s) or 'Unknown';sector[group]=sector.get(group,0)+weight assert isclose(sum(w.values())+cash/nav,1,rel_tol=0,abs_tol=1e-12) rows.append({'session':t,'NAV':nav,'weights':w,'sectors':sector, 'tech_breach':sector.get('Tech',0)>.45,'single_breach':max(w.values(),default=0)>.49, 'classification_complete':'Unknown' not in sector, 'tech_upper_bound':sector.get('Tech',0)+sector.get('Unknown',0), 'tech_conclusion':'confirmed_breach' if sector.get('Tech',0)>.45 else 'classification_incomplete' if sector.get('Unknown',0)>0 else 'within_declared_cap'}) return rows def episodes(rows,field): out=[];current=[] for row in rows: if row[field]:current.append(row['session']) elif current:out.append(current);current=[] if current:out.append(current) return out rows=monitor(SHARES,100,PRICES,SECTORS) sector_days=[r['session'] for r in rows if r['tech_breach']] single_days=[r['session'] for r in rows if r['single_breach']] assert sector_days==[1,2] and single_days==[2] assert episodes(rows,'tech_breach')==[[1,2]] and episodes(rows,'single_breach')==[[2]] assert not rows[0]['tech_breach'] and not rows[-1]['tech_breach'] unknown=monitor(SHARES,100,PRICES,{'A':'Tech','B':'Health'}) assert unknown[0]['sectors']['Unknown']==.1 and not unknown[0]['classification_complete'] assert unknown[0]['tech_conclusion']=='classification_incomplete' and unknown[0]['tech_upper_bound']==.5 try:monitor({'A':0,'B':0,'C':0},0,PRICES,SECTORS) except ValueError:pass else:raise AssertionError('zero base accepted') assert SHARES=={'A':4,'B':4,'C':1} assert all(not row['single_breach'] for row in monitor({},1000,{},{})) missing={s:list(values) for s,values in PRICES.items()};missing['B'][2]=None try:monitor(SHARES,100,missing,SECTORS) except ValueError:pass else:raise AssertionError('missing price silently passed') print('Tech_weights='+str([round(r['sectors']['Tech'],6) for r in rows])) print('Tech_first=1 breach_sessions=[1,2] longest=2 single_first=2 breach_sessions=[2] final_compliant=True') print('unknown_weight_initial=0.1 classification_status=incomplete policy=monitor_only orders=0 zero_NAV=rejected')