"""Lock della conclusione 2026-06-26 (CC01 cash-and-carry): il premio di funding e' REALE e
positivo, ma PROCYCLICO (si comprime nel bear) — NON un edge all-weather. Lo Sharpe headline ~13 e'
un artefatto (rischi di coda assenti dal dataset) -> non testiamo lo Sharpe, testiamo il FATTO
economico e la procyclicita'. Diario docs/diary/2026-06-26-cash-carry-hl.md."""
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
sys.path.insert(0, str(ROOT / "scripts" / "research"))

from cash_carry_hl import cc_returns, load_funding_panel, metrics  # type: ignore


def test_funding_premium_is_real_and_positive():
    """Il carry esiste: funding aggregato BTC/ETH positivo, CC-static con CAGR > 0."""
    r = cc_returns(["BTC", "ETH"], mode="static")
    m = metrics(r)
    assert m["gross_ann"] > 0.0           # premio di funding netto positivo
    assert m["cagr"] > 0.0


def test_basis_markup_does_not_explain_high_sharpe():
    """Aggiungere il mark-to-market della base (Δpremium) NON sgonfia lo Sharpe in modo materiale:
    prova che il rischio vero e' FUORI dal dataset (2022/liquidazione), non nel basis dei dati."""
    naive = metrics(cc_returns(["BTC", "ETH"], mode="static"))["sharpe"]
    basis = metrics(cc_returns(["BTC", "ETH"], mode="static", with_basis=True))["sharpe"]
    assert basis > 0.7 * naive            # cala poco -> il basis-from-data non e' il rischio nascosto


def test_carry_is_procyclical_fades_in_bear():
    """Il carry e' procyclico: il funding aggregato del toro 2024 supera quello del bear 2026."""
    FUND, _ = load_funding_panel(["BTC", "ETH"])
    agg = FUND.mean(axis=1)
    by_year = agg.groupby(agg.index.year).sum()
    assert by_year.get(2024, 0.0) > by_year.get(2026, 0.0)
