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