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'
は、営業日のみでサンプリングすることを表します。つまり、実際の相場と同様、平日のみのデータとなります。ラインチャートとして表示させると以下のようになります。
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.index
をdatetime
にして、さらに実数値にしたものを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軸のオートフォーマット
このコードを実行すると、次のようなローソク足チャートが表示されます。
営業日のみのローソク足チャート
一応、上のチャートはローソク足チャートになっているのですが、ちょっと気になるのが、土日に相当するところに空白があることです。通常、相場のチャートでは、営業日のみがつながっていて土日の部分はありません。
そこで、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軸のオートフォーマット
これを実行すると、次のようなチャートになります。
これで営業日のみが連続するチャートとなりました。ただし、この方法は日足チャート用で、日中足の場合はx軸の目盛を調整する必要があります。
Plotly編は↓
Pythonでローソク足チャートの表示(Plotly編)