akatak’s blog

プログラム初心者の50代ビジネスマンがセカンドキャリアを目指して働きながらPythonを中心に独学しています。自らの覚え書きや成果物、感じたことなどを脈絡もなく書き連ねるブログです。

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

Plotlyとはデータ可視化のためのプラットフォームです。

plot.ly

Pythonだけでなく、RやJavaScriptなどにも対応しています。オンラインモードだと無料アカウントを作る必要がありますが、外部公開しない設定にする場合には課金されます。ただし、オフラインで使う場合、特にアカウント作る必要はありません。

Plotlyを使うと、このような(↓)いろいろなチャートを作成できます。

plot.ly

基本的にJupyter Notebookで利用できますし、グラフにカーソルを合わせると、グラフを構成している数値が表示されます。また、拡大・縮小などもできるので便利です。

さらに、Cufflinksというパッケージを合わせて利用すると、Pandasのデータフレームを使ってPlotlyでチャートを描けるようになります。

先日、以下の本を見ていたら、ローソク足チャートが紹介されていましたので、試してみました。

Python for Finance: Mastering Data-Driven Finance

Python for Finance: Mastering Data-Driven Finance

インストール

以下のサイトを見ると、condaを利用してのインストールは利用できないようですので、pipを利用してインストールします。

https://anaconda.org/gwinnen/plotly-and-cufflinks/notebook

pip install plotly
pip install cufflinks

 株価を取得する

株価のヒストリカルデータを無料で取得するのは、その時々でそれまで利用できていた方法ができなくなったりすることもあり、結構大変なんですよね。

日本の株価については、現時点では、以下のサイトで個別企業毎にCSVファイルをダウンロードして利用できます。

kabuoji3.com

米国の株価については、現時点では、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行を表示させると以下の通り。

f:id:akatak:20191020120552p:plain

さて、このquotesをローソク足チャートにしましょう。 非常に簡単です。以下の通り、実行するだけです。

qf = cf.QuantFig(quotes, name='日経 225')

pyo.iplot(
    qf.iplot(asFigure=True)
)

f:id:akatak:20191020120857p:plain

以上です。と言いたいところですが、よく見てみると、横軸に土日も表示されていて、その場合もちろん株価はないので、チャートにギャップができてしまっています。

これを解消するためにいろいろ調べてみました。 英語のサイトでも議論になっていて、根本的な解決策はまだないようです。 したがって、横軸の表示を工夫するしかないのですが、以下のサイトを参考にさせていただきました。

qiita.com

これをQuantFigureオブジェクトにも適用できるよう、修正する必要があります。

まずは、quotesのインデックスをリセットします。

quotes.reset_index(inplace=True)

この段階でチャートを描きます。

qf = cf.QuantFig(quotes, name='日経225')
pyo.iplot(
    qf.iplot(asFigure=True)
)

f:id:akatak:20191020121745p:plain

土日が表示されなくなり、ギャップはなくなりました。しかし、横軸が単に数字の羅列となってしまいました。

そこで以下の通り、工夫します。直接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
)

f:id:akatak:20191020122349p:plain

うまく行きました。

ただし、グラフの左側と下側の目盛の表記が切れてしまっています。これを修正するには、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
)

f:id:akatak:20191020122951p:plain

簡単ですね〜。うれしくなってきました。

MACD出来高も表示させる

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
)

f:id:akatak:20191020123233p:plain

他にも、単純移動平均・RSI・サポートライン・レジスタンスライン・トレンドライン等様々なチャートを追加できます。以下のページを参考にしてみてください。

https://jpoles1.github.io/cufflinks/html/cufflinks.quant_figure.html

その他

上記で利用したJupyter notebookをGistにアップロードしておきました。ただし、Plotlyで描画したグラフはうまく表示されませんでしたが、コード部分のみでも参考になるかもしれませんので、そのままにしておきます。

gist4238ca3c5ba76ecbefb3e5bcc7bdd218

なお、Cufflinksの基本的な使い方は、こちらに簡単に紹介されていますので、参考にしてみてください。

www.sejuku.net