"""动量延续策略优化：放宽条件，增加信号量"""
import pandas as pd, numpy as np

df_raw = pd.read_parquet("data/btc_multidim.parquet")
df_raw.columns = [c.lower() for c in df_raw.columns]
d = df_raw.resample("1h").agg({"open":"first","high":"max","low":"min","close":"last","volume":"sum"}).dropna()

O,H,L,C,V = d["open"].values,d["high"].values,d["low"].values,d["close"].values,d["volume"].values
n = len(d)

dd = df_raw.resample("1D").agg({"close":"last"}).dropna()
dd["ma20"] = dd["close"].rolling(20).mean()
dd["trend_up"] = dd["close"] > dd["ma20"]
d_ts = d.index
trend_1h = np.array([dd["trend_up"].reindex([ts], method="ffill").values[0] if ts >= dd.index[0] else True for ts in d_ts])

split = int(n * 0.67)
SL, TP, MB = 0.015, 0.045, 48
FEE = 0.001

def mom_signals(mode="strict"):
    """mode: 'strict'(原版3根), 'mid'(2根), 'loose'(1根+量)"""
    sigs = []
    
    for i in range(5, n-3):
        if not trend_1h[i]: continue
        
        r1 = C[i-1]/C[i-2]-1
        r2 = C[i]/C[i-1]-1
        
        hit = False
        
        if mode == "strict":
            # 连续3根阳线+涨幅递增（原版）
            if i >= 4:
                r0 = C[i-2]/C[i-3]-1
                hit = (C[i-2]>O[i-2] and r0>0.001 and
                       C[i-1]>O[i-1] and r1>r0 and
                       C[i]>O[i] and r2>r1)
        elif mode == "mid":
            # 连续2根阳线+涨幅递增
            hit = (C[i-1]>O[i-1] and r1>0.001 and
                   C[i]>O[i] and r2>r1 and r2>0.002)
        elif mode == "loose":
            # 1根强阳线+放量
            hit = (C[i]>O[i] and r2>0.003 and
                   V[i] > pd.Series(V).rolling(20).mean().values[i] * 1.5)
        
        if hit:
            sigs.append({"i":i,"dirc":1,"entry":C[i],"mode":mode})
    
    return sigs

def backtest(sigs):
    results = {"in":[],"out":[]}
    for s in sigs:
        i=s["i"]; entry=s["entry"]; dirc=s["dirc"]
        if i+MB>=n: continue
        p="in" if i<split else "out"
        closed=False
        for j in range(1,MB+1):
            if i+j>=n: break
            ret=(C[i+j]/entry-1)*dirc
            if ret>=TP: results[p].append(TP-FEE); closed=True; break
            if ret<=-SL: results[p].append(-SL-FEE); closed=True; break
        if not closed:
            fr=(C[min(i+MB,n-1)]/entry-1)*dirc
            results[p].append(fr-FEE)
    return results

def ps(results, label):
    print(f"\n▶ {label}")
    for nm,key in [("样本内","in"),("样本外","out")]:
        tr=results[key]
        if len(tr)<5: print(f"  {nm}: 仅{len(tr)}笔"); continue
        wr=sum(1 for r in tr if r>0)/len(tr)
        cum=np.prod([1+r for r in tr])
        ch=[tr[i:i+5] for i in range(0,len(tr),5)]
        pw=sum(1 for c in ch if sum(c)>0)/len(ch) if ch else 0
        avg=np.mean(tr)*100
        running=1.0;peak=1.0;mdd=0
        for r in tr:
            running*=(1+r);peak=max(peak,running)
            mdd=min(mdd,(running-peak)/peak)
        sp=np.mean(tr)/(np.std(tr)+1e-9)*np.sqrt(365*24/MB) if np.std(tr)>0 else 0
        print(f"  {nm}: {len(tr)}笔 wr={wr:.1%} cum={cum:.3f} avg={avg:+.2f}% 周盈≈{pw:.1%} MDD={mdd:.1%} Sharpe={sp:.2f}")

print("="*70)
print("动量延续——参数优化对比")
print("="*70)

for mode in ["strict", "mid", "loose"]:
    sigs = mom_signals(mode)
    r = backtest(sigs)
    label = {"strict":"严格(3根)","mid":"中等(2根)","loose":"宽松(1根+放量)"}[mode]
    print(f"\n信号数: {len(sigs)}笔")
    ps(r, label)

# 最合适的一组再跑一下完整周期数据
print(f"\n{'='*70}")
print("📊 与烛龙v1.7对比：")
print(f"  v1.7样本外: 65笔 wr=56.9% cum=2.518 周盈=69% MDD=-16.7% Sharpe=5.18")