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: float64

ticker= 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: float64

ticker= 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を使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理