【Python金融データ】Federal Reserve Economic Data (FRED)の使い方

投資・ファイナンス

Federal Reserve Economic Data (FRED)とは?

FRED(Federal Reserve Economic Data)は、米国の連邦準備制度の経済データベースです。
非常に多くの経済データを無料で取得することができます。
114 のソース から823,000 件の米国および国際時系列を ダウンロードできます。
それぞれの指標についてグラフも見れるので、Pythonでデータを取得するだけでなく、単純に経済データを調べたいときにも便利です。
かなり古いデータもあるので、長期のヒストリカルデータを取得できます。
トップ

pandas_datareaderを使ったデータ取得

FREDのデータはpandas_datareaderを用いて簡単に取得可能です。
例えばGDPのデータを取得したい場合は、以下のようにして、取得可能です。

import pandas_datareader.data as web
import datetime

# 'GDP'(Gross Domestic Product)のデータ
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2024, 6, 10)
gdp = web.DataReader('GDP', 'fred', start, end)

gdp

複数の指標をまとめて、取得することも可能です。

# 複数のシリーズを取得
inflation = web.DataReader(['CPIAUCSL', 'CPILFESL'], 'fred', start, end)
inflation 

TIckerの検索方法

pandas_datareaderを使って、簡単にデータを取得できることが確認できましたが、取得したい経済指標のTickerはどのように調べるとよいのでしょうか。
例えば、失業率のデータがほしい場合を考えます。
検索もしくは、その下のキーボードでUnemployment rateを検索します。
検索

検索結果が出たら、取得したい指標の詳細ページを選択します。今回は一番上を選択しました。
検索結果

詳細ページの指標名の横にある文字列がTickerになります。
詳細ページ

あるいは、このページのURLの最後の部分になります。
https://fred.stlouisfed.org/series/UNRATE
今回の場合は、「UNRATE」です。

web.DataReader('UNRATE', 'fred')

このようにして取得可能です。

APIの取得方法

FREDはAPIを提供しているので、まずは、登録して、APIキーを取得します。
こちらのページのRequest or view your API keysをクリックして、必要事項を入力していきます。
API取得
Create New Accountを選択します。
登録

登録できたらログインして、右上のMyAccountというメニューをクリックします。その中のAPI keysをクリックします。
APIキー

Request API KeyをクリックしてAPIキーを取得します。
Request

何に使うのか聞かれるので、利用目的などを記入します。(審査などはありません)
申請

入力後、registerをクリックすると、画面上部にAPIキーが表示されますので、メモしておきましょう。

PythonでAPIを使ってデータ取得

APIを使って、GDPを取得してみます。

import pandas as pd
import requests

# GDPデータのシリーズID (アメリカの実質国内総生産のシリーズIDは 'GDP')
series_id = 'GDP'

# FRED APIのURL
url = f'https://api.stlouisfed.org/fred/series/observations'

# APIリクエストのパラメータ
params = {
    'series_id': series_id,
    'api_key': api_key,
    'file_type': 'json'
}

# APIリクエストを送信
response = requests.get(url, params=params)

# レスポンスをJSON形式で取得
data = response.json()

# GDPデータをデータフレームに変換
observations = data['observations']
df = pd.DataFrame(observations)
df[['date','value']]

過去公表時点の経済指標データを取得する

経済指標を使った分析を行う上で、非常に大きなハードルとなるのが、過去に手に入る経済指標の数値と、現在手に入れられるヒストリカルの経済指標データは実は値が行るという問題です。
これは、経済指標の多くは発表後2か月ほどして、修正させることが多いため、今、手に入れられるデータは、修正前のデータではなく、修正後のデータのみということがよく起こり得ます。
この場合、バックテストを行う際に、現在手に入るデータを使ってしまうと、修正値を使用することになり、本来は使えない情報を使ってしまうことになってしまいます。

しかし、FREDのデータはrealtime_start,realtime_endの指定によって、いつ時点のデータかを区別することができます。
(vintage_datesによって指定することも可能です)

公開時点の数値と、直近値を取得するコードを書いてみます。

# GDPデータのシリーズID (アメリカの実質国内総生産のシリーズIDは 'GDP')
series_id = 'GDP'

# FRED APIのURL
url = f'https://api.stlouisfed.org/fred/series/observations'

# 最初の公開時点のデータを取得するためのパラメータ
params_initial = {
    'series_id': series_id,
    'api_key': api_key,
    'file_type': 'json',
    'realtime_start': '2020-01-01',  # 過去日付
    'realtime_end': '2024-05-30'     # 直近の日付
}

# 最新の修正値を取得するためのパラメータ
params_latest = {
    'series_id': series_id,
    'api_key': api_key,
    'file_type': 'json',

}

# 最初の公開時点のデータを取得
response_initial = requests.get(url, params=params_initial)
data_initial = response_initial.json()
observations_initial = data_initial['observations']
df_initial = pd.DataFrame(observations_initial)
# realtime_startが最も小さい行だけを残す
df_initial['realtime_start'] = pd.to_datetime(df_initial['realtime_start'])
df_initial = df_initial.loc[df_initial.groupby('date')['realtime_start'].idxmin()]
df_initial = df_initial[['date', 'value']]
df_initial.rename(columns={'value': 'initial_value'}, inplace=True)

# 最新の修正値を取得
response_latest = requests.get(url, params=params_latest)
data_latest = response_latest.json()
observations_latest = data_latest['observations']
df_latest = pd.DataFrame(observations_latest)
df_latest = df_latest[['date', 'value']]
df_latest.rename(columns={'value': 'latest_value'}, inplace=True)

# 最初の公開値と最新の修正値を結合
df_combined = pd.merge(df_initial, df_latest, on='date', how='left')

上記のコードでは公開時点の数値をrealtime-period startが最も小さいものとして選択していますが、
FRED APIにあらかじめ用意されている、公開時点の最初の数値のみ返すoutput_typeを指定することでも対応できます。


# APIリクエストのパラメータ
params = {
    'series_id': series_id,
    'api_key': api_key,
    'file_type': 'json',
    'realtime_start': '2020-01-01',  # 過去日付
    'realtime_end': '2024-05-30',     # 直近の日付
    'output_type':4,
}

# APIリクエストを送信
response = requests.get(url, params=params)

# レスポンスをJSON形式で取得
data = response.json()

# GDPデータをデータフレームに変換
observations = data['observations']
df = pd.DataFrame(observations)
df

output_typeは次の4パターンです。
1 = Observations by Real-Time Period
2 = Observations by Vintage Date, All Observations
3 = Observations by Vintage Date, New and Revised Observations Only
4 = Observations, Initial Release Only

今回は主要な使い方を紹介しましたが、他にも様々なデータを取得できるので、その一覧については概要を次回まとめたいと思います。

今回のコードはこちらのGoogleColabで確認できます。

タイトルとURLをコピーしました