콘텐츠로 이동

금리 지표

한국은행 기준금리와 국고채 수익률 등 금리 관련 지표를 조회하는 방법을 설명합니다.

한국은행 기준금리

한국은행 금융통화위원회에서 결정하는 기준금리를 조회합니다.

기본 사용법

import ecos

# 최근 기준금리 조회
df = ecos.get_base_rate()
print(df)

기간 지정

# 2020년 1월부터 2024년 12월까지
df = ecos.get_base_rate(
    start_date="202001",
    end_date="202412"
)

반환 데이터 구조

컬럼 타입 설명
date datetime 적용 시작일
value float 기준금리 (%)
unit str 단위 (%)

활용 예시

import ecos
import matplotlib.pyplot as plt

# 최근 5년 기준금리 추이
df = ecos.get_base_rate(start_date="202001")

# 시각화
df.set_index('date')['value'].plot(
    title='한국은행 기준금리 추이',
    ylabel='금리 (%)',
    figsize=(12, 6),
    grid=True
)
plt.show()

# 통계
print(f"현재 금리: {df.iloc[-1]['value']}%")
print(f"평균 금리: {df['value'].mean():.2f}%")
print(f"최고 금리: {df['value'].max()}%")
print(f"최저 금리: {df['value'].min()}%")

국고채 수익률

국고채 각 만기별 수익률을 조회합니다.

지원 만기

  • 1Y - 국고채 1년
  • 3Y - 국고채 3년
  • 5Y - 국고채 5년
  • 10Y - 국고채 10년
  • 20Y - 국고채 20년
  • 30Y - 국고채 30년

기본 사용법

import ecos

# 국고채 3년물
df = ecos.get_treasury_yield(maturity="3Y")
print(df.tail())

# 국고채 10년물
df = ecos.get_treasury_yield(maturity="10Y")
print(df.tail())

기간 지정

# 2024년 데이터만 조회
df = ecos.get_treasury_yield(
    maturity="10Y",
    start_date="20240101",
    end_date="20241231"
)

날짜 형식

국고채 수익률은 일간 데이터이므로 YYYYMMDD 형식을 사용합니다.

반환 데이터 구조

컬럼 타입 설명
date datetime 조회일
value float 수익률 (%)
unit str 단위 (%)

여러 만기 비교

import ecos
import pandas as pd
import matplotlib.pyplot as plt

# 여러 만기 조회
y3 = ecos.get_treasury_yield(maturity="3Y", start_date="20240101")
y5 = ecos.get_treasury_yield(maturity="5Y", start_date="20240101")
y10 = ecos.get_treasury_yield(maturity="10Y", start_date="20240101")

# 데이터 병합
merged = pd.merge(
    y3[['date', 'value']].rename(columns={'value': '3Y'}),
    y5[['date', 'value']].rename(columns={'value': '5Y'}),
    on='date'
)
merged = pd.merge(
    merged,
    y10[['date', 'value']].rename(columns={'value': '10Y'}),
    on='date'
)

# 수익률 곡선 시각화
merged.set_index('date').plot(
    title='국고채 수익률 추이',
    ylabel='수익률 (%)',
    figsize=(12, 6),
    grid=True
)
plt.legend(['3년', '5년', '10년'])
plt.show()

장단기 금리차

10년물과 3년물 국고채 수익률의 차이를 계산합니다.

기본 사용법

import ecos

# 장단기 금리차 조회
df = ecos.get_yield_spread()
print(df.tail())

기간 지정

df = ecos.get_yield_spread(
    start_date="20240101",
    end_date="20241231"
)

반환 데이터 구조

컬럼 타입 설명
date datetime 조회일
long_yield float 10년물 수익률 (%)
short_yield float 3년물 수익률 (%)
spread float 금리차 (%p)
unit str 단위 (%p)

금리 역전 감지

금리 역전(yield curve inversion)은 경기 침체의 선행 지표로 알려져 있습니다.

import ecos

df = ecos.get_yield_spread()

# 최근 금리차
latest = df.iloc[-1]
spread = latest['spread']

# 금리 역전 여부 확인
if spread < 0:
    print(f"⚠️ 금리 역전 발생! ({spread:.2f}%p)")
    print("경기 침체 가능성에 주의하세요.")
elif spread < 0.5:
    print(f"⚡ 금리차 축소 ({spread:.2f}%p)")
    print("금리 역전 가능성을 모니터링하세요.")
