"""快速诊断：日线底背离检测是否正常"""
import pandas as pd, numpy as np

d = pd.read_parquet("/root/quant_pipeline/data/btc_daily.parquet")
d_close = d["c"].values

# 日线RSI
delta = pd.Series(d_close).diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
d_rsi = (100 - 100/(1+gain/(loss+1e-9))).values

def detect_div(price, rsi_arr, idx, lookback=20):
    if idx < lookback:
        return False
    window_p = price[idx-lookback:idx+1]
    window_r = rsi_arr[idx-lookback:idx+1]
    if price[idx] <= window_p.min() * 1.001:
        rsi_at_low = window_r[np.argmin(window_p)]
        return rsi_arr[idx] > rsi_at_low + 1
    return False

# 周线信号
daily = d.copy()
daily["week_label"] = daily.index.isocalendar().week.astype(str) + "_" + daily.index.year.astype(str)
weekly = daily.groupby("week_label").agg({"o":"first","h":"max","l":"min","c":"last","v":"sum"}).reset_index()
weekly["year"] = weekly["week_label"].str.split("_").str[1].astype(int)
weekly["week_num"] = weekly["week_label"].str.split("_").str[0].astype(int)
weekly = weekly.sort_values(["year","week_num"]).reset_index(drop=True)
last_days = daily.groupby("week_label").apply(lambda x: x.index[-1])
dates = weekly["week_label"].map(last_days).values

W = weekly["c"].values.astype(float)
delta_w = pd.Series(W).diff()
gain_w = delta_w.clip(lower=0).rolling(14).mean()
loss_w = (-delta_w.clip(upper=0)).rolling(14).mean()
rsi_w = (100 - 100/(1+gain_w/(loss_w+1e-9))).values
sma20_w = pd.Series(W).rolling(20).mean().values
ret_8w = W / np.roll(W, 8) - 1
sig = (rsi_w > 20) & (rsi_w < 35) & (ret_8w < -0.1) & (W < sma20_w)

print("检查每个周线信号附近是否有日线底背离:\n")
for i in np.where(sig)[0]:
    entry_date = pd.Timestamp(dates[i]).date()
    pos = max(0, np.searchsorted(d.index.values, np.datetime64(dates[i]), side='right') - 1)
    has_div = False
    div_day = None
    for offset in range(0, 10):
        ci = pos + offset
        if ci >= len(d): break
        if detect_div(d_close, d_rsi, ci):
            has_div = True
            div_day = d.index[ci].date()
            break
    print(f"  {entry_date} 周RSI={rsi_w[i]:.1f} BTC=${W[i]:.0f}  {'✅ 日线背离 @'+str(div_day) if has_div else '❌ 无背离'}")

# 手动查2022年底 
print("\n\n2022年日线底背离情况:")
mask = d.index.year == 2022
d22 = d[mask]
rsi22 = d_rsi[mask]
c22 = d22["c"].values
for i in range(20, len(c22)):
    if detect_div(c22, rsi22, i):
        print(f"  {d22.index[i].date()}: BTC=${c22[i]:.0f} RSI={rsi22[i]:.1f}")
