"""Conservative economic evaluation of the H5 exploratory hypothesis: a signal from the predictive median at horizon H traded only when |median| exceeds k times the assumed round-trip cost; execution at the next bar's open with a one-minute delay, cost = half-spread + fees + slippage in basis points. No quotes are available: the spread is an assumption, reported as a sensitivity. Results are gross/net mean return per trade and a t-statistic with day-clustered standard errors — never a profitability claim.""" from __future__ import annotations import numpy as np import pandas as pd from .statistics import cluster_bootstrap_mean def signal_pnl(median: np.ndarray, realised: np.ndarray, meta: pd.DataFrame, cost_bps: float = 5.0, k: float = 1.0) -> dict: cost = cost_bps / 1e4 sig = np.sign(median) * (np.abs(median) > k * cost) traded = sig != 0 gross = sig * realised net = gross - traded * cost out = {"cost_bps": cost_bps, "k": k, "n": int(len(sig)), "n_traded": int(traded.sum()), "share_traded": float(traded.mean())} if traded.sum() > 20: cl = pd.factorize(meta["session_date"])[0] g = cluster_bootstrap_mean(gross[traded], cl[traded], n_boot=500); n = cluster_bootstrap_mean(net[traded], cl[traded], n_boot=500) out.update({"gross_bps": g["mean"] * 1e4, "gross_lo": g["lo"] * 1e4, "gross_hi": g["hi"] * 1e4, "net_bps": n["mean"] * 1e4, "net_lo": n["lo"] * 1e4, "net_hi": n["hi"] * 1e4, "hit_rate": float((gross[traded] > 0).mean())}) return out