import datetime, importlib.util, sys, json, numpy as np, pandas as pd
sys.path.insert(0,'.'); sys.path.insert(0,'scripts')
spec=importlib.util.spec_from_file_location("ldm","lof_data_manager.py")
ldm=importlib.util.module_from_spec(spec); spec.loader.exec_module(ldm)
pro=ldm.pro
codes="501093 506000 501065 166025 501088 166024 161912 167508 169106 161837 501053 166027 161914 501070 506005 506008 506001 160926 160726 160325 506003 506006 501062 501038 506002 161040 161132 162720 160143 160529 501046".split()
def sfx(c): return c+('.SH' if c[0]=='5' else '.SZ')
start='20230101'; end=datetime.datetime.now().strftime('%Y%m%d')
conv=[]
for c in codes:
    tc=sfx(c)
    try:
        d=pro.fund_daily(ts_code=tc,start_date=start,end_date=end)[['trade_date','close']].dropna()
        n=pro.fund_nav(ts_code=tc,start_date=start,end_date=end)[['ann_date','unit_nav']].dropna()
    except Exception: continue
    if len(d)<50 or len(n)<50: continue
    n=n.sort_values('ann_date'); nav_a=list(zip(n['ann_date'].astype(str),n['unit_nav'].astype(float)))
    d=d.sort_values('trade_date'); disc={}
    for td,cl in zip(d['trade_date'].astype(str),d['close'].astype(float)):
        v=None
        for ad,uv in nav_a:
            if ad<=td: v=uv
            else: break
        if v and v>0: disc[td]=(cl/v-1)*100
    s=pd.Series(disc).sort_index()
    if len(s)<100: continue
    arr=s.values
    deep=[i for i in range(len(arr)-60) if arr[i]<-4]
    cr=[arr[i+60]-arr[i] for i in deep]
    conv.append(dict(code=c,med=round(float(np.median(arr)),1),mn=round(float(arr.min()),1),
        mx=round(float(arr.max()),1),ndeep=len(deep),conv60=round(float(np.mean(cr)),2) if cr else None))
json.dump(conv,open('/tmp/cef_conv.json','w'))
allcr=[x['conv60'] for x in conv if x['conv60'] is not None]
print("代码 折价中位 最深 最高 深折天数 深折后60日变化(+=收敛)")
for x in sorted(conv,key=lambda z:z['med']):
    print(f"{x['code']} {x['med']:>6}% {x['mn']:>6}% {x['mx']:>5}% {x['ndeep']:>4} {x['conv60']}")
print(f"\n深折价(<-4%)后60日折价变化均值: {np.mean(allcr):+.2f}pp (正=收敛; n={len(allcr)}只)")
print(f"折价中位数<-3%的深折价基金数: {sum(1 for x in conv if x['med']<-3)}")
print("DONE")
