금융퀀트/프로그램기초
(OpenAPI)FRED API 사용: 미국금리 시계열 분석 2(python)
문송한투자자
2025. 6. 21. 10:07
반응형
미국금리 데이터 2년물, 5년물, 10년물 입수
(OpenAPI)FRED API 사용: 미국금리 시계열 분석 1(python)에서 만든 get_result 함수를 활용하면 2년물, 5년물, 10년물 미국 국채 금리 시계열 데이터를 얻을 수 있다. 각각의 결과를 df_gs02, df_gs05, df_gs10 이라는 변수에 저장하는 코드를 아래와 같이 만들어 볼 수 있다.
# request, pandas 라이브러리 참조
import requests
import pandas as pd
# FRED API에서 사용할 본인의 API 키
api_key = "나의 API키"
# 데이터 조회 시작일과 종료일 (월별 데이터 기준)
stdate = "2020-05-11"
eddate = "2025-05-11"
# FRED API에서 시리즈 데이터를 가져오는 함수
def get_result(api_key: str, stdate: str, eddate: str, series_id: str):
url = "https://api.stlouisfed.org/fred/series/observations"
# API 요청 파라미터 설정
params = {
"series_id": series_id, # 가져올 시리즈 ID (예: GS10, GS5, GS2)
"api_key": api_key, # 본인의 API 키
"file_type": "json", # 응답 포맷
"frequency": "m", # 월별 데이터
"observation_start": stdate, # 시작일
"observation_end": eddate # 종료일
}
# API 요청 보내기
res = requests.get(url, params=params)
res.raise_for_status() # 오류 발생 시 예외 처리
# 응답 데이터 중 'observations'를 DataFrame으로 변환
df = pd.DataFrame(res.json()["observations"], columns=["date", "value"])
# 컬럼명 변경: "value"를 시리즈 이름으로 바꾸기(예: GS10, GS5, GS2)
df.columns = ["date", series_id]
# 날짜 문자열을 datetime 형식으로 변환
df["date"] = pd.to_datetime(df["date"])
# 수치형 데이터로 변환
df[series_id] = df[series_id].astype(float)
return df
# 10년물 국채 수익률 데이터 가져오기
df_gs10 = get_result(api_key, stdate, eddate, "GS10")
# 5년물 국채 수익률 데이터 가져오기
df_gs05 = get_result(api_key, stdate, eddate, "GS5")
# 2년물 국채 수익률 데이터 가져오기
df_gs02 = get_result(api_key, stdate, eddate, "GS2")
데이터 병합
미국채 2년물, 5년물, 10년물 데이터를 각각 분석하는 것은 번거로울 수 있다. 시계열 분석을 위해서는 데이터를 아래 그림 1과 같이 병합하는 과정이 필요한데, pandas의 merge 함수를 사용하면 쉽게 데이터를 병합할 수 있다.( 파이썬 판다스(pandas) 데이터 합치기 concat&merge 활용 참조)
아래 코드와 같이 date를 기준으로 inner join 방식을 활용해서 데이터를 합치면 그림 2와 같은 결과를 얻을 수 있다.
df = pd.merge(df_gs02, df_gs05, how="inner", on="date")
df = pd.merge(df, df_gs10, how="inner", on="date")
데이터 시각화: matplotlib
데이터를 merge 하여 만든 df 라는 데이터를 matplotlib을 활용하여 시각화하면, 시계열 데이터 분석이 가능해진다.([2강] 데이터 시각화(Matplotlib을 활용) maplotlib 에서 그래프를 그리는 클래스인 matplotlib.pyplot, 한글주석을 사용하기 위한 클래스인 matplotlib.font_manager, 날짜를 표시하기 위한 클래스인 matplotlib.dates를 import 하여 아래와 같이 그래프를 그리는 코드를 만들어 볼 수 있다.
# 참조 라이브러리
import requests
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib.dates as mdates
...(중략)...
# 한글 폰트 설정 (Windows용): 그래프에서 한글이 깨지지 않도록 함
plt.rcParams["font.family"] = "Malgun Gothic"
# 그래프 크기 설정: 가로 12인치, 세로 6인치
plt.figure(figsize=(12, 6))
# 2년물 국채 수익률 선 그래프 (원형 마커)
plt.plot(df['date'], df['GS2'], label='GS2 (2Y)', marker='o', markersize=2)
# 5년물 국채 수익률 선 그래프 (정사각형 마커)
plt.plot(df['date'], df['GS5'], label='GS5 (5Y)', marker='s', markersize=2)
# 10년물 국채 수익률 선 그래프 (위쪽 삼각형 마커)
plt.plot(df['date'], df['GS10'], label='GS10 (10Y)', marker='^', markersize=2)
# 현재 사용 중인 축(Axes) 객체 가져오기
ax = plt.gca()
# x축 눈금 표시를 매 10개월마다 설정
locator = mdates.MonthLocator(interval=10)
ax.xaxis.set_major_locator(locator)
# x축 눈금 포맷을 "년도-월" 형식으로 설정
formatter = mdates.DateFormatter("%Y-%m")
ax.xaxis.set_major_formatter(formatter)
# 그래프 제목
plt.title("미국 국채 금리 추이 (2년, 5년, 10년)")
# x축 레이블 설정
plt.xlabel("날짜")
# y축 레이블 설정: 회전 없이 왼쪽으로 띄워서 배치
plt.ylabel("금리 (%)", rotation=0, labelpad=40)
# 범례 표시 (label 매개변수에서 지정한 항목)
plt.legend()
# 그래프 출력
plt.show()
코드를 실행해보면 아래 그림 3과 같은 결과를 얻을 수 있다. 2020년부터 전체적으로 금리가 상승했고, 중간에 2년물이 10년물보다 금리가 높아지는 금리역전이 일어나다가 최근에는 다시 2년물 금리 < 5년물 금리 < 10년물 금리의 우상향 하는 금리커브가 나타나는 걸 확인할 수 있다.
전체 코드는 아래와 같이 완성할 수 있다.
import requests
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib.dates as mdates
api_key = "나의 API키"
stdate = "2020-05-11"
eddate = "2025-05-11"
def get_result(api_key: str, stdate: str, eddate: str, series_id: str):
url = "https://api.stlouisfed.org/fred/series/observations"
params={"series_id": series_id,
"api_key": api_key,
"file_type": "json",
"frequency": "m",
"observation_start": stdate,
"observation_end": eddate}
res = requests.get(url, params=params)
res.raise_for_status()
df = pd.DataFrame(res.json()["observations"], columns=["date", "value"])
df.columns = ["date", series_id]
df["date"] = pd.to_datetime(df["date"])
df[series_id] = df[series_id].astype(float)
return df
df_gs10 = get_result(api_key, stdate, eddate, "GS10")
df_gs05 = get_result(api_key, stdate, eddate, "GS5")
df_gs02 = get_result(api_key, stdate, eddate, "GS2")
df = pd.merge(df_gs02, df_gs05, how="inner", on="date")
df = pd.merge(df, df_gs10, how="inner", on="date")
plt.rcParams["font.family"] = "Malgun Gothic"
plt.figure(figsize=(12, 6))
plt.plot(df['date'], df['GS2'], label='GS2 (2Y)', marker='o', markersize=2)
plt.plot(df['date'], df['GS5'], label='GS5 (5Y)', marker='s', markersize=2)
plt.plot(df['date'], df['GS10'], label='GS10 (10Y)', marker='^', markersize=2)
ax = plt.gca()
locator = mdates.MonthLocator(interval=10)
formatter = mdates.DateFormatter("%Y-%m")
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
plt.title("미국 국채 금리 추이 (2년, 5년, 10년)")
plt.xlabel("날짜")
plt.ylabel("금리 (%)", rotation=0, labelpad=40)
plt.legend()
plt.show()
반응형