FX API(OANDA v20)から過去為替レートを取得してPandasのデーターフレームとCSVファイルへ書き出し
こんばんは、新米データサイエンティスト(@algon_fx)です。あっという間にゴールデンウィークの前半も終わり…振り返れば為替データ(個人勉強)と動画編集(仕事)しかしていないような笑。まぁまとまって勉強できるのは嬉しいです。
さて、昨日に別途ページを作りましたが、FX APIシリーズとして、今後はFX APIの勉強をした内容をチュートリアルとしてまとめていきたいと思います。
前回はOANDA API v20のデモ口座開設を行いましたので、今回はOANDA API v20から過去価格を取得してPandasのデータフレームとCSVファイルへ変換をする手順をまとめます。
【人気記事】
最新の為替レートのデータが取得可能
さて、FX 機械学習をやる上で重要となるのが良質で新鮮な過去の為替レートです。以前も記事にしましたが、一週間単位であれがGain CapitalのアーカイブページからTickデータのダウロードが可能です。(参照:過去の為替レートデータ)
しかしながら、この過去為替レートには2つの課題がありました。
課題1:毎週更新なので最新データでも一週間遅れである
課題2:週や通貨ペアにもよりますが思った以上に欠損値が多い
この二つの問題をクリアしなくては、機械学習で使う教師データとしては微妙です。そこで、色々と調べてみたり、ツイッターで助言を頂いたりと模索をしました。
最新データは取得可能なソースはいくつか見つかりましたが、Tickでなく1時間単位であったり…良質そうなデータが見つかれば、やはり時間差があったりと…色々と試行錯誤をしながら探した結果、最も納得できそうな方法が…
OANDA API v20で過去レートを引っ張ってくるのが一番良さそうだという結論に至りました。OANDA API v20であれば、時間差がなくさらに比較的良質で、何より5Tickから月まで好きな期間のレートをつ取得することが可能です。(なぜOANDA APIなのかはFX APIシリーズのページをご覧ください)
ってことで、OANDA API v20に接続して、過去レートを取得してみました。下記は、その手順となります。
まずはAPI接続しよう
では早速、APIに繋げて過去レートを取得してみましょう。v20ですが、現時点では日本のOANDA JAPANの口座では使えません。米国のOANDAででも口座を開設すると、v20が叩けるAPIキーと口座IDを取得できます。(やり方は口座開設編をご参照)
では、必要なライブラリをインポートしてあげましょう。 oandapV20 ですが、pip経由で簡単にインストールが可能です。
1 2 3 4 5 6 |
# OANDA API v20とPandasをインポート from oandapyV20 import API import oandapyV20.endpoints.instruments as instruments import pandas as pd |
次にAPI接続で使う口座IDとAPIアクセストークンを設定します。下記はダミーです。各自の設定に変更してください。口座IDはハイフンを3つ含んだ全て数字で、アクセストークンはハイフンを一つ含んだ英数字となります。
1 2 3 4 5 |
# OANDA API アクセストークンと口座ID accountID = "XXX-XXX-XXXXXXX-XXX" access_token = "abc123abc123abc123abc123abc123abc123-abc123abc123abc123abc123abc123abc123" |
では、次にこちらの情報を使ってAPI接続をしてあげましょう。APIですが、本番(live)、デモ用(practive)、サンドボックス(sandbox)の三種類の環境があります。今回はデモ用へ接続します。
1 2 3 4 |
# OANDA APIのデモ用へ接続 api = API(access_token=access_token, environment="practice") |
これでAPI接続はおっけーです。めっちゃ簡単ですね。
API経由で過去為替レートを取得する
APIの接続も完了したので、次は実際に過去為替レートをAPI経由で引っ張ってきてあげましょう。今回は練習用として最新のドル円から5秒を単位として2000データ引っ張ってみます。
まずはAPIに渡してあげるパラメーターから設定してあげましょう。
1 2 3 4 5 6 7 |
# APIに渡すパラメーターの設定 params = { "count":2000, "granularity":"S5" } |
granularityが取得する為替レートの期間を表しています。OANDA APIですが最短で5秒(今回設定のS5)をはじめとして、最大でM1の1ヶ月まであります。下記が、granularityで有効な値です。めっちゃ豊富で助かりますね。
- “S5” – 5 seconds
- “S10” – 10 seconds
- “S15” – 15 seconds
- “S30” – 30 seconds
- “M1” – 1 minute
- “M2” – 2 minutes
- “M3” – 3 minutes
- “M4” – 4 minutes
- “M5” – 5 minutes
- “M10” – 10 minutes
- “M15” – 15 minutes
- “M30” – 30 minutes
- “H1” – 1 hour
- “H2” – 2 hours
- “H3” – 3 hours
- “H4” – 4 hours
- “H6” – 6 hours
- “H8” – 8 hours
- “H12” – 12 hours
- “D” – 1 Day
- “W” – 1 Week
- “M” – 1 Month
では、早速APIへリクエストをしてみましょう。過去為替レートの取得ですが、 InstrumentsCandles() の関数を使います。今回は練習なので、取り急ぎ最新の2000データの取得ですが、当然、一定の期間を指定して取得も可能です。
1 2 3 4 5 |
# APIへ過去為替レートをリクエスト r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params) api.request(r) |
上記コードでAPIへリクエストすると、上のキャプチャのようにAPIから過去為替レートの応答があります。2000データをリクエストしても、ほぼ瞬時に返してくれますね。助かります。
上でAPIへリクエストしたものが「r.response」としてディクショナリーに格納されましたので、念のため確認してみましょう。
1 2 3 4 |
# APIから取得した最初のmid(中値)を確認 r.response['candles'][1]['mid'] |
{‘c’: ‘109.432’, ‘h’: ‘109.432’, ‘l’: ‘109.432’, ‘o’: ‘109.432’}
大丈夫そうですね。ohlc(Open、High、Low、Close)がしっかりAPIから取得できています。次は時間(Time)を確認してみましょう。
1 2 3 4 |
# 時間を確認 r.response['candles'][0]['time'] |
‘2018-05-01T06:35:20.000000000Z’
この時間ですが、デフォルトでアメリカNYの時間となっています。今後、ちゃんと使うときは日本ように時間を調整してあげる必要がありますね。
APIから取得したレートをPandasのDataFrameへ
無事にAPIから過去レートが引っ張って来れましたので、次は機械学習で扱いやすいように簡単な処理を加えましょう。
まずはPythonのリストへ変換してあげます。
1 2 3 4 5 6 |
# dataとしてPythonのリストへ過去レートを変換 data = [] for raw in r.response['candles']: data.append([raw['time'], raw['volume'], raw['mid']['o'], raw['mid']['h'], raw['mid']['l'], raw['mid']['c']]) |
for loopを使ってAPIから引っ張ってきたレートをリストとして綺麗にしてあげます。次に、このリストをPandasのDataFrame形式へ変換してみましょう。
1 2 3 4 5 6 7 |
# リストからPandas DataFrameへ変換 df = pd.DataFrame(data) df.columns = ['Time', 'Volume', 'Open', 'High', 'Low', 'Close'] df = df.set_index('Time') df.head() |
おっけーですね!ただ、インデックスとして使った Time がストリングで扱いづらいので、 to_datetime で綺麗にしてあげましょう。
1 2 3 4 5 |
# date型を綺麗にする df.index = pd.to_datetime(df.index) df.tail() |
本当にOANDA APIさまさまです。使いやすいし、レスポンスも早いし、ドキュメントもしっかりしているし。助かりますね。
APIから取得した過去レートをCSVへ書き出す
Pandasを使っていれば、当たり前のことかもしれませんが、あまりPandasと親しみがない方だと困るかもしれませんので、最後にDataFrameからCSVヘの書き出しも念のためやっておきましょう。
Pandasの to_csv() の関数を使うと一発でできます。
1 2 3 4 |
# データフレームからCSVファイルへ書き出し df.to_csv('api-usdjpy-5s-0501.csv') |
これで完了です(笑)! to_csv() ですが、書き出し先のディレクトリなども指定が可能です。デフォルトはPythonを立ち上げているディレクトリにCSVファイルが書き出されます。
念のためこのCSVファイルを確認してみると…
ちゃんとAPIで取得した過去レートが綺麗に格納されていますね。大丈夫そうです。
まとめと次の課題
今回はFX APIシリーズの2回目として、OANDA API v20へ接続をして過去レートを取得し、Pandasのデータフレーム形式やCSVファイルなどへ書き出しを行いました。
様々な期間のローソク足をAPI経由で取得することが可能ですし、さらには直近の最新のレートまでもが取得できるので、これは重宝しますね!
以上です!ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません