pandas.DataFrame型で保持した株価データの可視化2 〜 ローソク足の作成
「pandas.DataFrame型で保持した株価データの可視化1」の続き。
株価データをローソク足で描くのが今回のテーマ。
最初にソースコードを載せて、次に解説していく。
その前に今回使用する主なAPIの紹介と、それに関する注意点を述べておく。
◎今回使用する主なAPI
・matplotlib.finance
※)「This module is deprecated in 1.4 and will be moved to mpl_toolkits or it’s own project in the future.」と書いてあり、これはdeprecatedされる(された?)らしい。
※)今回は動いたのでそのまま使用したが、そのうち変更が必要となる。
・matplotlib.finance.candlestick_ohlcを使用してローソク足を描くが、引数の型が決まっているので、その仕様に合わせて元データを変換する必要がある。
※)株価データquotesはtupleで渡す。
※)株価データの時間timeは「float days format」で無ければならない。そのため、date2numを使用してTimeStamp型の日付をfloat型へ変換しなければならない。
#coding:utf-8 import pandas as pd import datetime as dt import pandas_datareader.data as pdd import matplotlib.pyplot as plt import matplotlib.dates as mdates from matplotlib.dates import DateFormatter from matplotlib.dates import (WeekdayLocator, MONDAY) from matplotlib.finance import candlestick_ohlc ######## Define Method ######## def getMultiStockData(tickerList, date_from, date_to): def getStockData(ticker): stockData = pdd.DataReader(ticker, 'yahoo', date_from, date_to) return stockData datas = map(getStockData, tickerList) return pd.concat(datas, keys=tickerList, names=['Ticker', 'Date']) ######### 処理######### # 期間設定 date_from = dt.date(2016, 1, 24) date_to = dt.date(2016, 10, 6) # 株価取得 tickerList = ['AAPL', 'MSFT', 'IBM'] multiStockData = getMultiStockData(tickerList, date_from, date_to) # 終値を取得 adjClosingPrice = multiStockData[['Adj Close']] adjClosingPrice = adjClosingPrice.reset_index() # pandas.DataFrameをpivotingする adjClosingPriceTable = adjClosingPrice.pivot( index='Date', columns='Ticker', values='Adj Close' ) ######### ローソク足の作成 ######### # 株価を指定部分だけ取り出す slicedStockDataSet = multiStockData.loc['AAPL'].loc['2016-5':'2016-12'].reset_index() # matplotlib.finance.candlestick_ohlcの仕様に合わせたデータの用意 # Timestamp型のdateをpydatetime関数を利用してfloatに変換し、date_numカラムに格納する slicedStockDataSet['date_num'] = slicedStockDataSet['Date'].apply(lambda date: mdates.date2num(date.to_pydatetime())) # Dateではなく、Dateカラムfloatに変換したdate_numカラムを使用して、株価データをtupleで作成し直す。tupleに変換するのもmatplotlib.finance.candlestick_ohlcの仕様に合わせるため subset_as_tuples = [tuple(x) for x in slicedStockDataSet[ ['date_num', 'Open', 'High', 'Low', 'Close']].values ] # フォーマット変換 week_formatter = DateFormatter('%b %d') # e.g., Jan 12 mondays = WeekdayLocator(MONDAY) # major ticks on the mondays # 描画領域の作成 fig, ax = plt.subplots() # 軸の設定 ax.xaxis.set_major_locator(mondays) ax.xaxis.set_major_formatter(week_formatter) # ローソク足の作成 candlestick_ohlc( ax = ax, quotes = subset_as_tuples, width=0.6, colorup='b', colordown='r' )
◎ポイント1 〜 Timestamp型のdateをpydatetime関数を利用してfloatに変換し、date_numカラムに格納する
# Timestamp型のdateをpydatetime関数を利用してfloatに変換し、date_numカラムに格納する slicedStockDataSet['date_num'] = slicedStockDataSet['Date'].apply(lambda date: mdates.date2num(date.to_pydatetime()))
◎ポイント2 〜 Dateではなく、Dateカラムfloatに変換したdate_numカラムを使用して、株価データをtupleで作成し直す
# Dateではなく、Dateカラムfloatに変換したdate_numカラムを使用して、株価データをtupleで作成し直す。tupleに変換するのもmatplotlib.finance.candlestick_ohlcの仕様に合わせるため subset_as_tuples = [tuple(x) for x in slicedStockDataSet[ ['date_num', 'Open', 'High', 'Low', 'Close']].values ]
◎ポイント3 〜 日付フォーマット変換
# フォーマット変換 week_formatter = DateFormatter('%b %d') # e.g., Jan 12 mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
以上。
次のblogでも同じことがされている。
・[http://d.hatena.ne.jp/noazoh/20091023/1256293199:title=[Python][matplotlib]グラフに挑戦(2) ローソク足グラフ]
・Python3 入門:matplotlib でローソク足の表示 pandas numpy