FX APIからPythonで為替レートのストリーミングを取得してローソク足をプロットする方法
FX APIをPythonを使って為替レートのストリーミングを取得して、Pandasのデータフレームへ変換を行い、Matplotlibでローソク足チャートを描いてみました(FX APIシリーズ)
こんばんは、新米データサイエンティスト(@algon_fx)です。今週は、本業で色々とタスクが多く、ジムも行けてなければ、勉強もできず…。まぁこんな週もありますよね。
今日は少し時間が取れたので、少し前にやったFX API経由で為替レートのストリーミングを取得して、ローソク足チャートへ落とし込む流れをまとめたいと思います。
【人気記事】
FX APIへ接続しよう
毎回の流れですが、まずはOANDA API v20へPythonを使って接続しましょう。APIトークンやら口座開設やらは「OANDA API v20を使ってみる(デモ口座開設編)」にまとめていますので、ご参照ください。
まずは、今回の作業で行うライブラリーをインポートしてあげましょう。為替レートのストリーミングを取得するのは、 oandapyV20.endpoints.instruments を使います。
1 2 3 4 5 6 7 8 9 |
# API経由で為替レートのストリーミングを取得する import pandas as pd import matplotlib.pyplot as plt import datetime from oandapyV20 import API import oandapyV20.endpoints.instruments as instruments %matplotlib qt |
では、APIへ接続するためのトークンやら口座IDやらを渡してあげましょう。下記はダミーなので、各自の口座IDとトークンに変更してから実行ください。
1 2 3 4 5 |
# OANDA API v20の口座IDとAPIトークン accountID = "XXX-XXX-XXXXXXX-XXX" access_token = "abcdefghijkelmopqrstu1234567890-abcdefghijkelmopqrstu1234567890" |
では、APIへ接続しましょう。
1 2 3 4 |
# OANDA API v20へ接続 api = API(access_token=access_token) |
流れとしては為替レートのを取得して、Pandasのデータフレームへ変換、その後にデータをローソク足となるような処理を加えて、Matplotlibでローソク足チャートを表示させます。
APIから為替レートのストリーミングを取得
では、実際にFX API経由で現時点の為替レートのストリーミングを取得しましょう。まずはAPIへ投げる設定を count=200 、 granularity=M5 と作ってあげます。
countですが、ストリーミングから何件為替レートを取得するかのカウントです。granularityは、「粗さ」という意味で、つまりレートの期間を表します。今回はM5として、5分足のデータを取得しましょう。
1 2 3 4 5 6 |
params = { "count": 200, "granularity": "M5" } |
では、OANDAのAPIからレートのストリーミングを取得しましょう。これはAPIのエンドポイント InstrumentsCandles を使います。今回はドル円を取得しますので、通貨としてドル円も渡します。
1 2 3 4 5 |
# APIから為替レートのストリーミングを取得 r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params) api.request(r) |
大丈夫ですね。しっかりと為替レートのリスクエストが行えているのが確認できます。
為替レートをPandasのデータフレームへ変換
これで、リクエスト「r」には、APIから取得した為替レートが200件入りました。こちらのリクエストの結果ですが、 r.response で確認が可能です。例えば最初のレコードを取得するには下記のように書くわけです。
1 2 3 4 |
# ストリーミングの最初の1件目のデータを確認 r.response['candles'][0] |
{‘complete’: True,
‘mid’: {‘c’: ‘110.917’, ‘h’: ‘110.933’, ‘l’: ‘110.917’, ‘o’: ‘110.933’},
‘time’: ‘2018-05-22T20:25:00.000000000Z’,
‘volume’: 13}
こちらですが、dict型となっています。このままでは、機械学習をやる私には扱いづらいので、Pandasのデータフレームへ変換してあげましょう。
1 2 3 4 5 6 7 8 |
# 為替レートのdictをDataFrameへ変換 rate = pd.DataFrame.from_dict({r.response['candles'][i]['time']: r.response['candles'][i]['mid'] for i in range(0,len(r.response['candles'])) for j in r.response['candles'][i]['mid'].keys()}, orient='index', ) |
ちょっと汚く、明示的なコードですが…まぁお仕事はしてくれるので、これでオッケーとします(笑)また、APIから取得した日付(time)を日付型に変換をしてあげましょう。
1 2 3 4 5 6 7 |
# インデックスの日付を綺麗にする rate.index = pd.to_datetime(rate.index) # 念のためDataFrameの確認 rate.head() |
これで、API経由で為替レートのストリーミングをゲットして、Pandasのデータフレームへの変換が完了です!
Matplotlibで5分足ローソク足チャートを作る
採れたてほやほやの為替レートのデータフレームが出来ましたので、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 |
次に取得した為替レートのデータフレームから、ローソク足チャートを作る処理を書いてあげましょう。
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 26 27 28 |
# データフレームからローソク足チャートへ def candlechart(data, width=0.8): fig, ax = plt.subplots() # ローソク足 mpf.candlestick2_ohlc(ax, opens=data.o.values, closes=data.c.values, lows=data.l.values, highs=data.h.values, width=width, colorup='r', colordown='b') # x軸を時間にする 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 |
# ローソク足チャートのプロッティング candlechart(rate) |
こちらは、チャートの一部分をズームインした奴ですが、しっかりローソク足チャートして出来上がっていますね!
まとめと次の課題
今回は、FX APIシリーズとして、Pythonを使って為替レートのストリーミングを取得してローソク足チャートに落としてみました。API経由で取得したデータをPandasへ変換するのに少し面倒でしたが、それ以外は特に難しい作業はありませんでした。
次は、テクニカル指標も色々とPythonで計算できるようになってきたので、テクニカル指標もチャートに載せてみたい。あと、クラウド上で常にAPIからレートを受け取って、ローソク足チャートの画像を大量に生成する流れもやりたいです。(チャートの画像を使って試験的に機械学習モデルを作ってみたい)
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません