SPB Git

Repository Public Research preview

91_key_numbers.py 3.6 KB 80 lines python

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
Files main
Menu

Theme