Pythonでローソク足チャートの表示（matplotlib編）

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

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

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

まずは、2016年6月から２か月分の架空の相場データを作成します。
[Pythonでランダムウォーク](http://qiita.com/toyolab/items/6535420f5ef637a4d2e8)
を参考に、

````py
%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
````

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

````py
df = pd.Series(rnd_walk, index=idx).resample('B').ohlc()
df.plot()
````
ここで、`resample`の引数`'B'`は、営業日のみでサンプリングすることを表します。つまり、実際の相場と同様、平日のみのデータとなります。ラインチャートとして表示させると以下のようになります。

![index.png](https://qiita-image-store.s3.amazonaws.com/0/131169/ef1b9ed6-ce57-917c-f3e6-79bb2bb5364e.png)

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

matplotlibには、[ファイナンス用のツール](http://matplotlib.org/api/finance_api.html)があり、そのなかにローソク足チャートを表示させる関数があります。

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

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

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

````py
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](https://qiita-image-store.s3.amazonaws.com/0/131169/1f2c2d82-1d2c-e383-45ea-1c48880f86be.png)


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

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

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

````py
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](https://qiita-image-store.s3.amazonaws.com/0/131169/cd53f553-7b50-a744-dd0a-fb9495564e6a.png)

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

Plotly編は↓
[Pythonでローソク足チャートの表示（Plotly編）](http://qiita.com/toyolab/items/db8a1e539d4f995079d5)