matplotlibでローソク足を描画する

Python+金融 プロジェクト

yahooファイナンスから4本値が取得できるので、ローソク足チャートを描画してみたいと思います。

こんなチャートを描きます。

スポンサーリンク

準備

毎度おなじみのライブラリをimportします。

>>> import pandas as pd
>>> import pandas_datareader as web
>>> import matplotlib.pyplot as plt

matplotlib にはファイナンス用の関数が用意されていて、ローソク足もそんなに労力をかけることなく描画できます。

andlestick2_ochl(ax, opens, closes, highs, lows, width=4, colorup='k', colordown='r', alpha=0.75)
candlestick2_ohlc(ax, opens, highs, lows, closes, width=4, colorup='k', colordown='r', alpha=0.75)
candlestick_ochl(ax, quotes, width=0.2, colorup='k', colordown='r', alpha=1.0)
candlestick_ohlc(ax, quotes, width=0.2, colorup='k', colordown='r', alpha=1.0)

4本値の順番違いがちょっとややこしいですね。
ということで、finance用のモジュールをimportしてみます。

>>> import matplotlib.finance as mpf
/home/yyatsuo/.pyenv/versions/3.6.3/lib/python3.6/site-packages/matplotlib/cbook/deprecation.py:106: MatplotlibDeprecationWarning: The finance module has been deprecated in mpl 2.0 and will be removed in mpl 2.2. Please use the module mpl_finance instead.
  warnings.warn(message, mplDeprecation, stacklevel=1)

将来的にmpl_financeに置き替えるよーという警告が出ましたが、とりあえずはこれでOK。
それから、データ加工に必要なライブラリもimportしておきます。

>>> from matplotlib.dates import date2num
>>> import numpy as np

データの取得と加工

いつものfredではなく、yahooファイナンスからデータを取ってきます。
このデータは、Open(始値) High(高値) Low(安値) Close(終値) AdjClose(調整後終値) Volume(出来高) の DataFrame になっていますので、不要なCloseとVolumeをdropしておきます。

>>> N225 = web.DataReader('^N225', 'yahoo', '2017').dropna().drop(columns=['Close', 'Volume'])

これで、Open(始値) High(高値) Low(安値) AdjClose(調整後終値) の DateFrame ができあがりました。

X軸に使用する日付を datetime 形式に変換します。

>>> xdate = [x.date() for x in N225.index]

さらに実数にする必要があるみたいです。

>>> ohlc = np.vstack((date2num(xdate), N225.values.T)).T

ここまでできたら作図します。

>>> fig = plt.figure()
>>> ax = plt.subplot()
>>> mpf.candlestick_ohlc(ax, ohlc, width=0.7, colorup='g', colordown='r')
>>> ax.grid()

X軸にちゃんと日付が表示されるように、表示範囲を決めて、自動フォーマットするようにします。

>>> ax.set_xlim(N225.index[0].date(), N225.index[-1].date())
>>> fig.autofmt_xdate()

で、あとは表示。

>>> plt.show()

Yahooは連続アクセスするとすぐに制限されるみたいなので、頻繁にアクセスが必要な場合は別のソースを使った方が良いみたいですね。

まとめ

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import pandas as pd
import pandas_datareader as web
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
import numpy as np
from matplotlib.dates import date2num
 
def displayCandle():
    N225 = web.DataReader('^N225', 'yahoo', '2017/1/1').dropna().drop(columns=['Close', 'Volume'])
    fig = plt.figure()
    ax = plt.subplot()
    xdate = [x.date() for x in N225.index]
    ohlc = np.vstack((date2num(xdate), N225.values.T)).T
    mpf.candlestick_ohlc(ax, ohlc, width=0.7, colorup='g', colordown='r')
    ax.grid()
    ax.set_xlim(N225.index[0].date(), N225.index[-1].date())
    fig.autofmt_xdate()
    plt.show() # 画像表示
 
if __name__ == "__main__":
    displayCandle()
スポンサーリンク

フォローする