Pythonでの時系列データの扱い7 〜 まとめ(WEBからの株価データ取得、プロット、移動平均の作成)
これまで「Pythonでの時系列データ」について学習してきたが、そのまとめ。
これまでの内容は下記。
1.Pythonでの時系列データの扱い1 〜 文字列とdatetimeの変換
2.Pythonでの時系列データの扱い2 〜 時系列データの作成および選択
3.Pythonでの時系列データの扱い3 〜 時系列データの頻度設定
4.Pythonでの時系列データの扱い4 〜 「祝日の取得」および「祝日を考慮した営業日の取得」
5.Pythonでの時系列データの扱い5 〜 タイムスタンプから期間への変換
6.Pythonでの時系列データの扱い6 〜 データの再サンプリング(ダウンサンプリングとアップサンプリング)
本日は下記の流れで学習して纏めとする(予定)。
1.WEBから株価データを取得
1−1.単一銘柄の株価データ取得
1−2.複数銘柄の株価データ取得
2.株価データを横軸を時間とした折れ線グラフにする
2−1.単純にplot
2−2.それぞれの株価を1つずつ別々のチャートに表示する
2−3.特定の日付の範囲のみをプロットする
3.時系列データに対するローリング処理(例:移動平均やヒストリカルボラティリティの計算)
1.WEBから株価データを取得
WEBから株価データを取得するために、pandasのライブラリを使用する。
以前は、「import pandas.io.data as web」として「web.DataReader」で取得できていたが、実行すると下記エラー。
"The pandas.io.data module is moved to a separate package " ImportError: The pandas.io.data module is moved to a separate package (pandas-datareader). After installing the pandas-datareader package (https://github.com/pandas-dev/pandas-datareader), you can change the import ``from pandas.io import data, wb`` to ``from pandas_datareader import data, wb``.
というわけで、pandas-datareaderをインポート。これで準備は整った。
※)インポートする際は、「import pandas_datareader」とする。ハイフンではなく、アンダーバーが使われていることに注意・・・。名前は揃えろよと思ったw。でも、作ってくれたことに感謝。
1−1.単一銘柄の株価データ取得
まずは
#coding:utf-8 import numpy as np import pandas as pd import pandas_datareader.data as pdd stock = pdd.DataReader( 'GOOG', data_source='google', start='2006/1/1', end='2016/12/2' ) print stock
実行結果は下記。2006年の出来高は無いようだ。それは良いとして、調整後終値が無い。
なぜ?
Open High Low Close Volume
Date
2006-01-03 211.05 217.62 208.90 217.40 NaN
2006-01-04 221.73 224.26 219.66 222.40 NaN
2006-01-05 222.78 225.55 220.53 225.39 NaN
2006-01-06 228.21 235.01 226.39 232.60 NaN
・・・・・・・・・・・・・
2016-11-25 764.26 765.00 760.52 761.68 587421.0
2016-11-28 760.00 779.53 759.80 768.24 2188151.0
2016-11-29 771.53 778.50 768.24 770.84 1616618.0
2016-11-30 770.07 772.99 754.83 758.04 2392890.0
2016-12-01 757.44 759.85 737.02 747.92 3017947.0
2016-12-02 744.59 754.00 743.10 750.50 1452484.0
調整終値が取得されないことは一旦置いといて、今度は株価のみならず分割情報が取得できるか確認。
今度は、Alphabetではなく、フォード(tickerはF)について実行してみる。データソースはgoogleではなくyahooにしてみる。
#coding:utf-8 import numpy as np import pandas as pd import pandas_datareader.data as pdd # tickerの設定 tickerName = 'F' # 株価取得 stockY = pdd.DataReader( tickerName, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) print stockY # コーポレートアクションの取得 ca = pdd.DataReader( tickerName, data_source='yahoo-actions', start='2006/1/1', end='2016/12/2' ) print ca
結果は次。
株価は取得できており、調整株価も取得できている。
データソースがyahooだと調整株価終値も提供されているが、googleの場合は提供されていないようだ。
Open High Low Close Volume Adj Close
Date
2006-01-03 7.72 7.83 7.66 7.83 16903100 6.304546
2006-01-04 7.83 8.08 7.82 8.01 35623400 6.449479
2006-01-05 8.05 8.40 8.03 8.35 31978000 6.723239
2006-01-06 8.30 8.66 8.27 8.52 40420800 6.860120
・・・・・・・・・・・・・
2016-11-30 11.97 12.14 11.92 11.96 47646200 11.960000
2016-12-01 12.23 12.80 12.18 12.43 95143600 12.430000
2016-12-02 12.58 12.58 12.15 12.24 38601600 12.240000
コーポレートアクションも次のように取得できた。
action value
2016-10-25 DIVIDEND 0.150
2016-07-26 DIVIDEND 0.150
2016-04-27 DIVIDEND 0.150
2016-01-27 DIVIDEND 0.400
2015-10-28 DIVIDEND 0.150
・・・・・・・・・・・・・
2012-01-27 DIVIDEND 0.050
2006-07-31 DIVIDEND 0.050
2006-04-28 DIVIDEND 0.100
2006-01-26 DIVIDEND 0.100
次は、複数銘柄を取得してみる。
1−2.複数銘柄の株価データ取得
tickerに単一銘柄のtickerを文字列として渡すのではなく、複数銘柄のtickerを文字列のリストとして渡す。
取得の際は、欲しいデータの種類(OpenなのかCloseなのか)をキーとして指定し、次にtickerをキーとして指定する。
#coding:utf-8 import pandas_datareader.data as pdd # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # 取得した株価のprint表示 for ticker in tickerList: print ticker print stocks['Adj Close'][ticker]
実行結果は次。
ticker= F
Date
2006-01-03 6.304546
2006-01-04 6.449479
2006-01-05 6.723239
・・・・・・・・・
2016-11-30 11.960000
2016-12-01 12.430000
2016-12-02 12.240000
Name: F, dtype: float64ticker= AAPL
Date
2006-01-03 9.726565
2006-01-04 9.755191
2006-01-05 9.678420
・・・・・・・・・
2016-11-30 110.519997
2016-12-01 109.489998
2016-12-02 109.900002
Name: AAPL, dtype: float64ticker= GS
Date
2006-01-03 113.396301
2006-01-04 111.830030
2006-01-05 111.786038
・・・・・・・・・
2016-11-30 219.289993
2016-12-01 226.630005
2016-12-02 223.360001
Name: GS, dtype: float64
2.株価データを横軸を時間とした折れ線グラフにする
先程取得した株価をチャートにしてみる。
2−1.単純にplot
#coding:utf-8 import pandas_datareader.data as pdd # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # plot stocks['Adj Close'].plot()
2−2.それぞれの株価を1つずつ別々のチャートに表示する
グラフの作成については以前作成したエントリーを参考にする。
・Pythonでのプロットと可視化(matplotlib編) 〜 1.基本と概要
・Pythonでのプロットと可視化(matplotlib編) 〜 2.図とサブプロット
・Pythonでのプロットと可視化(matplotlib編) 〜 3−1.図の設定(余白、色、マーカー、線種)
・Pythonでのプロットと可視化(matplotlib編) 〜 3−2.図の設定(目盛り、ラベル、凡例、注釈)
ソースは次。
#coding:utf-8 import pandas_datareader.data as pdd import matplotlib.pyplot as plt # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # 取得した株価に対する操作 fig = plt.figure() # グラフ描画領域の作成 point = 1 # 描画するサブプロットの位置を示す変数 for ticker in tickerList: ax = fig.add_subplot(1, 3, point) # サブプロットの作成 ax.plot(stocks['Adj Close'][ticker]) # グラフ描画 ax.set_title(ticker) # グラフタイトル point += 1
2−3.特定の日付の範囲のみをプロットする
日付範囲をインデックス参照で指定する。
例えば、2016年のデータのみをプロットするには次のようにする。
#coding:utf-8 import pandas_datareader.data as pdd import matplotlib.pyplot as plt # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # チャート表示 stocks['Adj Close'].ix['2016'].plot()
四半期ごとのデータを表示するには次のようにする。
#coding:utf-8 import pandas_datareader.data as pdd import matplotlib.pyplot as plt # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # チャート表示 stocks['Adj Close'].resample('Q-DEC', fill_method='ffill').ix['2015':].plot()
なお、resampleメソッドのオプションで「fill_method='ffill'」などと指定することは必須。
こうすることで、resampleメソッドの戻り値がDataFrame型となる。
指定しないとDatetimeIndexResampler型で戻ってきてixによる期間指定ができなくなくて次のエラーとなる。
ValueError: .resample() is now a deferred operation
use .resample(...).mean() instead of .resample(...)
3.時系列データに対するローリング処理(例:移動平均の計算)
20日移動平均を描いてみる。
簡単で、「pd.rolling_mean(stocks['Adj Close'], 20)」によって20日移動平均の計算結果がpandas.DataFrameとなって戻ってくるので、それをplotするだけ。
#coding:utf-8 import pandas_datareader.data as pdd import matplotlib.pyplot as plt import pandas as pd # tickerリストの指定 tickerList = ['F', 'AAPL', 'GS'] # 指定したtickerリストの株価を取得 stocks = pdd.DataReader( tickerList, data_source='yahoo', start='2006/1/1', end='2016/12/2' ) # 移動平均の描画 pd.rolling_mean(stocks['Adj Close'], 20).plot()
以上。
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (19件) を見る