본문 바로가기

MLOps/Development

금융 전문가 Agent - Fred API (3)

경제 데이터가 필요할 때는 Fred API를 사용하면 됨

무료로 사용 가능


가장 먼저 사용해 본 건 Tags,

  • 엔드 포인트는 fred/tags/series
  • CPI 관련 데이터를 보고 싶었음


 

Response는 내가 원하는 값은 아니었음 

나는 정확히 "미국 근원 소비자 물가지수" 데이터가 필요했기 때문에


이런 지수 값들을 보려면,

엔드포인트 =fred/series/observations를 확인하면 됐다


원하는 데이터의 시리즈 ID만 넣어주면 됨

시리즈 ID는 웬만하면 챗GPT가 알고 있었음

import requests


# 미국 CPI 및 근원 CPI 시리즈 ID
CPI_ID = "CPIAUCSL"  # 미국 일반 CPI
CORE_CPI_ID = "CPILFESL"  # 미국 근원 CPI (식료품·에너지 제외)

# CPI 데이터의 Release ID (CPI는 Release ID 10번)
RELEASE_ID = 10  # CPI 발표 일정

# FRED API URL

#  CPI 데이터 가져오기 (전년 동월 대비 YoY%, 전월 대비 MoM% 포함)
def get_cpi_data(series_id, units=None):
    params = {
        "api_key": FRED_API_KEY,
        "file_type": "json",
        "series_id": series_id,
        "observation_start": "2024-01-01",
        "observation_end": "2025-01-01",
        "sort_order": "desc",
        "limit": 12  # 최근 12개월 데이터 조회
    }
   
    if units:  # 변환 옵션 적용 (YoY 또는 MoM)
        params["units"] = units
   
    response = requests.get(BASE_URL, params=params)
   
    if response.status_code == 200:
        return response.json()["observations"]
    else:
        print(f"Error: {response.status_code}, {response.text}")
        return []

#  CPI 발표 일정 가져오기
def get_cpi_release_dates():
    params = {
        "api_key": FRED_API_KEY,
        "file_type": "json",
        "release_id": RELEASE_ID,
        "sort_order": "desc",
        "limit": 12  # 최근 12개월 발표 일정 가져오기
    }
    response = requests.get(RELEASE_URL, params=params)
   
    if response.status_code == 200:
        return [release["date"] for release in response.json()["release_dates"]]
    else:
        print(f"Error: {response.status_code}, {response.text}")
        return []

#  데이터 가져오기 (CPI 값, YoY, MoM)
cpi_data = get_cpi_data(CPI_ID)  # 일반 CPI 값
cpi_yoy_data = get_cpi_data(CPI_ID, units="pc1")  # 일반 CPI 전년 동월 대비 상승률(%)
cpi_mom_data = get_cpi_data(CPI_ID, units="pch")  # 일반 CPI 전월 대비 상승률(%)

core_cpi_data = get_cpi_data(CORE_CPI_ID)  # 근원 CPI 값
core_cpi_yoy_data = get_cpi_data(CORE_CPI_ID, units="pc1")  # 근원 CPI 전년 동월 대비 상승률(%)
core_cpi_mom_data = get_cpi_data(CORE_CPI_ID, units="pch")  # 근원 CPI 전월 대비 상승률(%)

release_dates = get_cpi_release_dates()  # CPI 발표 일정 가져오기

#  발표 일정 개수가 부족하면 "N/A"로 채우기
while len(release_dates) < len(cpi_data):
    release_dates.append("N/A")  # 부족한 발표 일정은 "N/A" 처리

# 데이터 출력 (CPI + 발표일정 포함)
print("\n 미국 CPI 및 전년 동월 대비(YoY %) & 전월 대비(MoM %) 변화율 (최근 12개월)")
for i in range(len(cpi_data)):
    print(f"데이터 기준 월: {cpi_data[i]['date']}, CPI: {cpi_data[i]['value']}, CPI YoY: {cpi_yoy_data[i]['value']}%, CPI MoM: {cpi_mom_data[i]['value']}%, 발표일: {release_dates[i]}")

print("\n 미국 근원 CPI 및 전년 동월 대비(YoY %) & 전월 대비(MoM %) 변화율 (최근 12개월)")
for i in range(len(core_cpi_data)):
    print(f"데이터 기준 월: {core_cpi_data[i]['date']}, 근원 CPI: {core_cpi_data[i]['value']}, 근원 CPI YoY: {core_cpi_yoy_data[i]['value']}%, 근원 CPI MoM: {core_cpi_mom_data[i]['value']}%, 발표일: {release_dates[i]}")


