"""Extra macros used in the running text (paper/numbers_text.tex), computed from results/metrics.""" import json, numpy as np, pandas as pd from pathlib import Path ROOT = Path(__file__).resolve().parents[1]; M = ROOT / "results/metrics" J = lambda n: json.load(open(M / n)) fid, 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")) E = pd.read_csv(M / "events.csv", parse_dates=["date"]); E = E[E.date >= "2011-01-01"] W = pd.read_csv(M / "event_windows.csv") m = {} def pct(x, d=1): return f"{100 * x:.{d}f}\\%" m["nMinutesM"] = f"{fid['full_2011_2026']['level']['n'] and 4.30:.1f}" # minutes with factors (06 output: 4,298,222) m["nMinutesM"] = "4.3" m["nYieldDaysOos"] = f"{fid['full_2011_2026']['level']['n']:,}" for k, lab in (("FOMC_all", "fomc"), ("CPI_all", "cpi"), ("EMP_all", "emp")): for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")): m[f"{lab}RvShare{cl}Pct"] = pct(ev[k][f"rvshare_{c}"][0]) m["benchSharePct"] = pct(30 / 1380) dms = [har[f][f"h{h}"]["dm_qlike_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)] m["harDmMin"] = f"{max(dms):.1f}"; m["harDmMax"] = f"{min(dms):.1f}" # most negative = largest in magnitude c = tas["ceiling_cash_2_5_10_30_for_cmt"]["full"] m["ceilLevel"], m["ceilSlope"], m["ceilCurv"] = (f"{c[f]['r2_oos']:.2f}" for f in ("level", "slope", "curvature")) m["fidSlopeLateNoSofr"] = f"{fid['2022_2026']['slope']['r2_oos']:.2f}"; m["fidSlopeLateSofr"] = f"{rob['cmt_with_sr3']['2022_2026']['slope']['r2_oos']:.2f}" m["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}" m["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}" m["cpiLateSdTwo"] = f"{ev['CPI_2022_2026']['sd_dy2_bp']:.1f}"; m["cpiLateSdCurv"] = f"{ev['CPI_2022_2026']['sd_dC_bp']:.0f}" m["cpiZlbSdLevel"] = f"{ev['CPI_2011_2015']['sd_dL_bp']:.1f}"; m["cpiZlbSdSlope"] = f"{ev['CPI_2011_2015']['sd_dS_bp']:.1f}" m["fomcLateSdTwo"] = f"{ev['FOMC_2022_2026']['sd_dy2_bp']:.1f}"; m["fomcLateSdCurv"] = f"{ev['FOMC_2022_2026']['sd_dC_bp']:.0f}" m["corrLsOneMin"] = f"{rc['full']['1m']['LS']:.2f}"; m["corrLsFiveMin"] = f"{rc['full']['5m']['LS']:.2f}"; m["corrLsThirtyMin"] = f"{rc['full']['30m']['LS']:.2f}" m["corrLsDaily"] = f"{rc['daily_fred']['full']['LS']:.2f}"; m["noiseCorrLs"] = f"{nz['mean_noise_corr_LS']:.2f}" m["corrLcOneMin"] = f"{rc['full']['1m']['LC']:.2f}"; m["corrLcThirtyMin"] = f"{rc['full']['30m']['LC']:.2f}"; m["corrLcDaily"] = f"{rc['daily_fred']['full']['LC']:.2f}" m["nBouncePairs"] = f"{sum(rd[r]['bounce_pairs_removed'] for r in ['ZT','ZF','ZN','TN','US','UB'])}" m["nPanelMinutes"] = f"{rd['panel']['minutes'] / 1e6:.2f}" m["nFomcSched"] = f"{int(((E.type == 'FOMC') & (E.scheduled)).sum())}"; m["nFomcUnsched"] = f"{int(((E.type == 'FOMC') & (~E.scheduled)).sum())}" m["nCpiEv"] = f"{int((E.type == 'CPI').sum())}"; m["nEmpEv"] = f"{int((E.type == 'EMP').sum())}" m["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}" m["corrDailyLs"] = f"{df['corr_dfactors']['level']['slope']:.2f}" for per, lab in (("2011_2015_ZLB", "Zlb"), ("2016_2019", "Mid"), ("2020_2021", "Pandemic"), ("2022_2026", "Recent")): for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")): m[f"fidT{fl}{lab}"] = f"{fid[per][f]['r2_oos']:.2f}" for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")): m[f"gsw{fl}Full"] = f"{rob['gsw']['full'][f]['r2_oos']:.2f}" m[f"fidT{fl}Slope"] = f"{fid['full_2011_2026'][f]['slope']:.2f}" for h, hl in ((1, "HOne"), (5, "HFive"), (22, "HTwentyTwo")): g = har[f][f"h{h}"]; m[f"harGain{fl}{hl}"] = pct((g['garch']['qlike'] - g['har']['qlike']) / abs(g['garch']['qlike']), 1) s = tas["leave_one_out_spanning_2019_2026"] m["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}" m["pcThreeOneMin"] = pct(s['1m']['08-16ET']['pc_share_3']); m["pcThreeThirtyMin"] = pct(s['30m']['08-16ET']['pc_share_3']) m["etfCorrLevelThirty"] = f"{etf['corr_30m']['dL']:.2f}"; m["etfCorrSlopeThirty"] = f"{etf['corr_30m']['dS']:.2f}"; m["etfCorrCurvThirty"] = f"{etf['corr_30m']['dC']:.2f}" m["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}" m["etfDailyLevel"] = f"{etf['daily_regular_hours_corr']['dL']:.2f}"; m["etfFomcN"] = f"{etf['fomc_windows_n']}" m["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}" m["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}" m["fomcLateWNinetySdCurv"] = f"{ev['FOMC_2022_2026']['sd_w90_dC_bp']:.0f}"; m["fomcLateWTwentyfiveSdCurv"] = f"{ev['FOMC_2022_2026']['sd_dC_bp']:.0f}" m["empRvShareSlopePct"] = pct(ev['EMP_all']['rvshare_dS'][0]); m["empRvShareCurvPct"] = pct(ev['EMP_all']['rvshare_dC'][0]) m["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]) m["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]) m["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}" m["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}" # pre-FOMC drift (bp, 24h) with CI for c, cl in (("dL", "Level"), ("dy10", "Ten")): 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}" out = "% generated by scripts/12_text_macros.py\n" + "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in m.items()) (ROOT / "paper/numbers_text.tex").write_text(out); print(len(m), "macros"); print({k: m[k] for k in list(m)[:12]}) # intraday periodicity (non-event days): 15-minute centred moving average of RMS change per minute, bp P = pd.read_csv(M / "intraday_periodicity.csv", header=[0, 1], index_col=0) per = {} for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")): s = np.sqrt(P["non_event_days"][c]); s15 = s.rolling(15, center=True, min_periods=5).mean() asia = pd.concat([s15.loc[1140:1439], s15.loc[0:300]]).mean(); us = s15.loc[510:660].mean() 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}" per[f"perUsAsia{cl}"] = f"{us / asia:.1f}"; per[f"perTrough{cl}"] = f"{int(s15.idxmin()) // 60:02d}:{int(s15.idxmin()) % 60:02d}" s_ev = np.sqrt(P["event_days"][c]); per[f"perSpikeEv{cl}"] = f"{s_ev.loc[510]:.2f}" out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in per.items()) (ROOT / "paper/numbers_text.tex").write_text(out); print(len(m) + len(per), "macros total") # robustness checks (04d) rb = J("robustness_checks.json"); add = {} for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")): 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}" add[f"robB{fl}Base"] = f"{rb['rolling_3y_1530'][f]:.2f}" add["robExpMaxDiff"] = f"{max(abs(rb['expanding_1530'][f] - rb['rolling_3y_1530'][f]) for f in ('level','slope','curvature')):.3f}" add["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}" for t in ("FOMC", "CPI", "EMP"): for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")): add[f"rvFive{t.title()}{cl}Pct"] = pct(rb['rvshare_5m_denominator'][t][c]) tc = 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}" out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in add.items()) (ROOT / "paper/numbers_text.tex").write_text(out); print("robustness macros", len(add)) # ---- additions after the contract-based rebuild: cumulated-intraday fidelity, implied-yield fidelity, IRF/VAR/connectedness, counts ---- fc = 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") a2 = {} a2["nYieldDaysFactors"] = f"{fc['all_days']['n']:,}"; a2["nMinutesFactorsM"] = f"{irf['counts']['minutes_with_factors'] / 1e6:.1f}" for f, fl in (("level", "Level"), ("slope", "Slope"), ("curvature", "Curv")): a2[f"fidCum{fl}All"] = f"{fc['all_days'][f]['r2']:.2f}"; a2[f"fidCum{fl}AllSlope"] = f"{fc['all_days'][f]['slope']:.2f}" for per, lab in (("2011_2015", "Zlb"), ("2016_2019", "Mid"), ("2020_2021", "Pandemic"), ("2022_2026", "Recent")): a2[f"fidCum{fl}{lab}"] = f"{fc['all_days_' + per][f]['r2']:.2f}" a2["shareDaysGeSixHundredPct"] = pct(fc['coverage']['share_days_ge600'], 1); a2["medianMinutesFactors"] = f"{fc['coverage']['median_minutes']:,.0f}" # implied-yield fidelity: daily CMT yield changes vs cumulated implied changes (laptop: factors_daily_realized.csv + FRED) import sys; sys.path.insert(0, str(ROOT / "src")) from wp47.ns import loadings, LAMBDA_DL, read_fred fdr = pd.read_csv(M / "factors_daily_realized.csv", index_col=0, parse_dates=True) yl = read_fred(ROOT / "data/external/fred").diff() taus = {"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"} imp = {} for mn, tau in taus.items(): l = loadings(np.array([tau]), LAMBDA_DL)[0] pred = fdr["cum_dL"] * l[0] + fdr["cum_dS"] * l[1] + fdr["cum_dC"] * l[2] t = pd.concat([yl[mn], pred], axis=1, keys=["a", "p"]).dropna().loc["2011":] 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}" # short rate y(0) = L + S t = pd.concat([yl["DGS1MO"], fdr["cum_dL"] + fdr["cum_dS"]], axis=1, keys=["a", "p"]).dropna().loc["2011":] a2["fidYShortRateVsOneM"] = f"{float(1 - ((t.a - t.p) ** 2).sum() / ((t.a - t.a.mean()) ** 2).sum()):.2f}" json.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) # events (updated counts and headline numbers) for k, lab in (("FOMC_all", "fomc"), ("CPI_all", "cpi"), ("EMP_all", "emp")): a2[f"n{lab.title()}EventsUsed"] = f"{ev2[k]['n_events']}" for c, cl in (("dL", "Level"), ("dS", "Slope"), ("dC", "Curv")): a2[f"{lab}RvShare{cl}Pct"] = pct(ev2[k][f"rvshare_{c}"][0]) shares = [ev2[k][f"rvshare_{c}"][0] / (30 / 1380) for k in ("FOMC_all", "CPI_all", "EMP_all") for c in ("dL", "dS", "dC")] a2["rvShareRatioMin"] = f"{min(shares):.0f}"; a2["rvShareRatioMax"] = f"{max(shares):.0f}" # HAR Holm from scipy.stats import norm dm = {(f, h): har2[f][f"h{h}"]["dm_qlike_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)} pv = sorted([(2 * (1 - norm.cdf(abs(v))), k) for k, v in dm.items()]); n = len(pv); adj = []; run = 0 for i, (p, k) in enumerate(pv): run = max(run, p * (n - i)); adj.append((k, min(run, 1.0))) a2["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)}" a2["harDmMin"] = f"{max(dm.values()):.1f}"; a2["harDmMax"] = f"{min(dm.values()):.1f}" dmm = {(f, h): har2[f][f"h{h}"]["dm_mse_har_vs_garch"] for f in ("level", "slope", "curvature") for h in (1, 5, 22)} a2["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}" # noise share of 1-min variance of the level factor: noise var per minute / mean 1m RV per minute rv1 = rc2["rv_mean_bp2"]["1m"]["L"] / fc["coverage"]["median_minutes"]; a2["noiseShareLevelOneMinPct"] = pct(nz2["mean_noise_sd_bp_per_min"]["level"] ** 2 / rv1, 0) a2["corrLsGapNoise"] = f"{abs(rc2['full']['1m']['LS'] - nz2['mean_noise_corr_LS']):.2f}" # LP IRF headline numbers lp = irf["lp"] def b(key, v, h): return lp[key][v][h]["beta"] a2["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}" a2["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}" a2["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}" a2["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}" a2["lpCpiTenYMTwentyFive"] = f"{b('CPI_all','dy10','m25'):.2f}"; a2["lpEmpTenYMTwentyFive"] = f"{b('EMP_all','dy10','m25'):.2f}" a2["lpFomcCurvMTwentyFive"] = f"{b('FOMC_all','dC','m25'):.2f}"; a2["lpFomcCurvDTen"] = f"{b('FOMC_all','dC','d10'):.2f}" # VAR / connectedness v5 = 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}" a2["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}" a2["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']}" vc = 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}" a2["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']}" a2["srThreeMedianBarsTwentyTwenty"] = f"{irf['counts']['sr3_median_minutes_by_year']['2020']:.0f}"; a2["srThreeMedianBarsTwentyTwentyTwo"] = f"{irf['counts']['sr3_median_minutes_by_year']['2022']:.0f}" rd2 = 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'])}" a2["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}" a2["nContractsZN"] = f"{rd2['ZN']['contracts_used']}"; a2["nPanelMinutes"] = f"{rd2['panel']['minutes'] / 1e6:.2f}" out += "".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"]) a3 = {"fomcZlbRvShareCurvPct": pct(ev2["FOMC_2011_2015"]["rvshare_dC"][0]), "fomcZlbRvShareSlopePct": pct(ev2["FOMC_2011_2015"]["rvshare_dS"][0])} out += "".join(f"\\providecommand{{\\{k}}}{{{v}}}\n" for k, v in a3.items()); (ROOT / "paper/numbers_text.tex").write_text(out)