pandas_datareaderを使ってデータ取得をいろいろ試してみる
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 Vantage
、Fred
を例にやっていきます。
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で国際指標のデータを取得して自分なりのデータセットを作るのに便利だなと思い触ってみましたが、こんなに簡単なコードで出来てしまうって素晴らしい!
次回は取得したデータを加工、ローソク足チャートグラフの作成などをやってみようと思います。