1"""Extra macros used in the running text (paper/numbers_text.tex), computed from results/metrics."""2import json, numpy as np, pandas as pd3from pathlib import Path4ROOT = Path(__file__).resolve().parents[1]; M = ROOT / "results/metrics"5J = lambda n: json.load(open(M / n))6fid, rob, tas, ev, har, rc, nz, rd, df, etf = (J(n) for n in ("mimicking_fidelity.json", "mimicking_fidelity_robustness.json", "targets_and_spanning.json", "event_summary.json", "har_forecasts.json", "realized_correlations.json", "noise_benchmark.json", "returns_diagnostics.json", "daily_factors_summary.json", "etf_crossval.json"))7E = pd.read_csv(M / "events.csv", parse_dates=["date"]); E = E[E.date >= "2011-01-01"]8W = pd.read_csv(M / "event_windows.csv")9m = {}10def pct(x, d=1): return f"{100 * x:.{d}f}\\%"11m["nMinutesM"] = f"{fid['full_2011_2026']['level']['n'] and 4.30:.1f}" # minutes with factors (06 output: 4,298,222)12m["nMinutesM"] = "4.3"13m["nYieldDaysOos"] = f"{fid['full_2011_2026']['level']['n']:,}"14for k, lab in (("FOMC_all", "fomc"), ("CPI_all", "cpi"), ("EMP_all", "emp")):15 for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")):16 m[f"{lab}RvShare{cl}Pct"] = pct(ev[k][f"rvshare_{c}"][0])17m["benchSharePct"] = pct(30 / 1380)18dms = [har[f][f"h{h}"]["dm_qlike_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)]19m["harDmMin"] = f"{max(dms):.1f}"; m["harDmMax"] = f"{min(dms):.1f}" # most negative = largest in magnitude20c = tas["ceiling_cash_2_5_10_30_for_cmt"]["full"]21m["ceilLevel"], m["ceilSlope"], m["ceilCurv"] = (f"{c[f]['r2_oos']:.2f}" for f in ("level", "slope", "curvature"))22m["fidSlopeLateNoSofr"] = f"{fid['2022_2026']['slope']['r2_oos']:.2f}"; m["fidSlopeLateSofr"] = f"{rob['cmt_with_sr3']['2022_2026']['slope']['r2_oos']:.2f}"23m["fidLevelLateSofr"] = f"{rob['cmt_with_sr3']['2022_2026']['level']['r2_oos']:.2f}"; m["fidCurvLateSofr"] = f"{rob['cmt_with_sr3']['2022_2026']['curvature']['r2_oos']:.2f}"24m["fomcRatioSr"] = f"{ev['FOMC_all']['ratio_sd_vs_placebo_dSR'][0]:.1f}"; m["fomcRatioTen"] = f"{ev['FOMC_all']['ratio_sd_vs_placebo_dy10'][0]:.1f}"25m["cpiLateSdTwo"] = f"{ev['CPI_2022_2026']['sd_dy2_bp']:.1f}"; m["cpiLateSdCurv"] = f"{ev['CPI_2022_2026']['sd_dC_bp']:.0f}"26m["cpiZlbSdLevel"] = f"{ev['CPI_2011_2015']['sd_dL_bp']:.1f}"; m["cpiZlbSdSlope"] = f"{ev['CPI_2011_2015']['sd_dS_bp']:.1f}"27m["fomcLateSdTwo"] = f"{ev['FOMC_2022_2026']['sd_dy2_bp']:.1f}"; m["fomcLateSdCurv"] = f"{ev['FOMC_2022_2026']['sd_dC_bp']:.0f}"28m["corrLsOneMin"] = f"{rc['full']['1m']['LS']:.2f}"; m["corrLsFiveMin"] = f"{rc['full']['5m']['LS']:.2f}"; m["corrLsThirtyMin"] = f"{rc['full']['30m']['LS']:.2f}"29m["corrLsDaily"] = f"{rc['daily_fred']['full']['LS']:.2f}"; m["noiseCorrLs"] = f"{nz['mean_noise_corr_LS']:.2f}"30m["corrLcOneMin"] = f"{rc['full']['1m']['LC']:.2f}"; m["corrLcThirtyMin"] = f"{rc['full']['30m']['LC']:.2f}"; m["corrLcDaily"] = f"{rc['daily_fred']['full']['LC']:.2f}"31m["nBouncePairs"] = f"{sum(rd[r]['bounce_pairs_removed'] for r in ['ZT','ZF','ZN','TN','US','UB'])}"32m["nPanelMinutes"] = f"{rd['panel']['minutes'] / 1e6:.2f}"33m["nFomcSched"] = f"{int(((E.type == 'FOMC') & (E.scheduled)).sum())}"; m["nFomcUnsched"] = f"{int(((E.type == 'FOMC') & (~E.scheduled)).sum())}"34m["nCpiEv"] = f"{int((E.type == 'CPI').sum())}"; m["nEmpEv"] = f"{int((E.type == 'EMP').sum())}"35m["fitRmseBp"] = f"{df['rmse_fit_bp']:.1f}"; m["lambdaHat"] = f"{df['lambda_hat_2008_2026']:.3f}"; m["fitRmseLamHatBp"] = f"{df['rmse_fit_bp_lambdahat']:.1f}"36m["corrDailyLs"] = f"{df['corr_dfactors']['level']['slope']:.2f}"37for per, lab in (("2011_2015_ZLB", "Zlb"), ("2016_2019", "Mid"), ("2020_2021", "Pandemic"), ("2022_2026", "Recent")):38 for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")):39 m[f"fidT{fl}{lab}"] = f"{fid[per][f]['r2_oos']:.2f}"40for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")):41 m[f"gsw{fl}Full"] = f"{rob['gsw']['full'][f]['r2_oos']:.2f}"42 m[f"fidT{fl}Slope"] = f"{fid['full_2011_2026'][f]['slope']:.2f}"43 for h, hl in ((1, "HOne"), (5, "HFive"), (22, "HTwentyTwo")):44 g = har[f][f"h{h}"]; m[f"harGain{fl}{hl}"] = pct((g['garch']['qlike'] - g['har']['qlike']) / abs(g['garch']['qlike']), 1)45s = tas["leave_one_out_spanning_2019_2026"]46m["spanZtOneMin"] = f"{s['1m']['08-16ET']['ZT']:.2f}"; m["spanZnOneMin"] = f"{s['1m']['08-16ET']['ZN']:.2f}"; m["spanZnThirtyMin"] = f"{s['30m']['08-16ET']['ZN']:.2f}"; m["spanZtThirtyMin"] = f"{s['30m']['08-16ET']['ZT']:.2f}"47m["pcThreeOneMin"] = pct(s['1m']['08-16ET']['pc_share_3']); m["pcThreeThirtyMin"] = pct(s['30m']['08-16ET']['pc_share_3'])48m["etfCorrLevelThirty"] = f"{etf['corr_30m']['dL']:.2f}"; m["etfCorrSlopeThirty"] = f"{etf['corr_30m']['dS']:.2f}"; m["etfCorrCurvThirty"] = f"{etf['corr_30m']['dC']:.2f}"49m["etfCorrLevelOne"] = f"{etf['corr_1m']['dL']:.2f}"; m["etfFomcLevel"] = f"{etf['fomc_window_corr_etf_vs_fut']['dL']:.2f}"; m["etfFomcSlope"] = f"{etf['fomc_window_corr_etf_vs_fut']['dS']:.2f}"; m["etfFomcCurv"] = f"{etf['fomc_window_corr_etf_vs_fut']['dC']:.2f}"50m["etfDailyLevel"] = f"{etf['daily_regular_hours_corr']['dL']:.2f}"; m["etfFomcN"] = f"{etf['fomc_windows_n']}"51m["rvOneOverThirtyLevel"] = f"{rc['rv_mean_bp2']['1m']['L'] / rc['rv_mean_bp2']['30m']['L']:.2f}"; m["rvOneOverThirtyCurv"] = f"{rc['rv_mean_bp2']['1m']['C'] / rc['rv_mean_bp2']['30m']['C']:.2f}"52m["fomcWNinetySdTen"] = f"{ev['FOMC_all']['sd_w90_dy10_bp']:.1f}"; m["fomcWTwentyfiveSdTen"] = f"{ev['FOMC_all']['sd_dy10_bp']:.1f}"; m["fomcWFifteenSdTen"] = f"{ev['FOMC_all']['sd_w15_dy10_bp']:.1f}"53m["fomcLateWNinetySdCurv"] = f"{ev['FOMC_2022_2026']['sd_w90_dC_bp']:.0f}"; m["fomcLateWTwentyfiveSdCurv"] = f"{ev['FOMC_2022_2026']['sd_dC_bp']:.0f}"54m["empRvShareSlopePct"] = pct(ev['EMP_all']['rvshare_dS'][0]); m["empRvShareCurvPct"] = pct(ev['EMP_all']['rvshare_dC'][0])55m["fomcZlbRvShareLevelPct"] = pct(ev['FOMC_2011_2015']['rvshare_dL'][0]); m["fomcLateRvShareLevelPct"] = pct(ev['FOMC_2022_2026']['rvshare_dL'][0]); m["fomcLateRvShareCurvPct"] = pct(ev['FOMC_2022_2026']['rvshare_dC'][0])56m["cpiZlbRvShareLevelPct"] = pct(ev['CPI_2011_2015']['rvshare_dL'][0]); m["cpiLateRvShareLevelPct"] = pct(ev['CPI_2022_2026']['rvshare_dL'][0]); m["cpiLateRvShareCurvPct"] = pct(ev['CPI_2022_2026']['rvshare_dC'][0])57m["fomcZlbRatioSr"] = f"{ev['FOMC_2011_2015']['ratio_sd_vs_placebo_dSR'][0]:.1f}"; m["fomcLateRatioSr"] = f"{ev['FOMC_2022_2026']['ratio_sd_vs_placebo_dSR'][0]:.1f}"58m["cpiZlbRatioTen"] = f"{ev['CPI_2011_2015']['ratio_sd_vs_placebo_dy10'][0]:.1f}"; m["cpiLateRatioTen"] = f"{ev['CPI_2022_2026']['ratio_sd_vs_placebo_dy10'][0]:.1f}"59# pre-FOMC drift (bp, 24h) with CI60for c, cl in (("dL", "Level"), ("dy10", "Ten")):61 v = ev['FOMC_all'][f'pre24h_mean_{c}_bp']; m[f"preFomc{cl}"] = f"{v[0]:.1f}"; m[f"preFomc{cl}Lo"] = f"{v[1][0]:.1f}"; m[f"preFomc{cl}Hi"] = f"{v[1][1]:.1f}"62out = "% generated by scripts/12_text_macros.py\n" + "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in m.items())63(ROOT / "paper/numbers_text.tex").write_text(out); print(len(m), "macros"); print({k: m[k] for k in list(m)[:12]})64# intraday periodicity (non-event days): 15-minute centred moving average of RMS change per minute, bp65P = pd.read_csv(M / "intraday_periodicity.csv", header=[0, 1], index_col=0)66per = {}67for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")):68 s = np.sqrt(P["non_event_days"][c]); s15 = s.rolling(15, center=True, min_periods=5).mean()69 asia = pd.concat([s15.loc[1140:1439], s15.loc[0:300]]).mean(); us = s15.loc[510:660].mean()70 per[f"perPeak{cl}"] = f"{int(s15.idxmax()) // 60:02d}:{int(s15.idxmax()) % 60:02d}"; per[f"perSpike{cl}"] = f"{s.loc[510]:.2f}"; per[f"perMedian{cl}"] = f"{s.median():.2f}"71 per[f"perUsAsia{cl}"] = f"{us / asia:.1f}"; per[f"perTrough{cl}"] = f"{int(s15.idxmin()) // 60:02d}:{int(s15.idxmin()) % 60:02d}"72 s_ev = np.sqrt(P["event_days"][c]); per[f"perSpikeEv{cl}"] = f"{s_ev.loc[510]:.2f}"73out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in per.items())74(ROOT / "paper/numbers_text.tex").write_text(out); print(len(m) + len(per), "macros total")75# robustness checks (04d)76rb = J("robustness_checks.json"); add = {}77for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")):78 add[f"robExp{fl}"] = f"{rb['expanding_1530'][f]:.2f}"; add[f"robB{fl}Fifteen"] = f"{rb['rolling_3y_1500'][f]:.2f}"; add[f"robB{fl}Sixteen"] = f"{rb['rolling_3y_1600'][f]:.2f}"79 add[f"robB{fl}Base"] = f"{rb['rolling_3y_1530'][f]:.2f}"80add["robExpMaxDiff"] = f"{max(abs(rb['expanding_1530'][f] - rb['rolling_3y_1530'][f]) for f in ('level','slope','curvature')):.3f}"81add["robBLevelLossFifteen"] = f"{rb['rolling_3y_1530']['level'] - rb['rolling_3y_1500']['level']:.2f}"; add["robBLevelLossSixteen"] = f"{rb['rolling_3y_1530']['level'] - rb['rolling_3y_1600']['level']:.2f}"82for t in ("FOMC", "CPI", "EMP"):83 for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")):84 add[f"rvFive{t.title()}{cl}Pct"] = pct(rb['rvshare_5m_denominator'][t][c])85tc = rb["fomc_time_check"]; add["fomcTimeN"] = f"{tc['n']}"; add["fomcTimeWithinTwoPct"] = pct(tc['share_within_0_2_min'], 0); add["fomcTimeWithinFivePct"] = pct(tc['share_within_0_5_min'], 0); add["fomcTimeMedian"] = f"{tc['median_offset_min']:.0f}"86out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in add.items())87(ROOT / "paper/numbers_text.tex").write_text(out); print("robustness macros", len(add))88# ---- additions after the contract-based rebuild: cumulated-intraday fidelity, implied-yield fidelity, IRF/VAR/connectedness, counts ----89fc = J("fidelity_cumulated_intraday.json"); irf = J("irf.json"); ev2 = J("event_summary.json"); har2 = J("har_forecasts.json"); rc2 = J("realized_correlations.json"); nz2 = J("noise_benchmark.json")90a2 = {}91a2["nYieldDaysFactors"] = f"{fc['all_days']['n']:,}"; a2["nMinutesFactorsM"] = f"{irf['counts']['minutes_with_factors'] / 1e6:.1f}"92for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")):93 a2[f"fidCum{fl}All"] = f"{fc['all_days'][f]['r2']:.2f}"; a2[f"fidCum{fl}AllSlope"] = f"{fc['all_days'][f]['slope']:.2f}"94 for per, lab in (("2011_2015", "Zlb"), ("2016_2019", "Mid"), ("2020_2021", "Pandemic"), ("2022_2026", "Recent")):95 a2[f"fidCum{fl}{lab}"] = f"{fc['all_days_' + per][f]['r2']:.2f}"96a2["shareDaysGeSixHundredPct"] = pct(fc['coverage']['share_days_ge600'], 1); a2["medianMinutesFactors"] = f"{fc['coverage']['median_minutes']:,.0f}"97# implied-yield fidelity: daily CMT yield changes vs cumulated implied changes (laptop: factors_daily_realized.csv + FRED)98import sys; sys.path.insert(0, str(ROOT / "src"))99from wp47.ns import loadings, LAMBDA_DL, read_fred100fdr = pd.read_csv(M / "factors_daily_realized.csv", index_col=0, parse_dates=True)101yl = read_fred(ROOT / "data/external/fred").diff()102taus = {"DGS3MO": 0.25, "DGS1": 1.0, "DGS2": 2.0, "DGS5": 5.0, "DGS10": 10.0, "DGS30": 30.0}; names = {"DGS3MO": "ThreeM", "DGS1": "OneY", "DGS2": "TwoY", "DGS5": "FiveY", "DGS10": "TenY", "DGS30": "ThirtyY"}103imp = {}104for mn, tau in taus.items():105 l = loadings(np.array([tau]), LAMBDA_DL)[0]106 pred = fdr["cum_dL"] * l[0] + fdr["cum_dS"] * l[1] + fdr["cum_dC"] * l[2]107 t = pd.concat([yl[mn], pred], axis=1, keys=["a", "p"]).dropna().loc["2011":]108 r2v = float(1 - ((t.a - t.p) ** 2).sum() / ((t.a - t.a.mean()) ** 2).sum()); imp[mn] = r2v; a2[f"fidY{names[mn]}"] = f"{r2v:.2f}"109# short rate y(0) = L + S110t = pd.concat([yl["DGS1MO"], fdr["cum_dL"] + fdr["cum_dS"]], axis=1, keys=["a", "p"]).dropna().loc["2011":]111a2["fidYShortRateVsOneM"] = f"{float(1 - ((t.a - t.p) ** 2).sum() / ((t.a - t.a.mean()) ** 2).sum()):.2f}"112json.dump({"implied_yield_fidelity_r2_2011_2026": imp, "short_rate_vs_1m_bill_r2": a2["fidYShortRateVsOneM"]}, open(M / "implied_yield_fidelity.json", "w"), indent=1)113# events (updated counts and headline numbers)114for k, lab in (("FOMC_all", "fomc"), ("CPI_all", "cpi"), ("EMP_all", "emp")):115 a2[f"n{lab.title()}EventsUsed"] = f"{ev2[k]['n_events']}"116 for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")): a2[f"{lab}RvShare{cl}Pct"] = pct(ev2[k][f"rvshare_{c}"][0])117shares = [ev2[k][f"rvshare_{c}"][0] / (30 / 1380) for k in ("FOMC_all", "CPI_all", "EMP_all") for c in ("dL", "dS", "dC")]118a2["rvShareRatioMin"] = f"{min(shares):.0f}"; a2["rvShareRatioMax"] = f"{max(shares):.0f}"119# HAR Holm120from scipy.stats import norm121dm = {(f, h): har2[f][f"h{h}"]["dm_qlike_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)}122pv = sorted([(2 * (1 - norm.cdf(abs(v))), k) for k, v in dm.items()]); n = len(pv); adj = []; run = 0123for i, (p, k) in enumerate(pv):124 run = max(run, p * (n - i)); adj.append((k, min(run, 1.0)))125a2["harHolmBelowFive"] = f"{sum(1 for _, p in adj if p < 0.05)}"; a2["harHolmBelowTen"] = f"{sum(1 for _, p in adj if p < 0.10)}"126a2["harDmMin"] = f"{max(dm.values()):.1f}"; a2["harDmMax"] = f"{min(dm.values()):.1f}"127dmm = {(f, h): har2[f][f"h{h}"]["dm_mse_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)}128a2["harDmMseSigFive"] = f"{sum(1 for v in dmm.values() if abs(v) > 1.96)}"; a2["harDmMseMin"] = f"{max(dmm.values()):.1f}"; a2["harDmMseMax"] = f"{min(dmm.values()):.1f}"129# noise share of 1-min variance of the level factor: noise var per minute / mean 1m RV per minute130rv1 = rc2["rv_mean_bp2"]["1m"]["L"] / fc["coverage"]["median_minutes"]; a2["noiseShareLevelOneMinPct"] = pct(nz2["mean_noise_sd_bp_per_min"]["level"] ** 2 / rv1, 0)131a2["corrLsGapNoise"] = f"{abs(rc2['full']['1m']['LS'] - nz2['mean_noise_corr_LS']):.2f}"132# LP IRF headline numbers133lp = irf["lp"]134def b(key, v, h): return lp[key][v][h]["beta"]135a2["lpFomcTwoYDTen"] = f"{b('FOMC_all','dy2','d10'):.2f}"; a2["lpFomcTwoYDTenLo"] = f"{lp['FOMC_all']['dy2']['d10']['ci'][0]:.2f}"; a2["lpFomcTwoYDTenHi"] = f"{lp['FOMC_all']['dy2']['d10']['ci'][1]:.2f}"136a2["lpFomcTenYMTwentyFive"] = f"{b('FOMC_all','dy10','m25'):.2f}"; a2["lpFomcTenYDOne"] = f"{b('FOMC_all','dy10','d1'):.2f}"; a2["lpFomcTenYDTen"] = f"{b('FOMC_all','dy10','d10'):.2f}"137a2["lpCpiTwoYDTen"] = f"{b('CPI_all','dy2','d10'):.2f}"; a2["lpCpiTwoYDTenLo"] = f"{lp['CPI_all']['dy2']['d10']['ci'][0]:.2f}"; a2["lpCpiTwoYDTenHi"] = f"{lp['CPI_all']['dy2']['d10']['ci'][1]:.2f}"138a2["lpCpiTwoYDOne"] = f"{b('CPI_all','dy2','d1'):.2f}"; a2["lpEmpTwoYDTen"] = f"{b('EMP_all','dy2','d10'):.2f}"; a2["lpEmpTwoYDOne"] = f"{b('EMP_all','dy2','d1'):.2f}"139a2["lpCpiTenYMTwentyFive"] = f"{b('CPI_all','dy10','m25'):.2f}"; a2["lpEmpTenYMTwentyFive"] = f"{b('EMP_all','dy10','m25'):.2f}"140a2["lpFomcCurvMTwentyFive"] = f"{b('FOMC_all','dC','m25'):.2f}"; a2["lpFomcCurvDTen"] = f"{b('FOMC_all','dC','d10'):.2f}"141# VAR / connectedness142v5 = irf["var5m"]; a2["varTotalFull"] = f"{v5['full']['total_connectedness_pct']:.1f}"; a2["varTotalZlb"] = f"{v5['2011_2015']['total_connectedness_pct']:.1f}"; a2["varTotalRecent"] = f"{v5['2022_2026']['total_connectedness_pct']:.1f}"143a2["varRatioSrFull"] = f"{v5['full']['ratio_cum12_to_impact'][0][0]:.2f}"; a2["varRatioLevelFull"] = f"{v5['full']['ratio_cum12_to_impact'][1][1]:.2f}"; a2["varRatioCurvFull"] = f"{v5['full']['ratio_cum12_to_impact'][2][2]:.2f}"144a2["varResidCorrSrL"] = f"{v5['full']['resid_corr'][0][1]:.2f}"; a2["varResidCorrLC"] = f"{v5['full']['resid_corr'][1][2]:.2f}"; a2["varP"] = f"{v5['full']['p_bic']}"145vc = irf["vol_connectedness"]; a2["volTotal"] = f"{vc['total_connectedness_pct']:.1f}"; a2["volNetLevel"] = f"{vc['net_pct'][0]:.1f}"; a2["volNetSlope"] = f"{vc['net_pct'][1]:.1f}"; a2["volNetCurv"] = f"{vc['net_pct'][2]:.1f}"146a2["volRollMin"] = f"{vc['rolling_total_min']:.0f}"; a2["volRollMax"] = f"{vc['rolling_total_max']:.0f}"; a2["volRollMaxDate"] = pd.Timestamp(vc['rolling_total_max_date']).strftime("%B %Y"); a2["volRollMinDate"] = pd.Timestamp(vc['rolling_total_min_date']).strftime("%B %Y"); a2["volP"] = f"{vc['p_bic']}"147a2["srThreeMedianBarsTwentyTwenty"] = f"{irf['counts']['sr3_median_minutes_by_year']['2020']:.0f}"; a2["srThreeMedianBarsTwentyTwentyTwo"] = f"{irf['counts']['sr3_median_minutes_by_year']['2022']:.0f}"148rd2 = J("returns_diagnostics.json"); a2["nBounceUB"] = f"{rd2['UB']['bounce_pairs_removed']}"; a2["nBounceUS"] = f"{rd2['US']['bounce_pairs_removed']}"; a2["nBouncePairs"] = f"{sum(rd2[r]['bounce_pairs_removed'] for r in ['ZT','ZF','ZN','TN','US','UB'])}"149a2["corrDailyZnUs"] = f"{rd2['panel']['corr_daily']['ZN']['US']:.2f}"; a2["corrDailyZfZn"] = f"{rd2['panel']['corr_daily']['ZF']['ZN']:.2f}"; a2["corrDailyUsUb"] = f"{rd2['panel']['corr_daily']['US']['UB']:.2f}"150a2["nContractsZN"] = f"{rd2['ZN']['contracts_used']}"; a2["nPanelMinutes"] = f"{rd2['panel']['minutes'] / 1e6:.2f}"151out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in a2.items()); (ROOT / "paper/numbers_text.tex").write_text(out); print("added", len(a2), "macros; implied-yield R2:", {k: round(v, 2) for k, v in imp.items()}, "y0 vs 1m:", a2["fidYShortRateVsOneM"], "Holm<5%:", a2["harHolmBelowFive"], "MSE sig:", a2["harDmMseSigFive"], "noise share:", a2["noiseShareLevelOneMinPct"])152a3 = {"fomcZlbRvShareCurvPct": pct(ev2["FOMC_2011_2015"]["rvshare_dC"][0]), "fomcZlbRvShareSlopePct": pct(ev2["FOMC_2011_2015"]["rvshare_dS"][0])}153out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in a3.items()); (ROOT / "paper/numbers_text.tex").write_text(out)154