【Python】Plotlyでローソク足チャートを描く

プログラミング
この記事は約13分で読めます。

以前の投稿で、株価データを取得する記事を書きました。
【Python】スクレイピングで株価データを取得する
今回はPythonを用いて、取得した株価データのローソク足チャートを描く方法を書きたいと思います。
Pythonで描画するときの有名なモジュールとしてMatplotllibというものがありますが、今回はもっと見た目が良い感じで可視化できるPlotlyというモジュールを使って描きたいと思います。

スポンサーリンク

Plotlyのインストール

まずはPlotlyをインストールします。他のモジュールと同じように以下のpip installコマンドでインストールできます。pipがよくわからない方はこちらをご覧ください。
Pythonの始め方④ pipとは?Pythonを便利に利用するためのpipの理解

$ pip install plotly==4.3.0

「== 4.3.0」の部分はなくても良いのですが、2019年11月24日現在の最新バージョンのものを指定してインストールしています。たまに古いバージョンだと動かなかったりするので。

モジュールのインストール

必要なモジュールをインストールします。今回はpandas、numpy、plotlyになります。
plotlyはグラフを描くときは基本的にplotly.graph_objectsというのをインポートするようです。
また、plotly.graph_objectsという名前は長いので、goという名前をつけることが多いようです。
なので、下記のようにimport plotly.graph_objects as goとしています。

import pandas as pd
import numpy as np
import plotly.graph_objects as go

株価データの読み込み

株価データの読み込みですが、【Python】スクレイピングで株価データを取得するの記事で書いた方法などで、株価の時系列データがcsvで取得できていることを前提とします。

df = pd.read_csv('任意のファイル名.csv')
df.head()

以下のようなデータフレームになっていることを想定とします。

株価データの編集

今回は終値調整の値と出来高は使用しないので削除します。あと、特に深い意味はありませんが、ちょっと列名を英語表記に変えておきます。

不要な列の削除

不要な列の削除は以下のように記述できます。axis = 1というのが列を削除という意味です。

df = df.drop(['出来高','終値調整'], axis = 1)

列名の変更

日付、始値、高値、安値、終値をdate、open、high、low、closeに変更します。

df.columns = ['date', 'open', 'high', 'low', 'close']
df.head()

以下のようなデータフレームが出来上がっているかと思います。

Plotlyでローソク足チャートを描く

では、上記のデータを使ってさっそくPlotlyでローソク足チャートを描きたいと思います。
公式サイトも充実しているので、そちらも参考にしていただければと思います。

plotlyの関数の構成は基本的には図のように、Figureという箱の中にdataとlayoutという箱があり、更にdataの中に複数の系列データを入れていく構成です。
今回は1つの株価データしかいれないので、tradeの数は1つだけです。

ローソク足チャートを描く

ローソク足チャートの系列データを描くときは、go.Candlestickという関数を使います。
※普通の散布図や折れ線グラフを描くときはgo.Scatterという関数です。

go.Candlestickはローソク足チャートに特化した関数なので、引数は、x、始値、高値、安値、終値の5つを引数とします。

特にレイアウトを気にせずにとりあえずチャートを描いてみましょう。
以下のようなコードになります。

fig = go.Figure(
         data= [go.Candlestick(
                   x = df['date'], 
                   open=df['open'],
                   high=df['high'],
                   low=df['low'],
                   close=df['close'])
         ]
)
fig.show()

すると以下のようなチャートが出力されるかと思います。

これでも良いように思えるのですが、下のスライドバーを動かして拡大してみると、休場の日のチャートに隙間ができてしまっていることがわかります。

気持ち悪いので、この隙間を埋めたいと思います。

休場の日を無視してローソク足チャートを描く

この休場の日に隙間ができてしまうのは、x軸に日付データを使用しているためです。plotlyのgo.Candlestickの関数は日付データっぽいデータが来るとすべて日付に変換して描いてしまいます。

なので、作戦としては、x軸は0からデータの個数まで1ずつ増えていく数列にしてしまい、x軸ラベルの表記を日付に変えるという方法にします。

x軸の表記の変更はlayoutで記述します。
x軸ラベルを変更する場合はxaxisという辞書の中で、tickvalsにx軸の数値、ticktextにその数値に対応する文字を設定します。

以下のようなコードになります。

x = np.arange(len(df['date'])) #x軸を0からデータの個数まで1ずつ増える数列
labels = df['date'] #x軸ラベルを日付にする

