-
(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 활용 참조)
그림1: 데이터 병합 과정 아래 코드와 같이 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")
그림2: 데이터 merge 결과 데이터 시각화: 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년물 금리의 우상향 하는 금리커브가 나타나는 걸 확인할 수 있다.
그림3; 금리데이터 그래프 전체 코드는 아래와 같이 완성할 수 있다.
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()
반응형'금융퀀트 > 프로그램기초' 카테고리의 다른 글
(OpenAPI)NAVER API 사용: 검색 API 활용하기(python) (0) 2025.07.22 (OpenAPI)NAVER API 사용: 어플리케이션 등록 및 API키 발급 (0) 2025.07.19 (OpenAPI)FRED API 사용: 미국금리 시계열 분석 1(python) (1) 2025.05.14 (OpenAPI)FRED API 사용 (0) 2025.05.11 (OpenAPI)NOTION API 사용: 데이터 입력(파이썬활용) (1) 2024.06.23