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をクリックして、必要事項を入力していきます。
Create New Accountを選択します。
登録できたらログインして、右上のMyAccountというメニューをクリックします。その中のAPI keysをクリックします。
Request API KeyをクリックしてAPIキーを取得します。
何に使うのか聞かれるので、利用目的などを記入します。(審査などはありません)
入力後、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で確認できます。