Repository Public Research preview
1#!/usr/bin/env python32"""3================================================================4Auteur : Simon-Pierre Boucher5Contact : simon-pierre.boucher@uqo.ca6Projet : Prévision de volatilité réalisée multi-actifs7 (HAR-RV vs GARCH vs Machine Learning)8Fichier : 91_key_numbers.py9Description : Utilitaire de rédaction — imprime, à partir des CSV de10 results/reproduced/, les chiffres clés cités dans le11 texte (ratios QLIKE, parts DM/MCS, MZ, sous-périodes,12 transférabilité, timing, VaR), pour que chaque nombre du13 papier soit traçable à un fichier de résultats.14Usage : python scripts/91_key_numbers.py15================================================================16"""1718from __future__ import annotations1920import sys21from pathlib import Path2223import pandas as pd2425sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))26from wp12 import config # noqa: E4022728OUT = config.path("reproduced")29pd.set_option("display.width", 200, "display.max_rows", 500, "display.max_columns", 30)303132def show(title: str, df: pd.DataFrame) -> None:33 print(f"\n===== {title} =====")34 print(df.to_string())353637def main() -> None:38 lo = pd.read_csv(OUT / "losses_overall.csv")39 show("losses_overall (QLIKE, MSE, ratio to HAR) by h",40 lo.pivot_table(index="model", columns="h", values=["qlike", "qlike_ratio"]).round(4))41 lc = pd.read_csv(OUT / "losses_by_class.csv")42 show("QLIKE ratio to HAR by class, h=1",43 lc[lc.h == 1].pivot_table(index="model", columns="cls", values="qlike_ratio").round(3))44 show("QLIKE ratio to HAR by class, h=22",45 lc[lc.h == 22].pivot_table(index="model", columns="cls", values="qlike_ratio").round(3))46 dm = pd.read_csv(OUT / "dm_summary.csv")47 show("DM summary", dm.round(3))48 mcs = pd.read_csv(OUT / "mcs_inclusion.csv")49 show("MCS inclusion", mcs.pivot_table(index="model", columns="h", values="mcs_inclusion").round(2))50 mz = pd.read_csv(OUT / "mz_summary.csv")51 show("MZ summary h=1", mz[mz.h == 1].round(3))52 enc = pd.read_csv(OUT / "encompassing_summary.csv")53 show("Encompassing h=1", enc[enc.h == 1].round(3))54 for name in ("subperiod_losses", "transferability", "outlier_sensitivity",55 "timing_overall", "utility_summary", "var_summary", "shap_h1",56 "frequency_sensitivity"):57 f = OUT / f"{name}.csv"58 if f.exists():59 df = pd.read_csv(f)60 if name == "subperiod_losses":61 d1 = df[df.h == 1].pivot_table(index="model", columns="period", values="qlike")62 df = d1.div(d1.loc["HAR"], axis=1).round(3)63 elif name == "outlier_sensitivity":64 d1 = df[(df.h == 1)].pivot_table(index="model", columns=["cls", "variant"], values="qlike")65 df = d1.div(d1.loc["HAR"], axis=1).round(3)66 elif name == "transferability":67 df = df.pivot_table(index="model", columns=["ticker", "h"], values="qlike").round(3)68 show(name, df.round(4) if isinstance(df, pd.DataFrame) else df)69 # evaluation sample sizes70 lt = pd.read_csv(OUT / "losses_by_ticker.csv")71 print("\nmodels:", lt.model.nunique(), "tickers:", lt.ticker.nunique())72 merged = pd.read_parquet(config.path("processed") / "merged_forecasts.parquet")73 g = merged[merged.model == "HAR"].groupby(["ticker", "h"])["date"].agg(["min", "max", "size"])74 show("evaluation sample per ticker (HAR rows, common sample)", g)75 print("total forecast-actual pairs:", len(merged), "| per h:", merged.groupby("h").size().to_dict())767778if __name__ == "__main__":79 main()80