"""Lock della conclusione 2026-06-26: il DVOL come denominatore del vol-target NON migliora TP01
risk-adjusted. Il taglio di DD delle varianti DVOL è solo de-levering, replicabile MEGLIO con un
target_vol più basso sul realizzato. Diario docs/diary/2026-06-26-tp01-dvol-overlay.md."""
import sys
from pathlib import Path

import pandas as pd

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

from tp01_dvol_overlay import portfolio, metrics, RAW, VW  # type: ignore


def _dstart():
    s = max(pd.read_parquet(RAW / f"dvol_{a.lower()}.parquet")["timestamp"].min() for a in ("BTC", "ETH"))
    return pd.Timestamp(s, unit="ms", tz="UTC") + pd.Timedelta(days=VW)


def test_dvol_does_not_beat_realized_risk_adjusted():
    """Sulla finestra comune, il realized batte (o eguaglia) le varianti DVOL sullo Sharpe FULL."""
    lo = _dstart()
    base = metrics(portfolio("realized")[portfolio("realized").index >= lo])
    mx = metrics(portfolio("max")[portfolio("max").index >= lo])
    dv = metrics(portfolio("dvol")[portfolio("dvol").index >= lo])
    assert base["sharpe"] >= mx["sharpe"] - 1e-9
    assert base["sharpe"] >= dv["sharpe"] - 1e-9


def test_lower_target_vol_replicates_dd_cut_at_better_sharpe():
    """Il taglio di DD del DVOL è solo de-levering: realized @ vol-tgt 15% eguaglia il DD del
    max-DVOL a Sharpe FULL non inferiore (anzi superiore)."""
    lo = _dstart()
    mx = metrics(portfolio("max")[portfolio("max").index >= lo])
    lo_tv = metrics(portfolio("realized", tvol=0.15)[portfolio("realized", tvol=0.15).index >= lo])
    assert lo_tv["dd"] <= mx["dd"] + 0.01           # stesso DD (entro 1pp)
    assert lo_tv["sharpe"] >= mx["sharpe"]          # a Sharpe non inferiore


def test_dvol_spike_gate_is_redundant_with_trend():
    """Il gate DVOL-spike de-risk non cambia nulla: TP01 è già flat nei crash (momentum<0)."""
    lo = _dstart()
    base = portfolio("realized"); dr = portfolio("derisk")
    base = base[base.index >= lo]; dr = dr[dr.index >= lo]
    assert abs(metrics(base)["sharpe"] - metrics(dr)["sharpe"]) < 0.02