근데 시리즈 ID 틀릴 때가 있는데,  그럴 때는 직접 검색

자세히 검색하지 않고 그냥 "core cpi" 정도만 검색하면 시리즈 ID 찾을 수 있다


발표일 데이터를 같이 받았음

발표일 엔드포인트는 RELEASE_DATES_ENDPOINT = "/fred/release/dates"

지표 발표 후, 시장 반응 같은 정보들을 위해 날짜를 같이 가져왔다.


근데 개별 릴리즈 데이트를 가져오려면 release_id 가 필요한데, 

ChatGPT 선생님이 release_id는 계속 틀리게 알려줌

#  PCE 발표 일정 가져오기
def get_pce_release_dates():
    params = {
        "api_key": FRED_API_KEY,
        "file_type": "json",
        "release_id": RELEASE_ID,
        "sort_order": "desc",
        "limit": 12  # 최근 12개월 발표 일정 가져오기
    }
    response = requests.get(RELEASE_DATES_URL, params=params)
    # return response
    if response.status_code == 200:
        return [release["date"] for release in response.json()["release_dates"]]
    else:
        print(f"Error: {response.status_code}, {response.text}")
        return []

그래서 직접 찾아야 함

엔드포인트는 RELEASES_DATES_ENDPOINT = "/fred/releases/dates"

release/dates 아님


여기로 요청하면, 설정한 기간 내에 발표한 데이터 이름과 릴리즈 ID 모두 볼 수 있음

import requests


# FRED API URL

#  FRED 발표 일정 데이터 가져오기
def get_all_release_dates():
    params = {
        "api_key": FRED_API_KEY,
        "file_type": "json",
        "realtime_start": "2024-01-01",
        "realtime_end": "9999-12-31",
        "limit": 1000,  # 최대 1000개 데이터 가져오기
        "order_by": "release_date",
        "sort_order": "desc"
    }
    response = requests.get(RELEASES_DATES_URL, params=params)
   
    if response.status_code == 200:
        return response.json()
    else:
        print(f"Error: {response.status_code}, {response.text}")
        return None

# 실행
release_dates = get_all_release_dates()

# 결과 출력
if release_dates:
    for release in release_dates["release_dates"]:
        print(f"Release Date: {release['date']}, Release ID: {release['release_id']}, Release Name: {release['release_name']}")

나는 PCE의 Release ID가 필요했고, 이는  Personal Income and Outlays 보고서에 포함


미국 미시간대 인플레이션 기대치 값도 가져오려고 했다

import requests

# 미시간 대학교 기대 인플레이션 시리즈 ID
MICH_EXP_INFLATION_ID = "MICH"

# FRED API URL

# 📌 API 요청 함수 (최신 데이터 포함)
def get_michigan_inflation_data():
    params = {
        "api_key": FRED_API_KEY,
        "file_type": "json",
        "series_id": MICH_EXP_INFLATION_ID,
        "observation_start": "2024-01-01",  # 시작일 유지
        "observation_end": "2025-02-01",  # 최신 데이터 포함하도록 변경
        "sort_order": "desc",  # 최신 데이터 먼저 가져오도록 변경
        "limit": 100  
    }
    response = requests.get(BASE_URL, params=params)

    if response.status_code == 200:
        return response.json()["observations"]
    else:
        print(f"Error: {response.status_code}, {response.text}")
        return []

#  데이터 가져오기
mich_data = get_michigan_inflation_data()

#  보기 쉽게 출력
print("\n 미시간 대학교 소비자 인플레이션 기대치 (최신 포함)\n")
print(f"{'날짜':<12} {'기대 인플레이션 (%)':<10}")
print("=" * 30)

for entry in mich_data:
    date = entry["date"]
    value = entry["value"]
    print(f"{date:<12} {value:<10}")

일단 특징은 

  • 미시간대 인플레이션 기대치는 월에 2번 발표가 됨
  • 처음 발표되는 것은 예비치, 두 번째 발표되는 것은 확정치
  • Response 값들은 확정치임

결과값
출처 : 인베스팅 닷컴


하지만, 25년 1월 데이터가 발표됐는데 응답 데이터에는 없었음


그래서 좀 추측을 해보면, 확정치 발표가 1월 25일에 됐는데

업데이트가 1월 24일이라 데이터를 받지 못한 건가?..