pandas_datareaderでPython分析に使える金融データを取得しよう

投資・ファイナンス

今回はPythonを使って金融データを分析するにあたってまず必要となるデータ収集の部分を扱っていきます。Pythonで金融データを取得する方法はいくつかありますがその中でも様々なデータソースを使えて比較的簡単に実装ができる、pandas_datareaderを使った方法を紹介していきます。

pandas_datareaderとは?

pandas_datareaderは、Pythonのデータ処理ライブラリであるPandasを使用して、さまざまなオンラインデータソースから金融データを簡単に取得するための便利なツールです。

自分で考えた戦略を試すためにPythonを使うためには、まずは、分析に使うためのデータを集める必要があります。株価、為替レート、経済指標などのリアルタイムまたは過去のデータが必要となってきます。
そのための方法はいくつかありますが、pandas_datareaderは、簡単なPythonコードを使ってデータを自動的に取得できるので、特に最初のデータ分析の一歩で使うデータソースとしておすすめです。

最終更新は2021年7月13日(2024年6月時点)のため、一部使えなくなっている部分もありますが、概ね使用可能です。

pandas_datareaderを使うメリット

  1. 多様なデータソースへのアクセス: Quandl、FREDなど、さまざまなオンラインソースからデータを取得できます。これにより、株価、為替、経済指標、財務諸表情報など、さまざまなデータを取得できます。

  2. 簡単な操作と柔軟性: 一部のデータソースを除いて、基本的に同じようなコードの書き方になるので、データ取得が比較的簡単に行えます。

  3. Pandasとの親和性: pandas_datareaderは、PandasのDataFrameオブジェクトを返すので、データの処理、変換、分析が非常に容易に行えます。

データソース

データソース データの系統 APIキー 取得データ種類 おすすめ度
AlphaVantage 価格データ、財務データ、経済データ 必要 株価、為替レート、仮想通貨、オプションなどの価格、経済指標、財務データ等 ★★★★★
Stooq.com 価格データ 不要 株価など ★★★★☆
Tiingo 金融データ、株式 必要 株価、取引情報 ★★★☆☆
Nasdaq Data Link(Quandl) 価格データ、経済データ 、財務データ 必要 株価、経済指標、各種統計データ ★☆☆☆☆ (無料利用できるデータが少ない)
Yahoo Finance 金融データ、株式、為替、仮想通貨 不要 株価、為替レート、商品価格、経済指標等 ★★★★☆
Naver Finance 金融データ、株式 不要 株価、取引情報 ★★☆☆☆
Federal Reserve Economic Data (FRED) 経済データ、統計データ 不要 経済指標、統計データ ★★★★★

| Econdb | 経済データ、統計データ | 不要 | 経済指標、統計データ | ★★★★☆ |
| Bank of Canada | 金融データ、経済データ | 不要 | 経済指標、金融データ | ★★★☆☆ |
| World Bank | 経済データ、統計データ | 不要 | 経済指標、統計データ | ★★★★☆ |
| OECD | 経済データ、統計データ | 不要 | 経済指標、統計データ | ★★★☆☆ |
| Fama-French Data (Ken French’s Data Library) | 金融データ、研究データ | 不要 | 株価データ、ポートフォリオデータ | ★★★★★ |
| Enigma | 経済データ、統計データ | 必要 | 経済指標、統計データ | ★★★☆☆ |

| Thrift Savings Plan (TSP) | 投資データ | 不要 | 投資信託の価格データ | ★★☆☆☆ |
| Moscow Exchange (MOEX) | 金融データ、株式 | 必要 | 株価、取引情報 | ★★☆☆☆ |
| NASDAQ | 金融データ、株式 | 必要 | 株価、取引情報 | ★★★☆☆ |
| The Investors Exchange (IEX)| 金融データ、株式 | 必要 | 株価、取引情報 | ★★★★☆ |
| Eurostat | 統計データ、経済データ | 不要 | 統計データ、経済指標 | ★★★☆☆ |

基本的な使い方

データソースによってややコードの書き方が異なる場合がありますが、多くの場合web.DataReaderを用いてデータ取得が可能です。
例えば、StooqでのS&Pの価格データを取得したい場合

 import pandas_datareader.data as web
df = web.DataReader('^SPX', 'stooq')

のように実行できます。
必要に応じてモジュールはインストールしてください。

pip install pandas_datareader

web.DataReader('^SPX', 'stooq')の部分は基本的に、
web.DataReader('銘柄コードなど', 'データソース名')となります。

その他、2020/1/1~2023/12/31までのように期間を指定したい場合は、追加で引数を渡すことができます。
その他api_keyの必要なデータソースの場合はapi_key=''としてAPIキーも追加します。

 import pandas_datareader.data as web
df = web.DataReader('^SPX', 'stooq','2020-01-01','2023-12-31')

価格や個別銘柄関連のデータソース

AlphaVantage

Alpha Vantageは、株式や外国為替、財務データ、経済データなど幅広い金融データを提供するプラットフォームです。APIキーを取得するために無料登録が必要ですが、無料でかなり多くのデータを取得できます。一部のデータやたくさんのデータを取得するには、プレミアム登録が必要になりますが、多くの機能は無料で利用できます。

from datetime import datetime
import pandas_datareader.data as web

df = web.DataReader("GOOGL", "av-daily",api_key=api_key)

Tiingo

Tiingoは、株式、投資信託、ETFなどの価格データを提供するトレーディングプラットフォームです。無料のアカウントを作成し、APIキーを取得することで、TiingoのデータAPIにアクセスできます。ただし、無料アカウントはレート制限があり、同時に取得できるシンボル数に制限があります(現在は月に500シンボル)。以前は以下のようにしてpandas_datareaderでデータ取得ができたようですが、現在はエラーが発生します。公式ドキュメントに従って、requestモジュールなどでデータを取得すれば通常通り取得が可能です。

エラー発生

import os
import pandas_datareader as pdr

# 'GOOG'(Googleの株式)の過去の終値データを取得
df = pdr.get_data_tiingo('GOOG', api_key=api_key)
df

以下はpandas_datareaderを使わずアクセスする場合です。

import requests
headers = {
    'Content-Type': 'application/json'
}
start_date='2024-01-02'
ticker = 'aapl'
requestResponse = requests.get(f"https://api.tiingo.com/tiingo/daily/{ticker}/prices?startDate={start_date}&token={api_key}", headers=headers)
print(requestResponse.json())

Stooq

Stooqはポーランドを拠点とする金融データの提供サイトになります。
APIを使うことなくデータをダウンロードできるので、気軽にデータをダウンロードできるのが特徴です。
日本の株価データも取得可能です。

例えば、pandas_datareaderを使って以下のようにトヨタの株価を取得できます。

import pandas_datareader as  web
from  dateutil.relativedelta  import  relativedelta
from  datetime  import  date
date_e  =  date.today()
date_s  =  date_e  -  relativedelta(years=1)
stooq  =  web.stooq.StooqDailyReader('7203.JP', start=date_s, end=date_e).read()

stooq

Yahoo Finance

Yahoo Financeは普段利用される方も多いのではないでしょうか。以前はpandas_datareaderで取得できていたようですが、2024年6月時点ではエラーが発生して使えなくなっています。

現在はエラーの発生する例
例えば、General Electric(GE)の株価データをダウンロードする例です

import pandas_datareader.data as web
import pandas as pd
import datetime as dt

# Yahoo FinanceからGeneral Electric(GE)のデータをダウンロード
start_date = dt.datetime(2019, 9, 10)
end_date = dt.datetime(2019, 10, 9)
ge_data = web.DataReader('GE', 'yahoo', start=start_date, end=end_date)

# データを表示
ge_data

Quandl

Quandlは、株式、ETFなどの日次の金融データを提供するプラットフォームでしたが、現在はNasdaq Data Linkとなっています。
symbolはDB名と銘柄名の2つの部分から構成されます。
銘柄名はDB名によって異なりますが、WIKI(米国の株式)の場合は一般的なティッカーシンボルを使用できます。

サンプルコード:

import pandas_datareader.data as web

# 株価データ
symbol = 'WIKI/AAPL'
df = web.DataReader(symbol, 'quandl', '2015-01-01', '2021-03-05', api_key=api_key)
df

Nasdaq Data LinkでAPIを取得すれば上記のようにしてデータの取得は可能ですが、2018年頃までしかデータが取れませんので、注意が必要です。

Naver Financeは、韓国株式市場(KOSPI、KOSDAQ)のヒストリカルデータを取得できます。

以下は、韓国のSamsung Electronics(005930)の株価データをダウンロードする例です

import pandas_datareader.data as web

# Naver FinanceからSamsung Electronics(005930)のデータをダウンロード
samsung_data = web.DataReader('005930', 'naver', start='2019-09-10')

samsung_data

Tickerは個別銘柄詳細ページの銘柄名の横、もしくは、URLのcodeの数字になります。
URLがhttps://finance.naver.com/item/main.naver?code=005930であれば、005930がcodeになります。
Ticker

経済指標中心のデータソース

Federal Reserve Economic Data (FRED)

FRED(Federal Reserve Economic Data)は、米国の連邦準備制度の経済データベースです。
非常に多くの経済データを無料で取得することができます。

例えば、次のようにして、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

Econdb

Econdbは、90以上の公式統計機関から経済データを提供するプラットフォームです。Pythonで一部データにアクセス可能ですが、無制限のアクセスには有料APIが必要です。

2024年6月現在ではpandas_datareaderによるデータ取得はエラーとなってしまいます。
APIを取得すればデータ取得は可能です。

サンプルコード(エラーとなる)

import os
import pandas_datareader.data as web

# 'RGDPUS'(米国の実質GDP)のデータを取得
f = web.DataReader('ticker=RGDPUS', 'econdb')
f.head()

Bank of Canada

Bank of Canada(カナダ銀行)はカナダの中央銀行です。
カナダ銀行は”Valet API”と呼ばれるWebAPIを公開しています。今回はこのWebAPIを利用してカナダ銀行のデータにアクセスしてみます。Valet APIを利用することで、為替レートや金融データを取得することができます。
Valet APIに関する公式ドキュメントはこちらになります。
pandas_datareaderを用いることで、比較的簡単にデータ取得が可能です。JPYCADの為替データを取得してみます。

