ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (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()
    반응형
Designed by Tistory.