"""周线趋势狙击策略——暴利版"""
import pandas as pd, numpy as np

df = pd.read_parquet("/root/quant_pipeline/data/btc_multidim.parquet")
df.columns = [c.lower() for c in df.columns]

# 日线
d = df.resample("1D").agg({"open":"first","high":"max","low":"min","close":"last","volume":"sum"}).dropna()

# 周线
w = d.resample("W").agg({"open":"first","high":"max","low":"min","close":"last","volume":"sum"}).dropna()
O,H,L,C,V = w["open"].values,w["high"].values,w["low"].values,w["close"].values,w["volume"].values
n = len(w)
idx = w.index

print(f"周线数据: {n}根 ({idx[0].date()} ~ {idx[-1].date()})")

# ── 1. 趋势指标 ──
# 20周EMA ≈ 5个月趋势
ema20 = pd.Series(C).ewm(span=20, adjust=False).mean().values
# 200周MA ≈ 4年趋势（BTC生命线）
ma200 = pd.Series(C).rolling(200).mean().values
# 20周均线
sma20 = pd.Series(C).rolling(20).mean().values

# ── 2. 底部狙击信号 ──
# 条件1：价格在200周均线附近（1.2倍以内）
near_200w = C < ma200 * 1.2
# 条件2：周线RSI < 35（极度超卖）
ret_w = C / np.roll(C,1) - 1
rsi_period = 14
delta = pd.Series(C).diff()
gain = delta.clip(lower=0).rolling(rsi_period).mean()
loss = (-delta.clip(upper=0)).rolling(rsi_period).mean()
rs = gain / (loss + 1e-9)
rsi = (100 - 100/(1+rs)).values
rsi_low = rsi < 35

# 条件3：价格低于20周均线（已经进入熊市区域）
below_20w = C < sma20

# 条件4：周线出现吞没形态（反转确认）
O1 = np.roll(O,1); C1 = np.roll(C,1)
weekly_engulf_bull = (C1 < O1) & (C > O) & (O <= C1) & (C >= O1)

# ── 买入信号（抄底）──
buy_signal = near_200w & rsi_low & below_20w

# ── 3. 顶部狙击信号 ──
# 条件1：价格远离200周均线（3倍以上）
far_from_200w = C > ma200 * 3
# 条件2：周线RSI > 75（极度超买）
rsi_high = rsi > 75
# 条件3：价格高于20周均线（牛市区域）
above_20w = C > sma20
# 条件4：周线吞没看跌
weekly_engulf_bear = (C1 > O1) & (C < O) & (O >= C1) & (C <= O1)

sell_signal = far_from_200w & rsi_high & above_20w

print(f"\n买入信号（底部）:")
print(f"  200周均线附近: {near_200w.sum()}周")
print(f"  RSI<35: {rsi_low.sum()}周")
print(f"  低于20周均线: {below_20w.sum()}周")
print(f"  周线看涨吞没: {weekly_engulf_bull.sum()}周")
print(f"  三条件同时满足: {buy_signal.sum()}周")

print(f"\n卖出信号（顶部）:")
print(f"  远高于200周均线: {far_from_200w.sum()}周")
print(f"  RSI>75: {rsi_high.sum()}周")
print(f"  高于20周均线: {above_20w.sum()}周")
print(f"  三条件同时满足: {sell_signal.sum()}周")

# ── 4. 简单回测：抄底信号后4周、8周、12周的收益 ──
print(f"\n{'='*70}")
print("🔥 抄底信号后收益分析")
print(f"{'='*70}")

for fwd in [4, 8, 12, 24]:
    fwd_ret = np.roll(C, -fwd) / C - 1
    signal_indices = np.where(buy_signal)[0]
    valid = [i for i in signal_indices if i + fwd < n]
    
    if len(valid) < 2:
        print(f"  {fwd}周后: 信号不足"); continue
    
    rets = [fwd_ret[i] for i in valid]
    avg_ret = np.mean(rets)
    wr = sum(1 for r in rets if r > 0) / len(rets)
    max_ret = max(rets)
    print(f"  {fwd}周后: {len(valid)}次信号 胜率{wr:.0%} 平均收益{avg_ret:.0%} 最高{max_ret:.0%}")

# ── 5. 用更宽松的条件试试 ──
print(f"\n{'='*70}")
print("📊 宽松版：只要求RSI<35 + 低于20周均线")
print(f"{'='*70}")

buy_loose = rsi_low & below_20w
sell_loose = rsi_high & above_20w

for fwd in [4, 8, 12, 24]:
    fwd_ret = np.roll(C, -fwd) / C - 1
    signal_indices = np.where(buy_loose)[0]
    valid = [i for i in signal_indices if i + fwd < n]
    if len(valid) < 2: continue
    rets = [fwd_ret[i] for i in valid]
    avg_ret = np.mean(rets)
    wr = sum(1 for r in rets if r > 0) / len(rets)
    max_ret = max(rets)
    print(f"  {fwd}周后: {len(valid)}次信号 胜率{wr:.0%} 平均收益{avg_ret:.0%} 最高{max_ret:.0%}")

# 看看每次信号的详情
print(f"\n{'='*70}")
print("📋 抄底信号详情（宽松版，8周后收益）")
print(f"{'='*70}")
fwd_ret_8 = np.roll(C, -8) / C - 1
signal_idx = np.where(buy_loose)[0]
valid_idx = [i for i in signal_idx if i + 8 < n]
for i in valid_idx:
    print(f"  {idx[i].date()}: 价格{C[i]:.0f} RSI={rsi[i]:.0f} 20周均线={sma20[i]:.0f} 8周后收益={fwd_ret_8[i]:.0%}")

# ── 顶部的反向验证 ──
print(f"\n{'='*70}")
print("📋 做空信号详情（宽松版，4周后收益）")
print(f"{'='*70}")
fwd_ret_4 = np.roll(C, -4) / C - 1
signal_idx_s = np.where(sell_loose)[0]
valid_idx_s = [i for i in signal_idx_s if i + 4 < n]
for i in valid_idx_s:
    print(f"  {idx[i].date()}: 价格{C[i]:.0f} RSI={rsi[i]:.0f} 20周均线={sma20[i]:.0f} 4周后收益={fwd_ret_4[i]:.0%}")