import pandas_datareader as pdr

# JPY/CAD
data = pdr.bankofcanada.BankOfCanadaReader('FXJPYCAD').read()
data

World Bank

World Bankは、世界の開発指標(World Development Indicators)と呼ばれるパネルデータシリーズの数千を提供しています。

以下のようにして、World Bankのデータを取得できます。

from pandas_datareader import wb

# GDP per capita in constant dollarsの検索
matches = wb.search('gdp.*capita.*const')

# データのダウンロード
dat = wb.download(indicator='NY.GDP.PCAP.KD', country=['US', 'CA', 'MX'], start=2005, end=2008)

dat

OECD

OECDでは、金融データに関わらず様々なデータを公開しています。経済、金融、エネルギー、政府、環境、教育など様々なジャンルがあるので、幅広いデータの取得ができます。ただし、多くのデータは四半期あるいは年次での更新になるので、長期的な見通しを考えるための参考材料とはなりますが、日々の投資判断に使うのは少し不向きかもしれません。

取得対象のデータベース名がわかっていれば、以下のように取得できます。
人口データを取得する例になります。

import pandas as pd
import datetime as dt
import pandas_datareader.data as web
start_time = dt.datetime(2000, 1, 1)
end_time = dt.datetime(2022, 2, 1)
df = web.DataReader('HISTPOP', 'oecd', start_time, end_time)

その他

Fama-French Data (Ken French’s Data Library)

Fama/French Data Libraryは、ファイナンス分野でよく用いられる、ファーマフレンチのファクターモデルと呼ばれるモデルのデータがダウンロードできます。いわゆるファクターと呼ばれるリターンの値が取得できるサイトです。
業種や地域ごとにデータが提供されています。

以下のようにして、Fama/French Data Libraryからデータセットを取得できます。

from pandas_datareader.famafrench import get_available_datasets
import pandas_datareader.data as web

# 利用可能なデータセットを取得
available_datasets = get_available_datasets()
print(available_datasets)

取得可能なデータセットの一覧を表示できます。
その中から、一般的なファクターモデルのデータを取り出してみます。
df[0]が月次データになります。

df = web.DataReader('F-F_Research_Data_Factors', 'famafrench')
df[0]

Enigma

Enigmaは米国企業に関する詳細情報を提供しているデータプラットフォームです。
以前はpandas_datareaderから取得できていたようですが、2024年6月現在はできず、APIを用いて取得が可能です。

サンプルコード(エラーが発生)

import os
import pandas_datareader as pdr

# '292129b0-1275-44c8-a6a3-2a0881f24fe1'(USDA Food Recalls 1996 Data)のデータを取得
df = pdr.get_data_enigma('292129b0-1275-44c8-a6a3-2a0881f24fe1', os.getenv('ENIGMA_API_KEY'))

print(df.columns)

取得できなかったデータソース

Thrift Savings Plan (TSP)

Thrift Savings Plan(TSP)は、アメリカ合衆国の年金のようなファンドのデータに以前はアクセスできていたようですが、現在はデータは取得できないようです。

Moscow Exchange (MOEX)

モスクワ取引所がヒストリカルデータを公開しているようですが、pandas_datareaderではpandasの新しいバージョンではエラーが発生するようになっていたので、今回、以下のコードはうまく実行できませんでした。
Pandasのバージョンがpandas_datareaderの要件と一致していれば動く可能性があります。
Moscow Exchange(MOEX)は、歴史的なデータを提供しています。

import pandas_datareader as pdr

# MOEXからUSD000UTSTOMとMAGNのデータをダウンロード
moex_data = pdr.get_data_moex(['USD000UTSTOM', 'MAGN'], '2020-07-02', '2020-07-07')

NASDAQ

Nasdaq Trader Symbol Definitionsは、Nasdaqの最新の銘柄リストを提供するデータソースですが、2024年6月時点ではエラーとなり、データを取得することはできませんでした。

以下はエラー発生したコードになりますが、この関数で、以前は取得できていたようです。

from pandas_datareader.nasdaq_trader import get_nasdaq_symbols

# Nasdaqのシンボル情報を取得
symbols = get_nasdaq_symbols()

The Investors Exchange (IEX)

IEX(Investors Exchange)は、APIを使って、様々な金融データを取得することができます。ただし、2024年8月31日でサービス提供を終了するということでしたので、今回は使用しないことにしました。

公式ページ

Eurostat

Eurostatは、欧州連合の統計情報を提供する公式統計機関です。Pandas DataReaderを使用してEurostatのデータにアクセスできます。データセットIDを指定して、対応するデータを取得できます。

2024年6月現在ではpandas_datareaderによるデータ取得はエラーとなってしまいます。

サンプルコード:

import pandas_datareader.data as web

# 'tran_sf_railac'データセットからデータを取得
df = web.DataReader('tran_sf_railac', 'eurostat')

# データの表示
print(df)
タイトルとURLをコピーしました