Pythonでローソク足チャートの表示(matplotlib編)

  • 27
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Pythonでグラフを描画するパッケージはたくさんあるのですが、なかなかローソク足チャートに特化したものはありません。

今回、4本値データから比較的簡単にローソク足チャートが作成できるパッケージとして、matplotlibとPlotlyを試してみました。

準備

本記事のPythonコードは、Jupyter notebookで実行することを前提としています。チャートもJupyter notebookにインライン表示させます。

まずは、2016年6月から2か月分の架空の相場データを作成します。
Pythonでランダムウォーク
を参考に、

%matplotlib inline
import numpy as np
import pandas as pd

idx = pd.date_range('2016/06/01', '2016/07/31 23:59', freq='T')
dn = np.random.randint(2, size=len(idx))*2-1
rnd_walk = np.cumprod(np.exp(dn*0.0002))*100

として、1分間隔のランダムウォークを作り、それからpandasのresample, ohlcを使って4本値データを作成します。

df = pd.Series(rnd_walk, index=idx).resample('B').ohlc()
df.plot()

ここで、resampleの引数'B'は、営業日のみでサンプリングすることを表します。つまり、実際の相場と同様、平日のみのデータとなります。ラインチャートとして表示させると以下のようになります。

index.png

matplotlibを使ったローソク足チャート

matplotlibには、ファイナンス用のツールがあり、そのなかにローソク足チャートを表示させる関数があります。

candlestick2_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種類の関数が用意されています。これらは、4本値データを個別に入力するか、まとめて入力するかが違うのと、4本値の順をOHLCにするか、OCHLにするかが違います。

先ほど作った4本値データは、OHLCのDataFrameクラスとなっているので、ここでは、candlestick_ohlcを使います。

candlestick_ohlcの引数quotesは、x軸データ、Openデータ、Highデータ、Lowデータ、Closeデータが2次元配列の形になっている必要があります。ただし、x軸データとしてdf.indexがそのままでは使えません。そこで、df.indexdatetimeにして、さらに実数値にしたものをOHLCに追加しています。

import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib.dates import date2num

fig = plt.figure()
ax = plt.subplot()

xdate = [x.date() for x in df.index] #Timestamp -> datetime
ohlc = np.vstack((date2num(xdate), df.values.T)).T #datetime -> float
mpf.candlestick_ohlc(ax, ohlc, width=0.7, colorup='g', colordown='r')

ax.grid() #グリッド表示
ax.set_xlim(df.index[0].date(), df.index[-1].date()) #x軸の範囲
fig.autofmt_xdate() #x軸のオートフォーマット

このコードを実行すると、次のようなローソク足チャートが表示されます。

index.png

営業日のみのローソク足チャート

一応、上のチャートはローソク足チャートになっているのですが、ちょっと気になるのが、土日に相当するところに空白があることです。通常、相場のチャートでは、営業日のみがつながっていて土日の部分はありません。

そこで、x軸のデータを細工します。x軸データとしてdf.indexをそのまま使わずに、単に整数のインデックスにします。そして、表示させるx軸の目盛を対応する日時データにします。相場で週の始まりは月曜日なので、目盛は月曜日から5日おきに表示させます。

fig = plt.figure()
ax = plt.subplot()

ohlc = np.vstack((range(len(df)), df.values.T)).T #x軸データを整数に
mpf.candlestick_ohlc(ax, ohlc, width=0.7, colorup='g', colordown='r')

xtick0 = (5-df.index[0].weekday())%5 #最初の月曜日のインデックス
plt.xticks(range(xtick0,len(df),5), [x.strftime('%Y-%m-%d') for x in df.index][xtick0::5])
ax.grid() #グリッド表示
ax.set_xlim(-1, len(df)) #x軸の範囲
fig.autofmt_xdate() #x軸のオートフォーマット

これを実行すると、次のようなチャートになります。

index.png

これで営業日のみが連続するチャートとなりました。ただし、この方法は日足チャート用で、日中足の場合はx軸の目盛を調整する必要があります。

Plotly編は↓
Pythonでローソク足チャートの表示(Plotly編)