"""CROSS-MARKET COMBO — la sleeve equity-trend DIVERSIFICA il portafoglio crypto?

(2) dopo EQ-GTAA01. La via che alza il Sharpe COMPLESSIVO senza cercare nuovo alpha: combinare due
book scorrelati su mercati diversi. crypto = portafoglio attivo TP01+XS01+VRP01 (src.portfolio);
equity = GTAA lf vt12% (la migliore sleeve equity, corr SPY 0.64, maxDD ~15%). Se la correlazione
crypto<->equity e' bassa, il blend ha Sharpe > di ciascuno.

ALLINEAMENTO ONESTO: crypto e' calendario-giornaliero (7gg), equity giorni di borsa. Compoundo i
rendimenti crypto sul grid dei giorni di borsa (cattura i weekend) prima di combinare. Finestra =
era crypto (TP01 dal 2019). Esecuzione split Deribit+IB (lo noto: e' un portafoglio cross-venue).
"""
import sys
from pathlib import Path
import numpy as np, pandas as pd

ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT)); sys.path.insert(0, str(ROOT / "scripts" / "research"))
from eq_sector_momentum import _sh, _cagr, _dd
from eq_gtaa_trend import gtaa
from eq_spy_trend import tsmom_exposure, backtest, _series
from src.portfolio.sleeves import active_sleeves
from src.portfolio.portfolio import StrategyPortfolio

ANN = np.sqrt(252.0)


def _ann_vol(r):
    return float(np.std(np.asarray(r, float)) * ANN)


def compound_to_grid(daily: pd.Series, grid: pd.DatetimeIndex) -> pd.Series:
    """Compounda una serie di rendimenti (calendario) sul grid dato (giorni di borsa): per ogni data
    del grid, somma-composta i rendimenti dal punto precedente."""
    cum = (1.0 + daily).cumprod()
    cum = cum.reindex(cum.index.union(grid)).ffill().reindex(grid)
    return (cum / cum.shift(1) - 1.0).dropna()


def main():
    print("=" * 96)
    print("  CROSS-MARKET COMBO — equity-trend (GTAA) x crypto (TP01+XS01+VRP01)")
    print("=" * 96)
    # crypto blend (rinormalizzato, date diverse)
    crypto = StrategyPortfolio(active_sleeves()).combined_daily()
    if crypto.index.tz is None:
        crypto.index = crypto.index.tz_localize("UTC")
    # equity sleeve (giorni di borsa)
    eq = gtaa(target_vol=0.12).dropna()
    # allinea: compounda crypto sui giorni di borsa dell'equity
    grid = eq.index[eq.index >= crypto.index[0]]
    cr = compound_to_grid(crypto, grid)
    J = pd.concat({"crypto": cr, "equity": eq.reindex(cr.index)}, axis=1).dropna()
    print(f"  finestra comune {J.index[0].date()}..{J.index[-1].date()}  ({len(J)} giorni di borsa)\n")

    c, e = J["crypto"], J["equity"]
    print("  --- STANDALONE (sulla finestra comune) ---")
    for nm, r in (("crypto TP01+XS01+VRP01", c), ("equity GTAA vt12", e)):
        print(f"    {nm:24} Sh {_sh(r):>5.2f}  CAGR {_cagr(r.values,r.index)*100:>5.1f}%  volAnn {_ann_vol(r)*100:>4.1f}%  maxDD {_dd(r.values)*100:>4.0f}%")
    print(f"\n  --- CORRELAZIONE crypto <-> equity = {c.corr(e):+.3f}  (bassa = diversifica) ---")

    print("\n  --- BLEND (capitale) ---")
    print(f"    {'mix':18} {'Sharpe':>7} {'CAGR%':>6} {'volAnn%':>7} {'maxDD%':>6}")
    for wc in (1.0, 0.75, 0.5, 0.25, 0.0):
        b = wc * c + (1 - wc) * e
        print(f"    crypto {int(wc*100):>3}/{int((1-wc)*100):<3} eq  {_sh(b):>7.2f} {_cagr(b.values,b.index)*100:>6.1f} {_ann_vol(b)*100:>7.1f} {_dd(b.values)*100:>6.0f}")

    # risk-parity (peso inverso alla vol) — il blend "giusto" quando le vol differiscono
    vc, ve = _ann_vol(c), _ann_vol(e)
    wc_rp = (1/vc) / (1/vc + 1/ve)
    b_rp = wc_rp * c + (1 - wc_rp) * e
    print(f"\n  --- RISK-PARITY (inv-vol: crypto {wc_rp*100:.0f}% / eq {(1-wc_rp)*100:.0f}%) ---")
    print(f"    Sharpe {_sh(b_rp):.2f}  CAGR {_cagr(b_rp.values,b_rp.index)*100:.1f}%  volAnn {_ann_vol(b_rp)*100:.1f}%  maxDD {_dd(b_rp.values)*100:.0f}%")

    # verdetto: il blender batte il migliore dei due?
    best_solo = max(_sh(c), _sh(e))
    best_blend = max(_sh(0.5*c+0.5*e), _sh(b_rp))
    print(f"\n  --- VERDETTO ---")
    print(f"    miglior standalone Sharpe = {best_solo:.2f} | miglior blend Sharpe = {best_blend:.2f} "
          f"-> {'DIVERSIFICA (blend > solo)' if best_blend > best_solo + 0.03 else 'nessun guadagno netto'}")
    print(f"    (nota: portafoglio cross-venue Deribit+IB; finestra crypto corta ~{len(J)//252}y)")


if __name__ == "__main__":
    main()
