Python 3 - mpl-finance OHLC チャートを作成する

目次

休日を考慮した OHLC チャート

休日を考慮した OHLC チャート (OHLC chart) を作成するためには、 mpl_finance モジュールの plot_day_summary_ohlc 関数 (または plot_day_summary_oclh) を使います。

ここで、 plot_day_summary_ohlc 関数の必須な引数は ax, quotes の 2 つです。

オプション引数については、 ticksize, colorup, colordown が有ります。

ここで注意として、 mpl-finance 0.10.0 時点では plot_day_summary_oclh 関数で描画したそれぞれの線の太さが均一になっていません。

気になるようであれば、 plot_day_summary_oclh 関数で取得した Line2D リストの各オブジェクトのプロパティを変更することで、 線の太さを均一にできます。

Example

source code

import mpl_finance
import numpy

from matplotlib import dates
from matplotlib import pyplot
from datetime import datetime as DateTime
from matplotlib.dates import DateFormatter

def make_mpl_dates(year, month, day):
    return dates.date2num(DateTime(year, month, day))

# time, open, high, low, close, volume
quotes = numpy.array([
    [make_mpl_dates(2019, 1, 14), 90, 105, 85, 100, 1000],
    [make_mpl_dates(2019, 1, 15), 110, 110, 110, 110, 1100],
    [make_mpl_dates(2019, 1, 16), 125, 125, 115, 120, 1200],
    [make_mpl_dates(2019, 1, 17), 120, 140, 120, 140, 1300],
    [make_mpl_dates(2019, 1, 18), 130, 145, 130, 135, 1200],
    [make_mpl_dates(2019, 1, 21), 125, 125, 110, 110, 1100],
    [make_mpl_dates(2019, 1, 22), 115, 120, 90, 105, 900],
    [make_mpl_dates(2019, 1, 23), 110, 115, 100, 110, 1100],
    [make_mpl_dates(2019, 1, 24), 130, 135, 125, 125, 1400],
    [make_mpl_dates(2019, 1, 25), 120, 140, 115, 135, 1500]])

fig = pyplot.figure()
ax = fig.add_subplot(1, 1, 1)

ticksize = 8
colorup = "deeppink"
colordown = "blue"
mpl_finance.plot_day_summary_ohlc(ax, quotes, ticksize,
                                              colorup,
                                              colordown)

# 線の太さを均一にしたい場合は、
# ↑の plot_day_summary_ohlc を削除して、
# ↓の plot_day_summary_ohlc と for の # を削除する

# lines = mpl_finance.plot_day_summary_ohlc(ax, quotes, ticksize,
#                                                       colorup,
#                                                       colordown)
# for l in lines:
#     l.set_linewidth(1.0)
#     l.set_markeredgewidth(2.0)

ax.xaxis.set_major_formatter(DateFormatter("%Y-%m-%d"))
ax.grid(color="lightgray")

fig.autofmt_xdate(rotation=90, ha="center")
pyplot.tight_layout()
pyplot.savefig("ohlc_chart_plot_day_summary_ohlc.png")

result

実行結果

休日を詰めた OHLC チャート

休日 (及び出来高なしの日) を詰めた OHLC チャート (OHLC chart) を作成するためには、 mpl_finance モジュールの plot_day_summary2_ohlc 関数 (または plot_day_summary2_ochl) を使います。

ここで、 plot_day_summary2_ohlc 関数の必須な引数は ax, opens, highs, lows, closes の 5 つです。

オプション引数については、 ticksize, colorup, colordown が有ります。

ここで注意点として、 mpl-finance 0.10.0 時点では plot_day_summary2_ohlc, plot_day_summary2_ochl 関数で OHLC チャートを作成する時、 「始値 (open)」と「終値 (close)」が等しい時の色が colordown で指定したものになっています。

気になるようであれば、 終値のそれぞれの値に見た目に影響が出ない程度の数値 (例えば 0.001) を足すことで、 始値と終値が等しい時でも colorup で指定した色にすることができます。

Example

source code

import mpl_finance
import numpy

from matplotlib import dates
from matplotlib import pyplot
from datetime import datetime as DateTime
from matplotlib.ticker import Formatter

class MyIndexDateFormatter(Formatter):
    def __init__(self, times, fmt):
        self.times = times
        self.fmt = fmt

    def __call__(self, x, pos=None):
        index = int(x)
        if index < 0 or index >= len(self.times):
            return ""
        else:
            t = dates.num2date(self.times[index])
            return t.strftime(self.fmt)

def make_mpl_dates(year, month, day):
    return dates.date2num(DateTime(year, month, day))

# time, open, high, low, close, volume
quotes = numpy.array([
    [make_mpl_dates(2019, 1, 14), 90, 105, 85, 100, 1000],
    [make_mpl_dates(2019, 1, 15), 110, 110, 110, 110, 1100],
    [make_mpl_dates(2019, 1, 16), 125, 125, 115, 120, 1200],
    [make_mpl_dates(2019, 1, 17), 120, 140, 120, 140, 1300],
    [make_mpl_dates(2019, 1, 18), 130, 145, 130, 135, 1200],
    [make_mpl_dates(2019, 1, 21), 125, 125, 110, 110, 1100],
    [make_mpl_dates(2019, 1, 22), 115, 120, 90, 105, 900],
    [make_mpl_dates(2019, 1, 23), 110, 115, 100, 110, 1100],
    [make_mpl_dates(2019, 1, 24), 130, 135, 125, 125, 1400],
    [make_mpl_dates(2019, 1, 25), 120, 140, 115, 135, 1500]])

times = quotes[:, 0]
opens = quotes[:, 1]
highs = quotes[:, 2]
lows = quotes[:, 3]
closes = quotes[:, 4]

fig = pyplot.figure()
ax = fig.add_subplot(1, 1, 1)

ticksize = 8
colorup = "deeppink"
colordown = "blue"
mpl_finance.plot_day_summary2_ohlc(ax,
                                   opens,
                                   highs,
                                   lows,
                                   closes,
                                   # closes + 0.001,
                                   ticksize,
                                   colorup,
                                   colordown)
formatter = MyIndexDateFormatter(times, "%Y-%m-%d")
ax.xaxis.set_major_formatter(formatter)
ax.grid(color="lightgray")

fig.autofmt_xdate(rotation=90, ha="center")
pyplot.tight_layout()
pyplot.savefig("ohlc_chart_plot_day_summary2_ohlc.png")

result

実行結果

参考リンク