pandas_datareader.dataのDataReaderを使用して株価を取得する 〜 pandas.Panel型で取得したデータ構造からpandas.Panel.minor_xsを使用して特定の銘柄のDataFrameを取得する
これ、以前に「Pythonでの時系列データの扱い7 〜 まとめ(WEBからの株価データ取得、プロット、移動平均の作成)」で同様のことを実施して、yahoo financeやgoogleから株価データを取得した。
実は1つだけ分からないことがあったけど、そのまま放置していた。それは次のこと。
pandas_datareader.data.DataReader()で単一銘柄を取得すると、戻り値がpandas.DataFrameとなる。
しかし、複数銘柄を取得すると、戻り値がpandas.Panelとなる。この時、銘柄名(ticker)を指定して、特定の銘柄データを取得する方法が分からなかった。
今回分かったのでメモしておく。
まずは復習。
◎tickerを1つ指定し、特定の銘柄を1つ取得する
次のように書くと、アップルの株価がpandas.DataFrame型として取得される。
#coding:utf-8 import numpy as np import pandas as pd import datetime import pandas_datareader.data as pdd # 期間設定 date_from = datetime.date(2016, 9, 1) date_to = datetime.date(2016, 9, 6) # 単一銘柄の取得 aapl = pdd.DataReader('AAPL', "yahoo", date_from, date_to) print "AAPL" print aapl
実行結果は次のようになる。
※)改行されていることに注意。
AAPL
Open High Low Close Volume \
Date
2016-09-01 106.139999 106.800003 105.620003 106.730003 26701500
2016-09-02 107.699997 108.000000 106.820000 107.730003 26802500
2016-09-06 107.900002 108.300003 107.510002 107.699997 26880400Adj Close
Date
2016-09-01 106.184827
2016-09-02 107.179719
2016-09-06 107.149865
◎tickerをリストで複数指定し、複数の銘柄を取得する
次のように書くと、アップルとマイクロソフトの株価がpandas.Panel型として取得される。
#coding:utf-8 import numpy as np import pandas as pd import datetime import pandas_datareader.data as pdd # 期間設定 date_from = datetime.date(2016, 9, 1) date_to = datetime.date(2016, 9, 6) # 複数銘柄の取得 tickerList = ['AAPL', 'MSFT'] stocksPanel = pdd.DataReader( tickerList, data_source='yahoo', start=date_from, end=date_to )
ここで、取得した複数の銘柄のうち、特定の銘柄(例えば、AAPL)の株価データを取得する方法が分からなかった。
試しに、「stocksPanel['AAPL']」として見るものの、これはキーが存在しないというエラーとなる。
次に、「stocksPanel['Close']」としてみると、これは複数の銘柄の終値がpandas.DataFrame型として取得される。
#coding:utf-8 import numpy as np import pandas as pd import datetime import pandas_datareader.data as pdd # 期間設定 date_from = datetime.date(2016, 9, 1) date_to = datetime.date(2016, 9, 6) # 複数銘柄の取得 tickerList = ['AAPL', 'MSFT'] stocksPanel = pdd.DataReader( tickerList, data_source='yahoo', start=date_from, end=date_to ) # printデバッグ print stocksPanel['Close']
実行結果は次。
AAPL MSFT
Date
2016-09-01 106.730003 57.590000
2016-09-02 107.730003 57.669998
2016-09-06 107.699997 57.610001
それでは特定の銘柄の株価を取得するにはどうすればよいのか。
結論は「pandas.Panel.minor_xs」を使用する。
コードは次の様にする。
#coding:utf-8 import numpy as np import pandas as pd import datetime import pandas_datareader.data as pdd # 期間設定 date_from = datetime.date(2016, 9, 1) date_to = datetime.date(2016, 9, 6) # 複数銘柄の取得 tickerList = ['AAPL', 'MSFT'] stocksPanel = pdd.DataReader( tickerList, data_source='yahoo', start=date_from, end=date_to ) # pandas.Panelから単一銘柄の株価を取得する aaplFromPanel = stocksPanel.minor_xs('AAPL') print "aaplFromPanel" print aaplFromPanel msftFromPanel = stocksPanel.minor_xs('MSFT') print "msftFromPanel" print msftFromPanel
実行結果は次の通り。
aaplFromPanel
Open High Low Close Volume \
Date
2016-09-01 106.139999 106.800003 105.620003 106.730003 26701500.0
2016-09-02 107.699997 108.000000 106.820000 107.730003 26802500.0
2016-09-06 107.900002 108.300003 107.510002 107.699997 26880400.0Adj Close
Date
2016-09-01 106.184827
2016-09-02 107.179719
2016-09-06 107.149865
msftFromPanel
Open High Low Close Volume Adj Close
Date
2016-09-01 57.009998 57.820000 57.009998 57.590000 26075400.0 57.203558
2016-09-02 57.669998 58.189999 57.419998 57.669998 18900500.0 57.283019
2016-09-06 57.779999 57.799999 57.209999 57.610001 16278400.0 57.223424