diff --git a/.agents/references/known-issues.md b/.agents/references/known-issues.md index 04161f2..e614204 100644 --- a/.agents/references/known-issues.md +++ b/.agents/references/known-issues.md @@ -57,3 +57,15 @@ - **원인**: pandas 2.x에서 `fillna(method=)` 인자 deprecated - **해결**: `df.ffill().bfill()` 메서드 체인으로 대체 - **주의**: pandas 2.x 이상 사용 시 `fillna(method=)` 전면 금지 + +### [2026-03-11] Belkin Zt 부호 규칙 — 전체 파이프라인 부호 반전 버그 +- **증상**: Zt 1998=+2.12 (IMF 위기인데 양수), 2006=-1.53 (호황인데 음수) +- **원인**: Belkin 논문 원본: Z>0=호황(PD↓). 코드에서 임계값이 오름차순(AAA→D)인데 수식에 `(d - √ρ·Z)`로 구현하여 부호 반전. 올바른 수식은 `(d + √ρ·Z)` +- **해결**: `credit_cycle.py`, `vasicek.py`, `transition_matrices.py` 3파일 모두 `(d - sqrt_rho * z)` → `(d + sqrt_rho * z)` 수정 +- **주의**: vasicek.py의 `conditional_pd()`는 Basel convention (Z↑=불황)으로 별도 체계. 조건부 전이행렬은 Belkin convention (Z↑=호황). 두 규약이 코드에 공존하므로 반드시 docstring 확인 후 사용 + +### [2026-03-11] ECOS 거시변수 — fallback 커버리지 부족 +- **증상**: 기존 11개 변수만으로는 Zt 설명력 부족 (R² < 0.6) +- **원인**: 한국 경제 특수성(유가의존, 수출주도, 부동산 영향 등) 미반영 +- **해결**: 31개 변수로 확장 (KOSPI, OIL_PRICE, USDKRW, DISHONOR_RATE, HOUSING_PRICE, BSI_MANUF 등). `data/ecos_fetcher.py` + `data/cache/macro_ecos.csv` 캐싱 구조 +- **주의**: fallback 데이터는 대략적 수치. 정밀 분석 시 ECOS API 실제 호출 필요 (`--force` 옵션) diff --git a/docs/devlog/2026-03-11.md b/docs/devlog/2026-03-11.md new file mode 100644 index 0000000..28e248d --- /dev/null +++ b/docs/devlog/2026-03-11.md @@ -0,0 +1,9 @@ +# Devlog — 2026-03-11 + +| # | 시간 | 작업 | 커밋 | 상태 | +|---|------|------|------|------| +| 1 | 07:19 | Zt 부호 규칙 확인 (Belkin Z>0=호황) | `1a4cc87` | ✅ | +| 2 | 07:26 | 전체 파이프라인 부호 수정 (credit_cycle + vasicek + TM) | `d61c538` | ✅ | +| 3 | 07:42 | ECOS 변수 21→31개 확장 + CSV 캐싱 | `92ce84a`, `49c7661` | ✅ | +| 4 | 07:52 | 31변수 거시경제 재분석 v3 (R²=0.646) | `cc55acc` | ✅ | +| 5 | 08:00 | 파이프라인 전단계 검증 엑셀 생성 (10시트) | `0e1e0e5` | ✅ | diff --git a/docs/devlog/entries/20260311-001.md b/docs/devlog/entries/20260311-001.md new file mode 100644 index 0000000..1196737 --- /dev/null +++ b/docs/devlog/entries/20260311-001.md @@ -0,0 +1,29 @@ +# Zt 부호 수정 + 31변수 확장 재분석 + +- **시간**: 2026-03-11 07:19~08:03 +- **Commits**: `d61c538`, `92ce84a`, `49c7661`, `cc55acc`, `0e1e0e5` + +## 결정 사항 + +### Zt 부호 규약 (Belkin vs Basel) + +Belkin & Suchower (1998) 원논문 확인 결과: +- **Z > 0 = 호황** (PD 하락, 상향 전이 증가) +- **Z < 0 = 불황** (PD 상승, 하향 전이/부도 증가) + +코드가 `(d - √ρ·Z)` → `(d + √ρ·Z)`로 수정됨 (3파일). +단, `vasicek.py`의 `conditional_pd()`는 Basel convention (Z↑=불황)으로 별도 체계. +이 두 규약이 코드에 공존하며, 각 함수 docstring에 명시. + +### 거시변수 선정 (31→80+) + +- 기존 11개 → 31개 원본 확장 +- 금리: DIFF만, 지수: LEVEL+DIFF+LAG1, 금액: DIFF+PCT +- CREDIT_SPREAD_LAG1이 모든 Top 10 조합에 등장 → 핵심 앵커 변수 +- 최적: CREDIT_SPREAD_LAG1 + USDKRW + HOUSING_PRICE (R²=0.646) + +## 미완료 + +- [ ] ECOS API 실제 호출 구현 (현재 fallback만 사용) +- [ ] R²≥0.7 달성을 위한 추가 변수 탐색 (비선형 변환 등) +- [ ] 최적 모형을 main.py 파이프라인에 반영 diff --git a/results/pipeline_verification.xlsx b/results/pipeline_verification.xlsx new file mode 100644 index 0000000..8470382 Binary files /dev/null and b/results/pipeline_verification.xlsx differ diff --git a/results/transition_matrix_audit.xlsx b/results/transition_matrix_audit.xlsx new file mode 100644 index 0000000..c855bf6 Binary files /dev/null and b/results/transition_matrix_audit.xlsx differ