Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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編)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした