PlotlyとCufflinksでローソク足チャートを描く
Plotlyとはデータ可視化のためのプラットフォームです。
Pythonだけでなく、RやJavaScriptなどにも対応しています。オンラインモードだと無料アカウントを作る必要がありますが、外部公開しない設定にする場合には課金されます。ただし、オフラインで使う場合、特にアカウント作る必要はありません。
Plotlyを使うと、このような(↓)いろいろなチャートを作成できます。
基本的にJupyter Notebookで利用できますし、グラフにカーソルを合わせると、グラフを構成している数値が表示されます。また、拡大・縮小などもできるので便利です。
さらに、Cufflinksというパッケージを合わせて利用すると、Pandasのデータフレームを使ってPlotlyでチャートを描けるようになります。
先日、以下の本を見ていたら、ローソク足チャートが紹介されていましたので、試してみました。
Python for Finance: Mastering Data-Driven Finance
- 作者: Yves Hilpisch
- 出版社/メーカー: O'Reilly Media
- 発売日: 2018/12/31
- メディア: ペーパーバック
- この商品を含むブログを見る
インストール
以下のサイトを見ると、conda
を利用してのインストールは利用できないようですので、pip
を利用してインストールします。
https://anaconda.org/gwinnen/plotly-and-cufflinks/notebook
pip install plotly pip install cufflinks
株価を取得する
株価のヒストリカルデータを無料で取得するのは、その時々でそれまで利用できていた方法ができなくなったりすることもあり、結構大変なんですよね。
日本の株価については、現時点では、以下のサイトで個別企業毎にCSVファイルをダウンロードして利用できます。
米国の株価については、現時点では、Yahoo Financeからのデータがまた取得できているようですので、pandas-datareader
というモジュールを利用します。
pip install pandas-datareader
でインストールします。
import pandas_datareader.data as web df = web.DataReader('^N225', 'yahoo', '2000/1/1','2019/10/16')
とすれば、Yahoo Financeから日経225のデータを取得して、データフレーム形式に格納できます。
日経225のローソク足チャートを描く
import plotly.offline as pyo import cufflinks as cf import numpy as np
まず、上記をインポートしておきます。 また、Jupyter notebookにて利用できるように、以下を実行します。
pyo.init_notebook_mode()
さて、先ほどの日経225のデータのうち直近60日分切り出し、quotesとします(日々のデータを見やすくし、確認するためです)。
quotes = df.iloc[-60:]
quotes.head()
quotesの最初の5行を表示させると以下の通り。
さて、このquotesをローソク足チャートにしましょう。 非常に簡単です。以下の通り、実行するだけです。
qf = cf.QuantFig(quotes, name='日経 225') pyo.iplot( qf.iplot(asFigure=True) )
以上です。と言いたいところですが、よく見てみると、横軸に土日も表示されていて、その場合もちろん株価はないので、チャートにギャップができてしまっています。
これを解消するためにいろいろ調べてみました。 英語のサイトでも議論になっていて、根本的な解決策はまだないようです。 したがって、横軸の表示を工夫するしかないのですが、以下のサイトを参考にさせていただきました。
これをQuantFigureオブジェクトにも適用できるよう、修正する必要があります。
まずは、quotesのインデックスをリセットします。
quotes.reset_index(inplace=True)
この段階でチャートを描きます。
qf = cf.QuantFig(quotes, name='日経225') pyo.iplot( qf.iplot(asFigure=True) )
土日が表示されなくなり、ギャップはなくなりました。しかし、横軸が単に数字の羅列となってしまいました。
そこで以下の通り、工夫します。直接QuantFigureオブジェクトの修正がうまくいきませんでしたので、一旦、Figureオブジェクトにして、そのFigureオブジェクトを修正しています。
figure = qf.iplot(asFigure=True) figure['layout'].update({ 'xaxis': {'tickmode':'array', 'tickvals': np.arange(0, quotes.index[-1],5), 'ticktext': [x.strftime('%y/%m/%d') for x in quotes['Date']][0::5], 'tickfont':{'size':10}} })
なお、参考にしたサイトと同様に、5日置きにデータを表示するようにしています。
pyo.iplot( figure )
うまく行きました。
ただし、グラフの左側と下側の目盛の表記が切れてしまっています。これを修正するには、marginを調整します。デフォルトでは左右上下ともmarginが30となっていますので、以下の通り、左と下側を少し大きめにしてみると良いかと思います。
figure['layout'].update({ 'xaxis': {'tickmode':'array', 'tickvals': np.arange(0, quotes.index[-1],5), 'ticktext': [x.strftime('%y/%m/%d') for x in quotes['Date']][0::5], 'tickfont':{'size':10}}, 'margin': {'b': 70, 'l':40, 'r':30, 't':30} # ここを追加 })
なお、QuantFigureを利用すると何が良いかというと、テクニカル分析用のチャートを簡単に追加するメソッドが準備されていることです。
ボリンジャーバンドを追加する
# ボリンジャーバンドを追加します qf.add_bollinger_bands() # あとはこれまでと同様にFigureオブジェクトを修正して、表示するのみ figure = qf.iplot(asFigure=True) figure['layout'].update({ 'xaxis': {'tickmode':'array', 'tickvals': np.arange(0, quotes.index[-1],5), 'ticktext': [x.strftime('%y/%m/%d') for x in quotes['Date']][0::5], 'tickfont':{'size':10}} }) pyo.iplot( figure )
簡単ですね〜。うれしくなってきました。
MACDと出来高も表示させる
qf.add_macd() qf.add_volume()
さて、表示させます。
figure = qf.iplot(asFigure=True) figure['layout'].update({ 'xaxis': {'tickmode':'array', 'tickvals': np.arange(0, quotes.index[-1],5), 'ticktext': [x.strftime('%y/%m/%d') for x in quotes['Date']][0::5], 'tickfont':{'size':10}} }) pyo.iplot( figure )
他にも、単純移動平均・RSI・サポートライン・レジスタンスライン・トレンドライン等様々なチャートを追加できます。以下のページを参考にしてみてください。
https://jpoles1.github.io/cufflinks/html/cufflinks.quant_figure.html
その他
上記で利用したJupyter notebookをGistにアップロードしておきました。ただし、Plotlyで描画したグラフはうまく表示されませんでしたが、コード部分のみでも参考になるかもしれませんので、そのままにしておきます。
gist4238ca3c5ba76ecbefb3e5bcc7bdd218
なお、Cufflinksの基本的な使い方は、こちらに簡単に紹介されていますので、参考にしてみてください。