#!/usr/bin/env python3
"""Identify which RSI smoothing produced the prior reports' values (10/28=?, 10/29=38.88)."""
import numpy as np
import pandas as pd
import yfinance as yf

h = yf.Ticker("6669.TW").history(period="6mo", auto_adjust=False)
c_all = h["Close"].dropna()
c_clean = h[h["Volume"].fillna(0) > 0]["Close"].dropna()

def variants(c, n=14):
    d = c.diff(); up = d.clip(lower=0); dn = -d.clip(upper=0)
    out = {}
    out["rolling"] = 100 - 100 / (1 + (up.rolling(n).mean() / dn.rolling(n).mean())
                                 .replace([np.inf, -np.inf], np.nan).fillna(50))
    for a in (1/n, 2/(n+1)):
        au = up.ewm(alpha=a, adjust=False).mean(); ad = dn.ewm(alpha=a, adjust=False).mean()
        out[f"ewm_a{a:.4f}"] = 100 - 100 / (1 + (au/ad).replace([np.inf,-np.inf], np.nan).fillna(50))
    out["ewm_span14"] = 100 - 100/(1+(up.ewm(span=n, adjust=False).mean()/dn.ewm(span=n, adjust=False).mean())
                              .replace([np.inf,-np.inf],np.nan).fillna(50))
    out["ema_span14_adjT"] = 100 - 100/(1+(up.ewm(span=n, adjust=True).mean()/dn.ewm(span=n, adjust=True).mean())
                              .replace([np.inf,-np.inf],np.nan).fillna(50))
    return out

targets = {"2026-10-28": None, "2026-10-29": 38.88, "2026-10-30": None}
for label, s in [("CLEAN", c_clean), ("PHANTOM", c_all)]:
    vs = variants(s)
    print(f"\n=== series={label} ===")
    for dt, target in targets.items():
        ts = pd.Timestamp(dt, tz=s.index.tz)
        for name, series in vs.items():
            try:
                val = float(series.loc[ts])
            except Exception:
                continue
            mark = ""
            if target is not None and abs(val - target) < 0.35:
                mark = "  <<<< MATCHES 38.88"
            print(f"  {dt} {name:16s} = {val:7.3f}{mark}")
