ドル円のローソク足チャートをmplfinanceとPlotlyで描いてみるの巻

ドル円のローソク足チャートをmplfinanceとPlotlyで描いてみるの巻

経緯

Pythonでグラフ描画のためにmplfinanceとPlotlyを触ってみたときのメモです。

あるとき思い立ち、ドル円データのcsvファイルを使用して、PythonでpandasのDataFrameからそれっぽくローソク足チャートを作成してみることにしました。

調べるとmplfinanceかPlotlyで簡単に描画できそうなことがわかったので、試しにやってみたところ、特にPlotlyの機能性にびっくりでした、という話。

まず、matplotlibで描けないか探していたらmplfinanceなるものがあることを知りました。これは旧版であるmpl-finance(ハイフンだけ違う。。。)が更新されたもので、mpl-financeよりも簡単に扱えるようになっているようです。詳しくはGitHubにて。

それから、Plotly(公式サイト)でもナイスなグラフが描けそうでした。versionが4に上がってからはわざわざオフラインモードを宣言しなくても無料(MITライセンス)で使えるようになり使い勝手が良くなっているようです(https://plotly.com/python/is-plotly-free/)なお、かつてのオンラインモードの機能は切り分けられてchart-studioというのに移管されている模様。

あと、seabornやBokehというのがありましたが、初心者の私にはなんとなくとっつきにくい感じがしたので触ってないです。

やり方

データの準備

過去のドル円データのcsvファイルはこちらからダウンロードさせていただきました。
ドル円1分足データ(期間2001.1.2-2020.3.31。欠測あり)
プライス;bid
時間;GMT (UTC+0000)です。

コレだと手習いとしてはデータ量が大きすぎなので、2008年9月16日の0時から20分だけ抜粋して20080916.csvとして使いました。

まず、csvファイルをDASKで読み込みます。そのときに日付と時間の部分をdatetime型に変換して、hidukeというindex(Datetimeindex)に設定しました。また、GMTのままだとわかりにくいのでJSTに変換しました。

# pandasをpdとして読み込む
import pandas as pd

#DASK(csv読み込み速度改善のため使用)をddfとして読み込む
import dask.dataframe as ddf
import dask.multiprocessing

#<DTYYYYMMDD>と<TIME>をまとめてhidukeというindexにてdatetime型に変換して
#daskでファイルを読み込み > index設定 > pandasのDataFrameに変換
df = ddf.read_csv("20080916.csv", sep="," , parse_dates={'hiduke':['<DTYYYYMMDD>', '<TIME>']})
df = ddf.read_csv("20080916.csv", sep="," , parse_dates={'hiduke':['<DTYYYYMMDD>', '<TIME>']}).set_index('hiduke')
df = df.compute()

#このデータはタイムゾーンがGMT(UTC + 0000)なので、
#使いやすいようにJST(UTC + 0900)に変更しておく。
df.index = df.index.tz_localize('UTC')
df.index = df.index.tz_convert('Asia/Tokyo')

#TICKERとVOLのカラムは使わないので除去し、整形完了とする。
df.drop(['<TICKER>', '<VOL>'], axis=1, inplace=True)

#最初の5行を確認
print(df.head(5))
                           <OPEN>  <HIGH>   <LOW>  <CLOSE>
hiduke                                                    
2008-09-16 09:00:00+09:00  104.17  104.21  104.14   104.21
2008-09-16 09:01:00+09:00  104.20  104.22  104.18   104.22
2008-09-16 09:02:00+09:00  104.21  104.25  104.21   104.22
2008-09-16 09:03:00+09:00  104.23  104.31  104.22   104.27
2008-09-16 09:04:00+09:00  104.25  104.29  104.25   104.29

というわけで上記のDataFrameをdfとして準備しました。

mplfinanceをインストール

pip install mplfinance

蛇足ですが、当初はmpl-financeを使おうとしていたので、

pip install mpl_finance

でmpl-financeを入れて、importしようとしたのですが、

##   WARNING: `mpl_finance` is deprecated:
##   Please use `mplfinance` instead (no hyphen, no underscore).
##   To install: `pip install --upgrade mplfinance` 
##   For more information, see: https://pypi.org/project/mplfinance/

ということだったので、これにしたがって

pip install --upgrade mplfinance

にてmplfinanceをインストールして使うことにしました。
このときにmpl-financeがmplfinanceにリニューアルされていることを知ったのでした。。。

mplfinanceのコードおよび実行結果

さっきのデータ取り込みのコードに以下のコードを追加して一緒に実行してます。

#mplfinanceをmpfとしてインポート
import mplfinance as mpf

#カラム名をOpen, High, Low, Closeにしないといけないとのことなので変更します。
df = df.rename\
(columns = {'<OPEN>': 'Open', '<HIGH>': 'High', '<LOW>': 'Low', '<CLOSE>': 'Close'})

#mplfinanceで描画する。
#plotで描画。typeはcandleを指定、styleはstarsandstripesにしてみました。
mpf.plot(df, type='candle', style='starsandstripes')
mplfinance_plot_candle_stick

たったコレだけで描画できました。

よく見るとあれ?9時間前にずれてる。。。どうやらJSTなのにUCT扱いになってるようです。mlpfinanceで修正する方法わからん。。。まあ、細かいところは後で色々いじるとして、簡単に見やすいグラフが描画できることがわかりました。

ちなみに

mpf.available_styles()

で見てやると、以下のスタイルが用意されていることがわかります。

['binance','blueskies','brasil','charles','checkers','classic','default', 'mike','nightclouds','sas','starsandstripes','yahoo']

次はPlotlyをばインストール

pip install plotly==4.6.0

旧バージョンの3.x.x(忘れた)を既にインストールしていたけど、旧バージョンのアンインストールもこのコマンドで一緒にしてくれるみたい。

Plotlyのコードおよび実行結果

先ほどのmplfinanceのコードの下に以下のコードを追加して一緒に実行してます。なのでDataFrameはさっきカラム名を変更しておいたdfを続けて使っています。

#Candlestick(ローソク足)にはplotly.graph_objsを使うのでgoとしてimport
import plotly.graph_objs as go

fig = go.Figure(data = [go.Candlestick(x = df.index,\
    open = df['Open'],\
    high = df['High'],\
    low = df['Low'],\
    close = df['Close'])])
fig.show()
plotly_plot_candle_stick

こちらも簡単に描画できました。
下部のスライダーで描画範囲を限定できたり、マウスオーバーでインタラクティブに値が確認できたりするのはのはめちゃめちゃ使い勝手が良さそうですね。
こちらはJSTのままにしてくれてます。

plotly_zoom
plotly_hover

双方ともほぼデフォルトの設定だけでここまでわかりやすい図が描けることがわかりました。すご。。。特にPlotlyは、描画後に細部を確認したくなる解析との相性がとても良さそうです。ネタがあれば他の様々なグラフや機能・設定を試してみたいと思います。

Python; 3.7.2
mplfinance; 0.12.4a0
Plotly; 4.6.0
で実施しました。

追記1
mplfinanceのcandle stickのstyleをもうちょっと掘り下げ

Python mplfinanceのcandlestickのstyleの巻

追記2
Dashを使って、Plotlyで過去のドル円ローソク足チャート(1分足)を表示できるWebアプリを作ってみました。

ドル円の過去19年分のローソク足チャートを1分足で見てみるの巻

Dash_USD_JPY_One_Minute chart


このブログはエックスサーバー で運営しております。


Word Press専用クラウド型レンタルサーバーwpX Speed


WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!

世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─