PythonのMatplotlib+Pandasで為替レートCSVからローソク足チャートを描いてみよう
みなさん、こんにちは、新米データサイエンティスト(@algon_fx)です。先週の平日は年度末ということもあり飲み会が立て続けに入ってしまい、勉強がなかなか進みませんでした。ってことで、週末はどっぷり勉強に浸っています。
前回にPythonでテクニカル指標を簡単に生成してくれるTa-Libというライブラリを紹介しましたが、今回はテクニカル指標を描く前の準備編としてPythonのMatplotlib+Pandasを使って為替のロウソク足を作ってみたいと思います。
では、早速やってみましょう。
【人気記事】
使う為替レートデータの準備
まずは為替レートのデータが必要です。今回は以前に記事にもしたGain Capitalのドル円のレートデータを使いたいと思います。下記のURLからCSVファイルのダウロードが可能です。
http://ratedata.gaincapital.com/2018/03%20March/
今回もドル円の3月2週目のティックデータを使いましょう。ファイル名は USD_JPY_Week2.csv です。
では、まずは使うライブラリを読み込んであげましょう。参考までにですが、私はJupyter Lab使っています。テーマをダークカラー系を利用していて、グラフを作ると見辛いので %matplotlib qt でグラフがインラインに表示されないようにしています。不要であれば、消してください。
1 2 3 4 5 6 7 8 |
# ライブラリの読み込み import pandas as pd import numpy as np import time import datetime %matplotlib qt #必要なければ消してください |
次はこのドル円為替レートのCSVをPandasのデータフレームとして読み込んであげましょう。indexにはCSVデータの日付をつけてあげます。
1 2 3 4 5 6 7 |
# 為替レートのCSVファイルをPandasのデータフレームで読み込み df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) # indexをdatetime型にしてあげましょう df.index = pd.to_datetime(df.index)a |
データの準備の最後として、不要なカラムを落としてあげましょう。
1 2 3 4 5 6 7 8 9 |
# 不要なカラムを落とす del df['Tid'] del df['Dealable'] del df['Pair'] # データフレームの最後の5行を表示 df.tail() |
とりあえず、ドル円のTick毎のAskとBidの1週間のデータが出来ました。
Tickから1minへ、1週間から100分へ
Gain Capitalのデータですが、1行=ティックですので、こちらを1分間の期間へ変更をしてあげましょう。Pandasで便利な関数「 resample 」を使います。ちなみにこの ohlc というのは、Open High Low Closeの略です。
1 2 3 4 5 6 7 |
# Tickから1分間へデータを変更 min_1 = df.resample('1Min', how='ohlc') # データフレームを確認してみましょう min_1.head() |
データフレームのインデックスを見ると、ちゃんとティックから1分間へ変更されていますね。加えてBuy(買値)とSell(売値)ごとにOHLCが生成されています。
次ですが、今回は買値のロウソク足を作ってみたいので、このデータから買値だけを抜き出しましょう。またこれからプロッティングする際の利便性を考えて、Pandasのレベル(indexが複階層になっている)も解消しておきましょう。
1 2 3 4 5 6 7 |
# Buyのみ抜き出してdrop_levelでレベルを落とします buy_1min = min_1.xs('Buy', axis=1, drop_level=True) # 念のため確認してみましょう buy_1min.head() |
一つ前のmin_1のBuyと値を見比べてみても、Buyのみが取れているのが確認できます。一週間分の1分ロウソク足のチャートを作るとなると…カオスになりそうなので、最初の100分間のみ(つまり最初の100行のみ)に切り分けてあげましょう。
1 2 3 4 5 6 7 |
# 最初の100行(100分)のみ切り出す buy_1min_s = buy_1min[0:100] # 念のたサイズを確認 buy_1min_s.shape |
(100, 4)
これでティックから1分間へ、さらに1週間から100分へデータの変更が行えました。Matplotlibでチャートを描写する前に、Pandasの便利なPlot関数を使ってみましょう。
1 2 3 4 |
# データフレームから即座に簡易的なグラフを生成できる buy_1min_s.plot() |
あ…結構、欠損データありますね!先に確認しておくの忘れてた…。まぁ今回はとりあえずロウソク足チャートを作って見るのが目的なので、欠損値はスルーします。
Matplotlibを使ってローソク足チャートを作る
めっちゃ雑なデータですが、とりあえず準備はできましたので、1分間のローソク足チャートをMatplotlib(読み方はマットプロットリブ)を使って描写してみましょう。
参考までにですが、MatplotlibはPythonのオープンソースライブラリで、データの可視化を非常に簡単に行えます。通常のラインチャートはもちろん、散布図やさらにはヒストグラムまで、簡単に作れます。Pythonで機械学習やらデータサイエンスしている人で使えない人はいないと思われます。
前置きが長くなりましたが、ローソク足チャートを作ってみましょう。まずはMatplotlibのライブラリをインポートしてあげましょう。
1 2 3 4 5 6 7 |
# Matplotlibのインポート import matplotlib.pyplot as plt import matplotlib.finance as mpf from matplotlib import ticker import matplotlib.dates as mdates |
上記でもインポートしていますが、今回使うのはMatplotlibのfinance APIを利用します。これはMatplotlibの中でも特に金融系のデータのグラフを扱う関数が集まっています。
では、実際にコードを書いてみましょう。 data としてデータフレームを入力して、 matplotlib のfigとaxを戻す形です。入力するデータフレームのカラム名はopen、close、low、highでしか処理されてないのでご注意ください。
width でローソク足の幅をしています。下記のコードは0.8としていますが、必要であれば調整が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def candlechart(data, width=0.8): fig, ax = plt.subplots() # ローソク足 mpf.candlestick2_ohlc(ax, opens=data.open.values, closes=data.close.values, lows=data.low.values, highs=data.high.values, width=width, colorup='r', colordown='b') xdate = data.index ax.xaxis.set_major_locator(ticker.MaxNLocator(6)) def mydate(x, pos): try: return xdate[int(x)] except IndexError: return '' ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate)) ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') fig.autofmt_xdate() fig.tight_layout() return fig, ax |
1 2 3 4 |
# buy_1min_sをcandlechartに入力 candlechart(buy_1min_s) |

おお!ちゃんとロウソク足になっていますね!先ほど確認した通り、今回のデータには欠損値が含まれているので、ところどころ穴抜きにはなっていますが…(汗)
まとめと今後の宿題
いかがでしたか?今日はPythonとMatplotlib + Pandasを使って為替レートのCSVファイルから1分間ローソク足チャートを作ってみました。
次への宿題としては…これにTa-Libで生成したテクニカル指標をつけてみたいですね。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません