From a4c9a702ad0fba5bfd9838f65987085d58134cf4 Mon Sep 17 00:00:00 2001 From: Variet Agent Date: Wed, 11 Mar 2026 16:19:58 +0900 Subject: [PATCH] feat(pipeline): wire 7x7 Zt + 8x8 CCC expansion into main.py lifetime PD --- main.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index a4ff673..795b4c1 100644 --- a/main.py +++ b/main.py @@ -36,8 +36,9 @@ from tabulate import tabulate # 프로젝트 모듈 from data.transition_matrices import ( load_transition_matrices, compute_ttc_matrix, - get_default_rates, display_matrix, RATING_GRADES + get_default_rates, display_matrix, RATING_GRADES, RATING_GRADES_8 ) +from data.ccc_interpolator import expand_to_8x8 from data.macro_data import load_macro_data, _fallback_macro_data, compute_derived_features from models.credit_cycle import estimate_zt_series, estimate_rho_and_zt from models.vasicek import conditional_pd, worst_case_pd @@ -227,7 +228,12 @@ def main(): print(" [5/7] 50년 Lifetime PD 산출") print("=" * 70) - pd_engine = LifetimePDEngine(ttc_matrix, rho) + # 7x7 TTC -> 8x8 TTC (CCC interpolation) + ttc_8x8 = expand_to_8x8(ttc_matrix) + print(f"\n 7x7 TTC -> 8x8 TTC (CCC interpolated)") + print(display_matrix(ttc_8x8, "TTC 8x8 (CCC interpolated)")) + + pd_engine = LifetimePDEngine(ttc_8x8, rho, rating_grades=RATING_GRADES_8) pd_results = pd_engine.compute_all_scenarios(z_paths, weights, horizon) # 누적 PD 테이블 @@ -244,8 +250,8 @@ def main(): # Vasicek Worst-Case 비교 print("\n === Basel II Worst-Case PD (99.9% VaR) ===") - ttc_pds = ttc_matrix[:-1, -1] - for i, grade in enumerate(RATING_GRADES[:-1]): + ttc_pds = ttc_8x8[:-1, -1] + for i, grade in enumerate(RATING_GRADES_8[:-1]): wc = worst_case_pd(ttc_pds[i], rho) print(f" {grade}: TTC={ttc_pds[i]*100:.3f}% → WC={wc*100:.3f}%")