pandas_datareaderを使ってデータ取得をいろいろ試してみる

2021.04.15

pandasの拡張モジュールである pandas_datareaderを使うと、株価、為替レート等のデータを簡単に取得できるのでやってみました。

pandas-datareaderとは

Web上の様々なソースにアクセスできるPythonライブラリの1つです。元々はpandas.ioというPandasの一部だったのですが、Pandasの0.19.0からサポートされなくなったらしく、pandas-datareaderが独立したライブラリとなったようです。

インストール

上述したとおり、既存のPython環境にPandasが入っていれば使えるわけではないのでインストールが必要です。

pip install pandas-datareader

取得可能なデータ一覧

Version 0.9.0時点では、以下のサイトからデータを取得できるようです。

  • Tiingo
  • IEX
  • Alpha Vantage
  • Enigma
  • Quandl
  • St.Louis FED (FRED)
  • Kenneth French’s data library
  • World Bank
  • OECD
  • Eurostat
  • Thrift Savings Plan
  • Nasdaq Trader symbol definitions
  • Stooq
  • MOEX
  • Naver Finance

以前のバージョンではYahoo Financeもサポートしていたようですが、仕様が変わって一時期使えなくなった他、

Yahoo!ファイナンスでは、Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為(スクレイピング等)について、システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れがあることから禁止しています

公式のヘルプで明記されています。

※本記事の最後におまけとしてちょっとだけ試してますが、0.7.0以降に再サポートされデータ取得はできる模様。(ドキュメントには反映されていないようです)

データ取得

Google colaboratoryで手軽にやってみる

Pythonの環境構築は様々あるかと思いますが、今回はGoogle Colaboratory**(Google Colab)を利用して手っ取り早くコード実行を見せていきたいと思います。

すでにPythonや機械学習用の開発環境を整えている方はご自身の環境を使ってOKですが、初学者の方かつ環境構築もまだできていない、~~面倒くさい~~方は試してみてはいかがでしょうか。

Google Colabを使えば、環境構築はほぼ不要でブラウザでインターネットアクセスによりすぐにJupiter Notebookを利用できます。概要や使い方は以下のページをご参照ください。

検証用のノートブックを立ち上げたらコードを書いていきます。データの参照先として、今回はAlpha VantageFredを例にやっていきます。

Alpha Vantage

Alpha Vantageのように、データを取得するには無料で申請できるAPIキーを発行する必要があるサイトがあります。Alpha Vantageは、こちらのサポートにアクセスしてメールアドレスを記入するとAPIキーが表示されます。(メールで送られるわけでもなくブラウザ画面上に表示されるので、忘れずにコピーしましよう)

以下のコードをGoogle Colabに入力して実行してみます。(例として、ターゲットの銘柄はApple社「AAPL」とします)

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

start = dt.date(2019,1,1)
end = dt.date(2020,1,1)
code = 'AAPL'
apikey = '取得したAPIキー'

df = web.DataReader(code,'av-daily',start,end, api_key=apikey)

df.head(5)

引数のav-dailyがAlpha Vantageの日次の時系列の株価データです。その他に「av-daily-adjusted -毎日の時系列(調整済み)」「av-weekly -毎週の時系列」など種類がいくつかあるので、必要なものを使い分けることができます。

実際のGoogle Colabの画面と結果はこちら

ついでにSONYも出してみました。

取得できる株価は米ドル表記のようですね。

Alpha Vantageを利用して取得したい銘柄のコード(ティッカーシンボル)は以下サイトで検索するのが良いでしょう。もちろん日経平均やダウ平均など株価指数も取得できます。

https://www.nasdaq.com/market-activity/stocks/screener

Fred

これから紹介するFredはAPIキーの申請をしなくてもデータ取得が利用できます。

取得したいデータのシンボルは以下サイトで検索できます。

https://fred.stlouisfed.org/categories

株価や為替レート以外にも、仮想通貨、GDP、特許数、学術データなどを取得できます。

今回は試しにCoinbase Bitcoinのデータを取得してみましょう。

おまけ

yahoo

2021年4月14日時点でyahoo financeからデータを取得できるか試してみました。

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

start = dt.date(2019,1,1)
end = dt.date(2020,1,1)

df_ntt = web.DataReader('9432.T',"yahoo",start,end)
df_kddi = web.DataReader('9433.T',"yahoo",start,end)

NTTとKDDIのコードでやってみたら普通に取れました。APIアクセスそのものはできるようです。せっかくなので2社をPlotしてみました。

その他に、yahoo-dividendsで配当実績や、get_quote_yahooでPER、空売り比率などの通常ならスクレイピングが必要となりそうなデータまで取得できました。

しかし前述のとおりYahooファイナンスはスクレイピング禁止なのでpandas_datareaderでも使用は控えた方がよいかもしれません。

データの出力

pandas_datareaderで取得したデータはPandasのDataframeに格納されるので、同じくcsvファイル出力できます。

以下のコードでcsvかつGzip圧縮し、指定のS3バケットへ保存してみます。

import boto3
import io
import gzip
import pandas as pd
import datetime as dt
import pandas_datareader.data as web

region = '対象リージョン'
bucket = 'S3バケット名'
prof = 'aws configureに保存してある対象アカウントのプロフィール名'
session = boto3.Session(region_name=region, profile_name=prof) 

s3 = session.resource('s3')   

\# main
def main():

    start = dt.date(2020,1,1)
    end = dt.date(2021,1,1)
    code = 'NIKKEI225'

    outkey = 'pandas/stock/' + code + '/price/' + str(start.year) + '/price_get' + str(start) + '.csv.gz'
    outobj = s3.Object(bucket, outkey)

    df= web.DataReader(code,"fred",start,end)

​    buf = io.BytesIO()
​    with gzip.GzipFile(fileobj=buf, mode='w') as fh_w:
​        df.to_csv(io.TextIOWrapper(fh_w, 'utf8'))
​    outobj.put(Body=buf.getvalue())

if __name__ == "__main__":
​    main()

まとめ

pandas-datareaderで国際指標のデータを取得して自分なりのデータセットを作るのに便利だなと思い触ってみましたが、こんなに簡単なコードで出来てしまうって素晴らしい!

次回は取得したデータを加工、ローソク足チャートグラフの作成などをやってみようと思います。

次の動画