fig = go.Figure(
        data=[go.Candlestick(
                x=x,
                open=df['open'],
                high=df['high'],
                low=df['low'],
                close=df['close'])
             ],
        layout = go.Layout(
                xaxis = dict(
                    tickvals = x,
                    ticktext = labels,
                ),
        )
)
fig.show()

すると以下のような図になってしまいます。休場の隙間はなくなっていますが、すべての日付を表示させてしまっているので、x軸の文字が見えなくなってしまいます。

ということで、一定間隔でx軸を表示させるようにしましょう。

表示間隔を設定できるようにintervalという変数で設定します。そして、それに対応する日付だけを取り出してticktextに設定します。

以下のようなコードになります。

#step3
x = np.arange(len(df['date']))

interval = 20 #表示間隔
vals = [df.index[i*interval] for i in range(len(df)//interval+1)] #表示させるx軸
labels = [df.loc[i*interval,'date'] for i in range(len(df)//interval +1)] #表示させるx軸の日付

fig = go.Figure(
        data=go.Candlestick(
                x = x,
                open=df['open'],
                high=df['high'],
                low=df['low'],
                close=df['close']),
        layout = go.Layout(
                xaxis = dict(
                    tickvals = vals,
                    ticktext = labels,
                    tickangle=-45 #x軸ラベルを-45度回転させる
                ),
        )
)
fig.show()

上記を実行すると下図が得られるはずです。ついでにlayoutのところでtickangleを設定し、x軸ラベルを-45度回転させています。

これで無事完了と行きたいところですが、実はチャートにマウスを当てるとhoverと言って、そのローソク足における値が表示されます。
ところがx軸の表示を日付にしているところ以外は以下の図のように数値のままになってしまっています。

これは、dataの中のhovertextとhoverinfoというもので設定します。
ちょっとややこしいのでコードを書いてしまいます。

x = np.arange(len(df['date']))

interval = 20
vals = [df.index[i*interval] for i in range(len(df)//interval+1)]
labels = [df.loc[i*interval,'date'] for i in range(len(df)//interval +1)]

fig = go.Figure(
        data=go.Candlestick(
                x = x,
                open=df['open'],
                high=df['high'],
                low=df['low'],
                close=df['close'],
                hovertext= ['date:{}<br>open:{}<br>high:{}<br>low:{}<br>close:{}'
                                   .format(df.loc[i,'date'],df.loc[i,'open'],df.loc[i,'high'],df.loc[i,'low'],df.loc[i,'close']) for i in range(len(df))] ,
                hoverinfo="text"),
        layout = go.Layout(
                xaxis = dict(
                    ticktext = labels,
                    tickvals = vals,
                    tickangle=-45
                ),
        )
)
fig.show()

これを実行すると以下のように無事どこの箇所でも日付の表示になっているはずです。

まとめコード

以上がPlotlyによるローソク足チャートの描き方になります。
最後にまとめのコードを書いておきます。参考になった場合はポチッとしておいていただけるとうれしいです。

 にほんブログ村 IT技術ブログへ
import pandas as pd
import numpy as np
import plotly.graph_objects as go

df = pd.read_csv('任意のファイル名.csv')
df = df.drop(['出来高','終値調整'], axis = 1)
df.columns = ['date', 'open', 'high', 'low', 'close']

x = np.arange(len(df['date']))

interval = 20
vals = [df.index[i*interval] for i in range(len(df)//interval+1)]
labels = [df.loc[i*interval,'date'] for i in range(len(df)//interval +1)]

fig = go.Figure(
        data=go.Candlestick(
                x = x,
                open=df['open'],
                high=df['high'],
                low=df['low'],
                close=df['close'],
                hovertext= ['date:{}<br>open:{}<br>high:{}<br>low:{}<br>close:{}'
                                   .format(df.loc[i,'date'],df.loc[i,'open'],df.loc[i,'high'],df.loc[i,'low'],df.loc[i,'close']) for i in range(len(df))] ,
                hoverinfo="text"),
        layout = go.Layout(
                xaxis = dict(
                    ticktext = labels,
                    tickvals = vals,
                    tickangle=-45
                ),
        )
)
fig.show()

おすすめ書籍

これからpythonを始めるという方はこちらの本がおすすめです。

コメント

タイトルとURLをコピーしました