今回はPythonを使って金融データを分析するにあたってまず必要となるデータ収集の部分を扱っていきます。Pythonで金融データを取得する方法はいくつかありますがその中でも様々なデータソースを使えて比較的簡単に実装ができる、pandas_datareaderを使った方法を紹介していきます。
pandas_datareaderとは?
pandas_datareaderは、Pythonのデータ処理ライブラリであるPandasを使用して、さまざまなオンラインデータソースから金融データを簡単に取得するための便利なツールです。
自分で考えた戦略を試すためにPythonを使うためには、まずは、分析に使うためのデータを集める必要があります。株価、為替レート、経済指標などのリアルタイムまたは過去のデータが必要となってきます。
そのための方法はいくつかありますが、pandas_datareaderは、簡単なPythonコードを使ってデータを自動的に取得できるので、特に最初のデータ分析の一歩で使うデータソースとしておすすめです。
最終更新は2021年7月13日(2024年6月時点)のため、一部使えなくなっている部分もありますが、概ね使用可能です。
pandas_datareaderを使うメリット
-
多様なデータソースへのアクセス: Quandl、FREDなど、さまざまなオンラインソースからデータを取得できます。これにより、株価、為替、経済指標、財務諸表情報など、さまざまなデータを取得できます。
-
簡単な操作と柔軟性: 一部のデータソースを除いて、基本的に同じようなコードの書き方になるので、データ取得が比較的簡単に行えます。
-
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
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になります。
経済指標中心のデータソース
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)