else:
    print(f"✅ 정상 수익률 곡선 ({spread:.2f}%p)")

금리차 추이 시각화

import ecos
import matplotlib.pyplot as plt

df = ecos.get_yield_spread(start_date="20200101")

# 그래프 생성
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))

# 수익률 추이
df.set_index('date')[['long_yield', 'short_yield']].plot(
    ax=ax1,
    title='국고채 수익률 추이',
    ylabel='수익률 (%)',
    grid=True
)
ax1.legend(['10년물', '3년물'])

# 금리차 추이
spread_plot = df.set_index('date')['spread'].plot(
    ax=ax2,
    title='장단기 금리차',
    ylabel='금리차 (%p)',
    grid=True,
    color='green'
)

# 0선 표시 (금리 역전 기준선)
ax2.axhline(y=0, color='red', linestyle='--', linewidth=1, label='역전 기준선')
ax2.fill_between(
    df.set_index('date').index,
    df.set_index('date')['spread'],
    0,
    where=(df.set_index('date')['spread'] < 0),
    color='red',
    alpha=0.3,
    label='역전 구간'
)
ax2.legend()

plt.tight_layout()
plt.show()

실전 활용 예제

금리 변동성 분석

import ecos
import numpy as np

df = ecos.get_base_rate(start_date="202001")

# 금리 변화 계산
df['change'] = df['value'].diff()

# 변동성 통계
print("금리 변동 통계:")
print(f"평균 변화: {df['change'].mean():.4f}%p")
print(f"표준편차: {df['change'].std():.4f}%p")
print(f"최대 인상: {df['change'].max():.2f}%p")
print(f"최대 인하: {df['change'].min():.2f}%p")

# 인상/인하 횟수
raises = (df['change'] > 0).sum()
cuts = (df['change'] < 0).sum()
holds = (df['change'] == 0).sum()

print(f"\n금리 조정 현황:")
print(f"인상: {raises}회")
print(f"인하: {cuts}회")
print(f"동결: {holds}회")

금리 사이클 분석

import ecos

df = ecos.get_base_rate(start_date="201001")

# 금리 피크와 저점 찾기
peak_value = df['value'].max()
trough_value = df['value'].min()

peak_date = df.loc[df['value'] == peak_value, 'date'].iloc[0]
trough_date = df.loc[df['value'] == trough_value, 'date'].iloc[0]

print(f"금리 사이클 분석:")
print(f"최고점: {peak_value}% ({peak_date.strftime('%Y-%m-%d')})")
print(f"최저점: {trough_value}% ({trough_date.strftime('%Y-%m-%d')})")
print(f"사이클 범위: {peak_value - trough_value}%p")

예금은행 수신금리

예금은행의 수신금리(예금금리)를 신규취급액 기준 또는 잔액 기준으로 조회합니다.

지원 기준

  • 신규취급액 - 신규 예금에 적용되는 금리 (기본값)
  • 잔액 - 기존 예금 잔액 전체의 평균 금리

기본 사용법

import ecos

# 신규취급액 기준 수신금리
df = ecos.get_bank_deposit_rate(basis="신규취급액")
print(df.tail())

# 잔액 기준 수신금리
df = ecos.get_bank_deposit_rate(basis="잔액")
print(df.tail())

기간 지정

# 2024년 데이터
df = ecos.get_bank_deposit_rate(
    basis="신규취급액",
    start_date="202401",
    end_date="202412"
)

날짜 형식

수신금리는 월간 데이터이므로 YYYYMM 형식을 사용합니다.

반환 데이터 구조

컬럼 타입 설명
date datetime 조회 월
value float 수신금리 (%)
unit str 단위 (%)

신규 vs 잔액 금리 비교

import ecos
import pandas as pd
import matplotlib.pyplot as plt

# 두 기준 조회
new_rate = ecos.get_bank_deposit_rate(basis="신규취급액", start_date="202001")
balance_rate = ecos.get_bank_deposit_rate(basis="잔액", start_date="202001")

# 데이터 병합
merged = pd.merge(
    new_rate[['date', 'value']].rename(columns={'value': '신규'}),
    balance_rate[['date', 'value']].rename(columns={'value': '잔액'}),
    on='date'
)

# 금리차 계산
merged['spread'] = merged['신규'] - merged['잔액']

# 시각화
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))

# 금리 수준
merged.set_index('date')[['신규', '잔액']].plot(
    ax=ax1,
    title='예금금리: 신규 vs 잔액',
    ylabel='금리 (%)',
    grid=True
)
ax1.legend(['신규취급액', '잔액'])

# 금리차
merged.set_index('date')['spread'].plot(
    ax=ax2,
    title='신규-잔액 금리차',
    ylabel='금리차 (%p)',
    grid=True,
    color='purple'
)
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)

plt.tight_layout()
plt.show()

print(f"평균 금리차: {merged['spread'].mean():.3f}%p")

예금은행 대출금리

예금은행의 대출금리를 신규취급액 기준 또는 잔액 기준으로 조회합니다.

지원 기준

  • 신규취급액 - 신규 대출에 적용되는 금리 (기본값)
  • 잔액 - 기존 대출 잔액 전체의 평균 금리

기본 사용법

import ecos

# 신규취급액 기준 대출금리
df = ecos.get_bank_lending_rate(basis="신규취급액")
print(df.tail())

# 잔액 기준 대출금리
df = ecos.get_bank_lending_rate(basis="잔액")
print(df.tail())

기간 지정

# 2024년 데이터
df = ecos.get_bank_lending_rate(
    basis="신규취급액",
    start_date="202401",
    end_date="202412"
)

반환 데이터 구조

컬럼 타입 설명
date datetime 조회 월
value float 대출금리 (%)
unit str 단위 (%)

예대금리차 분석

import ecos
import pandas as pd
import matplotlib.pyplot as plt

# 예금금리와 대출금리 조회
deposit = ecos.get_bank_deposit_rate(basis="신규취급액", start_date="202001")
lending = ecos.get_bank_lending_rate(basis="신규취급액", start_date="202001")

# 데이터 병합
merged = pd.merge(
    deposit[['date', 'value']].rename(columns={'value': '예금금리'}),
    lending[['date', 'value']].rename(columns={'value': '대출금리'}),
    on='date'
)

# 예대금리차 계산
merged['spread'] = merged['대출금리'] - merged['예금금리']

# 시각화
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))

# 금리 수준
merged.set_index('date')[['예금금리', '대출금리']].plot(
    ax=ax1,
    title='예금금리 vs 대출금리',
    ylabel='금리 (%)',
    grid=True
)

# 예대금리차
merged.set_index('date')['spread'].plot(
    ax=ax2,
    title='예대금리차 (Net Interest Margin)',
    ylabel='금리차 (%p)',
    grid=True,
    color='green'
)
ax2.axhline(y=merged['spread'].mean(), color='red', linestyle='--',
            linewidth=1, label=f'평균: {merged["spread"].mean():.2f}%p')
ax2.legend()

plt.tight_layout()
plt.show()

# 통계
print("예대금리차 통계:")
print(f"평균: {merged['spread'].mean():.2f}%p")
print(f"최대: {merged['spread'].max():.2f}%p")
print(f"최소: {merged['spread'].min():.2f}%p")
print(f"현재: {merged.iloc[-1]['spread']:.2f}%p")

기준금리와 시장금리 관계

import ecos
import pandas as pd
import matplotlib.pyplot as plt

# 데이터 조회
base_rate = ecos.get_base_rate(start_date="202001")
lending_rate = ecos.get_bank_lending_rate(basis="신규취급액", start_date="202001")

# 데이터 병합
merged = pd.merge(
    base_rate[['date', 'value']].rename(columns={'value': '기준금리'}),
    lending_rate[['date', 'value']].rename(columns={'value': '대출금리'}),
    on='date'
)

# 가산금리 계산
merged['spread'] = merged['대출금리'] - merged['기준금리']

# 시각화
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))

# 금리 수준
merged.set_index('date')[['기준금리', '대출금리']].plot(
    ax=ax1,
    title='기준금리 vs 대출금리',
    ylabel='금리 (%)',
    grid=True
)

# 가산금리 (스프레드)
merged.set_index('date')['spread'].plot(
    ax=ax2,
    title='대출 가산금리',
    ylabel='가산금리 (%p)',
    grid=True,
    color='orange'
)
ax2.axhline(y=merged['spread'].mean(), color='blue', linestyle='--',
            linewidth=1, label=f'평균: {merged["spread"].mean():.2f}%p')
ax2.legend()

plt.tight_layout()
plt.show()

print("대출 가산금리 분석:")
print(f"평균 가산금리: {merged['spread'].mean():.2f}%p")
print(f"현재 가산금리: {merged.iloc[-1]['spread']:.2f}%p")

다음 단계