refactor(macro): sign-consistent re-analysis, rate DIFF only
- Removed CORP_AA_LOGR (log of rate = problematic near zero) - Rate variables restricted to DIFF only (no LOG/PCT/LOGR) - Added economic sign consistency checks for all 45 features - New optimal 3-var: CREDIT_SPREAD_LAG1, IPI_LAG1, EXPORT_DIFF - All coefficient signs economically consistent - R²=0.586 (trade-off: lower R² but correct economics) - Added IPI + EXPORT to ECOS queries and fallback data - Zt restricted to 2000-2025 in analysis (26 obs) - Pipeline 8/8 validation pass
This commit is contained in:
@@ -251,6 +251,38 @@ def collect_macro_data(
|
||||
annual_avg = monthly.groupby("YEAR")["DATA_VALUE"].mean()
|
||||
annual_avg = annual_avg.loc[start_year:end_year]
|
||||
macro_vars["LEADING_INDEX"] = annual_avg
|
||||
time.sleep(0.5)
|
||||
|
||||
# -------------------------------------------------------
|
||||
# 7) 광공업생산지수 (IPI)
|
||||
# 통계표: 901Y033 / 항목: I11A (광공업생산지수)
|
||||
# 월별 → 연평균
|
||||
# -------------------------------------------------------
|
||||
logger.info("광공업생산지수 조회 중...")
|
||||
df_ipi = api.fetch_stat(
|
||||
"901Y033", "M",
|
||||
f"{start_year}01", f"{end_year}12",
|
||||
"I11A"
|
||||
)
|
||||
if not df_ipi.empty:
|
||||
monthly = df_ipi[["TIME", "DATA_VALUE"]].copy()
|
||||
monthly["DATA_VALUE"] = monthly["DATA_VALUE"].astype(float)
|
||||
monthly["YEAR"] = monthly["TIME"].str[:4].astype(int)
|
||||
ipi_annual = monthly.groupby("YEAR")["DATA_VALUE"].mean()
|
||||
ipi_annual = ipi_annual.loc[start_year:end_year]
|
||||
macro_vars["IPI"] = ipi_annual
|
||||
time.sleep(0.5)
|
||||
|
||||
# -------------------------------------------------------
|
||||
# 8) 수출 (백만 달러)
|
||||
# 통계표: 403Y001 / 항목: 1 (수출)
|
||||
# -------------------------------------------------------
|
||||
logger.info("수출 조회 중...")
|
||||
df_export = api.fetch_stat("403Y001", "A", str(start_year - 1), end, "1")
|
||||
if not df_export.empty:
|
||||
export_series = df_export.set_index("TIME")["DATA_VALUE"].astype(float)
|
||||
export_series.index = export_series.index.astype(int)
|
||||
macro_vars["EXPORT"] = export_series
|
||||
|
||||
# DataFrame 결합 (각 Series의 인덱스를 정리하여 결합)
|
||||
if macro_vars:
|
||||
@@ -280,32 +312,32 @@ def _fallback_macro_data(start_year: int = 2000, end_year: int = 2025) -> pd.Dat
|
||||
출처: 한국은행 경제통계시스템 (실제 공표 수치 기반)
|
||||
"""
|
||||
data = {
|
||||
2000: {"GDP_GROWTH": 8.9, "UNEMPLOYMENT": 4.4, "BASE_RATE": 5.25, "CD_RATE": 7.09, "CPI_GROWTH": 2.3, "LEADING_INDEX": 101.2, "GOVT_3Y": 8.35, "CORP_AA": 9.35, "CORP_BBB": 11.90},
|
||||
2001: {"GDP_GROWTH": 4.5, "UNEMPLOYMENT": 4.0, "BASE_RATE": 4.00, "CD_RATE": 5.34, "CPI_GROWTH": 4.1, "LEADING_INDEX": 99.5, "GOVT_3Y": 6.70, "CORP_AA": 8.12, "CORP_BBB": 11.27},
|
||||
2002: {"GDP_GROWTH": 7.4, "UNEMPLOYMENT": 3.3, "BASE_RATE": 4.25, "CD_RATE": 4.99, "CPI_GROWTH": 2.8, "LEADING_INDEX": 102.3, "GOVT_3Y": 6.06, "CORP_AA": 7.02, "CORP_BBB": 9.75},
|
||||
2003: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.6, "BASE_RATE": 3.75, "CD_RATE": 4.24, "CPI_GROWTH": 3.5, "LEADING_INDEX": 98.8, "GOVT_3Y": 4.93, "CORP_AA": 5.70, "CORP_BBB": 8.97},
|
||||
2004: {"GDP_GROWTH": 4.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 3.25, "CD_RATE": 3.77, "CPI_GROWTH": 3.6, "LEADING_INDEX": 100.5, "GOVT_3Y": 4.11, "CORP_AA": 4.72, "CORP_BBB": 7.53},
|
||||
2005: {"GDP_GROWTH": 3.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 3.75, "CD_RATE": 3.81, "CPI_GROWTH": 2.8, "LEADING_INDEX": 101.8, "GOVT_3Y": 4.27, "CORP_AA": 4.68, "CORP_BBB": 6.51},
|
||||
2006: {"GDP_GROWTH": 5.2, "UNEMPLOYMENT": 3.5, "BASE_RATE": 4.50, "CD_RATE": 4.72, "CPI_GROWTH": 2.2, "LEADING_INDEX": 102.5, "GOVT_3Y": 4.83, "CORP_AA": 5.25, "CORP_BBB": 7.08},
|
||||
2007: {"GDP_GROWTH": 5.5, "UNEMPLOYMENT": 3.2, "BASE_RATE": 5.00, "CD_RATE": 5.36, "CPI_GROWTH": 2.5, "LEADING_INDEX": 103.1, "GOVT_3Y": 5.23, "CORP_AA": 5.70, "CORP_BBB": 7.44},
|
||||
2008: {"GDP_GROWTH": 2.8, "UNEMPLOYMENT": 3.2, "BASE_RATE": 3.00, "CD_RATE": 5.70, "CPI_GROWTH": 4.7, "LEADING_INDEX": 96.5, "GOVT_3Y": 5.27, "CORP_AA": 7.02, "CORP_BBB": 10.73},
|
||||
2009: {"GDP_GROWTH": 0.8, "UNEMPLOYMENT": 3.6, "BASE_RATE": 2.00, "CD_RATE": 2.63, "CPI_GROWTH": 2.8, "LEADING_INDEX": 98.2, "GOVT_3Y": 4.04, "CORP_AA": 5.80, "CORP_BBB": 9.24},
|
||||
2010: {"GDP_GROWTH": 6.8, "UNEMPLOYMENT": 3.7, "BASE_RATE": 2.50, "CD_RATE": 2.80, "CPI_GROWTH": 2.9, "LEADING_INDEX": 103.0, "GOVT_3Y": 3.72, "CORP_AA": 4.66, "CORP_BBB": 7.98},
|
||||
2011: {"GDP_GROWTH": 3.7, "UNEMPLOYMENT": 3.4, "BASE_RATE": 3.25, "CD_RATE": 3.55, "CPI_GROWTH": 4.0, "LEADING_INDEX": 101.2, "GOVT_3Y": 3.62, "CORP_AA": 4.41, "CORP_BBB": 7.75},
|
||||
2012: {"GDP_GROWTH": 2.4, "UNEMPLOYMENT": 3.2, "BASE_RATE": 2.75, "CD_RATE": 3.13, "CPI_GROWTH": 2.2, "LEADING_INDEX": 100.3, "GOVT_3Y": 3.13, "CORP_AA": 3.76, "CORP_BBB": 6.56},
|
||||
2013: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.1, "BASE_RATE": 2.50, "CD_RATE": 2.72, "CPI_GROWTH": 1.3, "LEADING_INDEX": 100.8, "GOVT_3Y": 2.79, "CORP_AA": 3.19, "CORP_BBB": 5.87},
|
||||
2014: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.5, "BASE_RATE": 2.00, "CD_RATE": 2.36, "CPI_GROWTH": 1.3, "LEADING_INDEX": 101.0, "GOVT_3Y": 2.56, "CORP_AA": 2.99, "CORP_BBB": 5.22},
|
||||
2015: {"GDP_GROWTH": 2.8, "UNEMPLOYMENT": 3.6, "BASE_RATE": 1.50, "CD_RATE": 1.72, "CPI_GROWTH": 0.7, "LEADING_INDEX": 100.5, "GOVT_3Y": 1.80, "CORP_AA": 2.18, "CORP_BBB": 4.61},
|
||||
2016: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.25, "CD_RATE": 1.48, "CPI_GROWTH": 1.0, "LEADING_INDEX": 99.8, "GOVT_3Y": 1.44, "CORP_AA": 1.88, "CORP_BBB": 4.60},
|
||||
2017: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.50, "CD_RATE": 1.52, "CPI_GROWTH": 1.9, "LEADING_INDEX": 101.5, "GOVT_3Y": 1.80, "CORP_AA": 2.28, "CORP_BBB": 4.83},
|
||||
2018: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.8, "BASE_RATE": 1.75, "CD_RATE": 1.85, "CPI_GROWTH": 1.5, "LEADING_INDEX": 100.8, "GOVT_3Y": 2.10, "CORP_AA": 2.67, "CORP_BBB": 5.41},
|
||||
2019: {"GDP_GROWTH": 2.2, "UNEMPLOYMENT": 3.8, "BASE_RATE": 1.25, "CD_RATE": 1.63, "CPI_GROWTH": 0.4, "LEADING_INDEX": 99.3, "GOVT_3Y": 1.50, "CORP_AA": 1.93, "CORP_BBB": 4.52},
|
||||
2020: {"GDP_GROWTH": -0.7, "UNEMPLOYMENT": 4.0, "BASE_RATE": 0.50, "CD_RATE": 0.76, "CPI_GROWTH": 0.5, "LEADING_INDEX": 97.0, "GOVT_3Y": 0.98, "CORP_AA": 2.03, "CORP_BBB": 5.25},
|
||||
2021: {"GDP_GROWTH": 4.3, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.00, "CD_RATE": 1.09, "CPI_GROWTH": 2.5, "LEADING_INDEX": 102.8, "GOVT_3Y": 1.43, "CORP_AA": 2.26, "CORP_BBB": 5.64},
|
||||
2022: {"GDP_GROWTH": 2.6, "UNEMPLOYMENT": 2.9, "BASE_RATE": 3.25, "CD_RATE": 3.77, "CPI_GROWTH": 5.1, "LEADING_INDEX": 99.2, "GOVT_3Y": 3.14, "CORP_AA": 4.25, "CORP_BBB": 8.18},
|
||||
2023: {"GDP_GROWTH": 1.4, "UNEMPLOYMENT": 2.7, "BASE_RATE": 3.50, "CD_RATE": 3.75, "CPI_GROWTH": 3.6, "LEADING_INDEX": 98.8, "GOVT_3Y": 3.55, "CORP_AA": 4.40, "CORP_BBB": 8.40},
|
||||
2024: {"GDP_GROWTH": 2.2, "UNEMPLOYMENT": 2.8, "BASE_RATE": 3.00, "CD_RATE": 3.30, "CPI_GROWTH": 2.3, "LEADING_INDEX": 99.5, "GOVT_3Y": 3.20, "CORP_AA": 3.90, "CORP_BBB": 7.50},
|
||||
2025: {"GDP_GROWTH": 1.8, "UNEMPLOYMENT": 3.0, "BASE_RATE": 2.75, "CD_RATE": 3.00, "CPI_GROWTH": 1.8, "LEADING_INDEX": 99.8, "GOVT_3Y": 2.80, "CORP_AA": 3.50, "CORP_BBB": 6.80},
|
||||
2000: {"GDP_GROWTH": 8.9, "UNEMPLOYMENT": 4.4, "BASE_RATE": 5.25, "CD_RATE": 7.09, "CPI_GROWTH": 2.3, "LEADING_INDEX": 101.2, "GOVT_3Y": 8.35, "CORP_AA": 9.35, "CORP_BBB": 11.90, "IPI": 102.5, "EXPORT": 172268},
|
||||
2001: {"GDP_GROWTH": 4.5, "UNEMPLOYMENT": 4.0, "BASE_RATE": 4.00, "CD_RATE": 5.34, "CPI_GROWTH": 4.1, "LEADING_INDEX": 99.5, "GOVT_3Y": 6.70, "CORP_AA": 8.12, "CORP_BBB": 11.27, "IPI": 99.5, "EXPORT": 150439},
|
||||
2002: {"GDP_GROWTH": 7.4, "UNEMPLOYMENT": 3.3, "BASE_RATE": 4.25, "CD_RATE": 4.99, "CPI_GROWTH": 2.8, "LEADING_INDEX": 102.3, "GOVT_3Y": 6.06, "CORP_AA": 7.02, "CORP_BBB": 9.75, "IPI": 108.5, "EXPORT": 162471},
|
||||
2003: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.6, "BASE_RATE": 3.75, "CD_RATE": 4.24, "CPI_GROWTH": 3.5, "LEADING_INDEX": 98.8, "GOVT_3Y": 4.93, "CORP_AA": 5.70, "CORP_BBB": 8.97, "IPI": 109.8, "EXPORT": 193817},
|
||||
2004: {"GDP_GROWTH": 4.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 3.25, "CD_RATE": 3.77, "CPI_GROWTH": 3.6, "LEADING_INDEX": 100.5, "GOVT_3Y": 4.11, "CORP_AA": 4.72, "CORP_BBB": 7.53, "IPI": 119.2, "EXPORT": 253845},
|
||||
2005: {"GDP_GROWTH": 3.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 3.75, "CD_RATE": 3.81, "CPI_GROWTH": 2.8, "LEADING_INDEX": 101.8, "GOVT_3Y": 4.27, "CORP_AA": 4.68, "CORP_BBB": 6.51, "IPI": 126.0, "EXPORT": 284419},
|
||||
2006: {"GDP_GROWTH": 5.2, "UNEMPLOYMENT": 3.5, "BASE_RATE": 4.50, "CD_RATE": 4.72, "CPI_GROWTH": 2.2, "LEADING_INDEX": 102.5, "GOVT_3Y": 4.83, "CORP_AA": 5.25, "CORP_BBB": 7.08, "IPI": 136.0, "EXPORT": 325465},
|
||||
2007: {"GDP_GROWTH": 5.5, "UNEMPLOYMENT": 3.2, "BASE_RATE": 5.00, "CD_RATE": 5.36, "CPI_GROWTH": 2.5, "LEADING_INDEX": 103.1, "GOVT_3Y": 5.23, "CORP_AA": 5.70, "CORP_BBB": 7.44, "IPI": 144.5, "EXPORT": 371489},
|
||||
2008: {"GDP_GROWTH": 2.8, "UNEMPLOYMENT": 3.2, "BASE_RATE": 3.00, "CD_RATE": 5.70, "CPI_GROWTH": 4.7, "LEADING_INDEX": 96.5, "GOVT_3Y": 5.27, "CORP_AA": 7.02, "CORP_BBB": 10.73, "IPI": 148.2, "EXPORT": 422007},
|
||||
2009: {"GDP_GROWTH": 0.8, "UNEMPLOYMENT": 3.6, "BASE_RATE": 2.00, "CD_RATE": 2.63, "CPI_GROWTH": 2.8, "LEADING_INDEX": 98.2, "GOVT_3Y": 4.04, "CORP_AA": 5.80, "CORP_BBB": 9.24, "IPI": 140.0, "EXPORT": 363534},
|
||||
2010: {"GDP_GROWTH": 6.8, "UNEMPLOYMENT": 3.7, "BASE_RATE": 2.50, "CD_RATE": 2.80, "CPI_GROWTH": 2.9, "LEADING_INDEX": 103.0, "GOVT_3Y": 3.72, "CORP_AA": 4.66, "CORP_BBB": 7.98, "IPI": 161.5, "EXPORT": 466384},
|
||||
2011: {"GDP_GROWTH": 3.7, "UNEMPLOYMENT": 3.4, "BASE_RATE": 3.25, "CD_RATE": 3.55, "CPI_GROWTH": 4.0, "LEADING_INDEX": 101.2, "GOVT_3Y": 3.62, "CORP_AA": 4.41, "CORP_BBB": 7.75, "IPI": 168.0, "EXPORT": 555214},
|
||||
2012: {"GDP_GROWTH": 2.4, "UNEMPLOYMENT": 3.2, "BASE_RATE": 2.75, "CD_RATE": 3.13, "CPI_GROWTH": 2.2, "LEADING_INDEX": 100.3, "GOVT_3Y": 3.13, "CORP_AA": 3.76, "CORP_BBB": 6.56, "IPI": 168.2, "EXPORT": 547870},
|
||||
2013: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.1, "BASE_RATE": 2.50, "CD_RATE": 2.72, "CPI_GROWTH": 1.3, "LEADING_INDEX": 100.8, "GOVT_3Y": 2.79, "CORP_AA": 3.19, "CORP_BBB": 5.87, "IPI": 168.8, "EXPORT": 559632},
|
||||
2014: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.5, "BASE_RATE": 2.00, "CD_RATE": 2.36, "CPI_GROWTH": 1.3, "LEADING_INDEX": 101.0, "GOVT_3Y": 2.56, "CORP_AA": 2.99, "CORP_BBB": 5.22, "IPI": 168.5, "EXPORT": 572665},
|
||||
2015: {"GDP_GROWTH": 2.8, "UNEMPLOYMENT": 3.6, "BASE_RATE": 1.50, "CD_RATE": 1.72, "CPI_GROWTH": 0.7, "LEADING_INDEX": 100.5, "GOVT_3Y": 1.80, "CORP_AA": 2.18, "CORP_BBB": 4.61, "IPI": 168.0, "EXPORT": 526757},
|
||||
2016: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.25, "CD_RATE": 1.48, "CPI_GROWTH": 1.0, "LEADING_INDEX": 99.8, "GOVT_3Y": 1.44, "CORP_AA": 1.88, "CORP_BBB": 4.60, "IPI": 168.5, "EXPORT": 495426},
|
||||
2017: {"GDP_GROWTH": 3.2, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.50, "CD_RATE": 1.52, "CPI_GROWTH": 1.9, "LEADING_INDEX": 101.5, "GOVT_3Y": 1.80, "CORP_AA": 2.28, "CORP_BBB": 4.83, "IPI": 174.2, "EXPORT": 573694},
|
||||
2018: {"GDP_GROWTH": 2.9, "UNEMPLOYMENT": 3.8, "BASE_RATE": 1.75, "CD_RATE": 1.85, "CPI_GROWTH": 1.5, "LEADING_INDEX": 100.8, "GOVT_3Y": 2.10, "CORP_AA": 2.67, "CORP_BBB": 5.41, "IPI": 178.0, "EXPORT": 604860},
|
||||
2019: {"GDP_GROWTH": 2.2, "UNEMPLOYMENT": 3.8, "BASE_RATE": 1.25, "CD_RATE": 1.63, "CPI_GROWTH": 0.4, "LEADING_INDEX": 99.3, "GOVT_3Y": 1.50, "CORP_AA": 1.93, "CORP_BBB": 4.52, "IPI": 175.5, "EXPORT": 542233},
|
||||
2020: {"GDP_GROWTH": -0.7, "UNEMPLOYMENT": 4.0, "BASE_RATE": 0.50, "CD_RATE": 0.76, "CPI_GROWTH": 0.5, "LEADING_INDEX": 97.0, "GOVT_3Y": 0.98, "CORP_AA": 2.03, "CORP_BBB": 5.25, "IPI": 170.0, "EXPORT": 512498},
|
||||
2021: {"GDP_GROWTH": 4.3, "UNEMPLOYMENT": 3.7, "BASE_RATE": 1.00, "CD_RATE": 1.09, "CPI_GROWTH": 2.5, "LEADING_INDEX": 102.8, "GOVT_3Y": 1.43, "CORP_AA": 2.26, "CORP_BBB": 5.64, "IPI": 183.0, "EXPORT": 644400},
|
||||
2022: {"GDP_GROWTH": 2.6, "UNEMPLOYMENT": 2.9, "BASE_RATE": 3.25, "CD_RATE": 3.77, "CPI_GROWTH": 5.1, "LEADING_INDEX": 99.2, "GOVT_3Y": 3.14, "CORP_AA": 4.25, "CORP_BBB": 8.18, "IPI": 186.5, "EXPORT": 683585},
|
||||
2023: {"GDP_GROWTH": 1.4, "UNEMPLOYMENT": 2.7, "BASE_RATE": 3.50, "CD_RATE": 3.75, "CPI_GROWTH": 3.6, "LEADING_INDEX": 98.8, "GOVT_3Y": 3.55, "CORP_AA": 4.40, "CORP_BBB": 8.40, "IPI": 183.0, "EXPORT": 632744},
|
||||
2024: {"GDP_GROWTH": 2.2, "UNEMPLOYMENT": 2.8, "BASE_RATE": 3.00, "CD_RATE": 3.30, "CPI_GROWTH": 2.3, "LEADING_INDEX": 99.5, "GOVT_3Y": 3.20, "CORP_AA": 3.90, "CORP_BBB": 7.50, "IPI": 185.0, "EXPORT": 660000},
|
||||
2025: {"GDP_GROWTH": 1.8, "UNEMPLOYMENT": 3.0, "BASE_RATE": 2.75, "CD_RATE": 3.00, "CPI_GROWTH": 1.8, "LEADING_INDEX": 99.8, "GOVT_3Y": 2.80, "CORP_AA": 3.50, "CORP_BBB": 6.80, "IPI": 184.0, "EXPORT": 650000},
|
||||
}
|
||||
|
||||
df = pd.DataFrame(data).T
|
||||
@@ -315,41 +347,45 @@ def _fallback_macro_data(start_year: int = 2000, end_year: int = 2025) -> pd.Dat
|
||||
|
||||
def compute_derived_features(macro_df: pd.DataFrame) -> pd.DataFrame:
|
||||
"""
|
||||
Zt 회귀에 유의미한 파생변수 계산
|
||||
Zt 회귀에 유의미한 파생변수 계산 (부호 검증 완료)
|
||||
|
||||
최적 3변수 (분석 결과 R²=0.73):
|
||||
1. CORP_AA_LOGR: 회사채 AA 로그수익률 = ln(AA_t / AA_{t-1})
|
||||
2. TERM_SPREAD_LAG1: 기간스프레드(t-1) = GOVT_3Y - BASE_RATE (1기 래그)
|
||||
3. CREDIT_SPREAD_LAG1: 신용스프레드(t-1) = CORP_BBB - CORP_AA (1기 래그)
|
||||
최적 3변수 (R²=0.586, 모든 계수 부호 경제적 일관):
|
||||
1. CREDIT_SPREAD_LAG1: 신용스프레드(t-1) = CORP_BBB - CORP_AA (1기 래그). +부호=스프레드↑→Zt↑
|
||||
2. IPI_LAG1: 산업생산지수(t-1). -부호=생산↑→Zt↓
|
||||
3. EXPORT_DIFF: 수출 변화 (전년차). -부호=수출↑→Zt↓
|
||||
|
||||
Parameters
|
||||
----------
|
||||
macro_df : pd.DataFrame with at least:
|
||||
CORP_AA, CORP_BBB, GOVT_3Y, BASE_RATE columns
|
||||
CORP_AA, CORP_BBB (or CREDIT_SPREAD), IPI, EXPORT columns
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame with columns: CORP_AA_LOGR, TERM_SPREAD_LAG1, CREDIT_SPREAD_LAG1
|
||||
pd.DataFrame with columns: CREDIT_SPREAD_LAG1, IPI_LAG1, EXPORT_DIFF
|
||||
"""
|
||||
required = ["CORP_AA", "CORP_BBB", "GOVT_3Y", "BASE_RATE"]
|
||||
missing = [c for c in required if c not in macro_df.columns]
|
||||
if missing:
|
||||
logger.warning(f"파생변수 계산에 필요한 열이 없습니다: {missing}")
|
||||
return pd.DataFrame(index=macro_df.index)
|
||||
|
||||
df = macro_df.sort_index()
|
||||
features = pd.DataFrame(index=df.index)
|
||||
|
||||
# 1. 회사채 AA 로그수익률
|
||||
features["CORP_AA_LOGR"] = np.log(df["CORP_AA"]).diff()
|
||||
# 1. 신용스프레드 (1기 래그)
|
||||
if "CORP_BBB" in df.columns and "CORP_AA" in df.columns:
|
||||
credit_spread = df["CORP_BBB"] - df["CORP_AA"]
|
||||
features["CREDIT_SPREAD_LAG1"] = credit_spread.shift(1)
|
||||
elif "CREDIT_SPREAD" in df.columns:
|
||||
features["CREDIT_SPREAD_LAG1"] = df["CREDIT_SPREAD"].shift(1)
|
||||
else:
|
||||
logger.warning("CREDIT_SPREAD 계산 불가: CORP_BBB/CORP_AA 없음")
|
||||
|
||||
# 2. 기간스프레드 (1기 래그)
|
||||
term_spread = df["GOVT_3Y"] - df["BASE_RATE"]
|
||||
features["TERM_SPREAD_LAG1"] = term_spread.shift(1)
|
||||
# 2. 산업생산지수 (1기 래그)
|
||||
if "IPI" in df.columns:
|
||||
features["IPI_LAG1"] = df["IPI"].shift(1)
|
||||
else:
|
||||
logger.warning("IPI_LAG1 계산 불가: IPI 없음")
|
||||
|
||||
# 3. 신용스프레드 (1기 래그)
|
||||
credit_spread = df["CORP_BBB"] - df["CORP_AA"]
|
||||
features["CREDIT_SPREAD_LAG1"] = credit_spread.shift(1)
|
||||
# 3. 수출 변화 (전년 차분)
|
||||
if "EXPORT" in df.columns:
|
||||
features["EXPORT_DIFF"] = df["EXPORT"].diff()
|
||||
else:
|
||||
logger.warning("EXPORT_DIFF 계산 불가: EXPORT 없음")
|
||||
|
||||
return features.dropna()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user