PythonでOANDA APIを使って、過去レートを5000件以上取得する方法
目次
FxのAPIを使うなら絶対にOANDA!!
Pythonを使って為替情報の過去データを5000件以上取得する方法をご紹介します。
まず、Pythonで為替の値を得るためには、まずWeb APIを知っておく必要があります。
Web APIとは「Application Programming Interface(アプリケーション・プログラミング・インターフェイス)」の略語であり、
「ある1つの機能に特化したプログラムで共有可能なもの」や「ソフトウェアの機能を共有する仕組み」のことです。
つまり、APIを提供しているWebサービスが特定の情報を公開しており、APIを使用することでその情報を取得することができるということです。
そして、そのAPIを公開しているFx会社は、今回ご紹介するOANDAの他にもFx APIを公開しているFx会社あります。以下にFx APIの比較をしている記事をご紹介します。
http://trade-learner.com/comparison-fx-api/
上記記事ではOANDAのAPIは本番では、スプレッドが比較的大きいようなのですが、
読者のほとんどは、Pythonを使ってFxのトレードはできないだろうか?というのをデモ口座を使って行おうと画策しているものと思います。
なので、今回はOANDA APIを使って、為替情報を取得する方法をご紹介します。
OANDA APIキーの取得方法
・デモ口座の解説
まず、APIキーを取得するためにOANDAのデモ口座を開設しましょう。開設自体は必要事項を記入すれば、即座に開設されます。
以下のURLにアクセスして『新規口座開設』ボタンを押して、デモ口座を開設を選択しましょう。
・APIの取得
デモ口座を開設できたら、ログインして以下の『APIアクセスの管理』を選択しましょう。
そして、APIの発行を選択すると、以下のような赤枠で囲ってある部分がAPIキーです。
ここをコピーして『config』というフォルダを作成し、テキストファイルに先ほどコピーしたAPIキーとアカウントIDを以下のように記入しておきましょう。アカウントIDは、ログインした時の画面にありますので、それも必要です。
ファイル名は『config_v1.txt』という名前にしておきましょう。
上記のようにファイルを保存できれば、APIキーの使用設定が完了しました。
・oandapyをインストール
OANDA APIをPythonで使用するために、Pythonにoandapyというパッケージをインストールしましょう。
ターミナルまたはコマンドプロンプトを起動させて、以下のコマンドを入力しましょう。
1 |
$ pip install git+https://github.com/oanda/oandapy.git |
インストールが完了したら、これから紹介するコードで必要なパッケージがインストールされていなければ、随時『pip install [パッケージ名]』でインストールしましょう。
本題:Pythonを使って為替レートを取得しよう!
それでは、OANDAのデモ口座と、OANDA APIキーの取得、oandapyのインストールが完了したら、いよいよ為替情報を取得しましょう。
・現在レートの取得
以下のコードをコピペして『scraping.py』という名前のPythonファイルを作成しましょう。
ちなみに、基本は以下の記事を参考にして作成しているので、コードの詳細は参照記事をご覧ください。
参照記事:http://www.algo-fx-blog.com/python-oanda-api-v1/
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 29 30 |
# 必要なライブラリの読み込み import pandas as pd import oandapy import datetime from datetime import datetime, timedelta import pytz # API接続設定のファイルを読み込む import configparser # 設定 config = configparser.ConfigParser() config.read('./config/config_v1.txt') # パスの指定が必要です account_id = config['oanda']['account_id'] api_key = config['oanda']['api_key'] # APIへ接続 oanda = oandapy.API(environment="practice", access_token=api_key) # ドル円の現在のレートを取得 res = oanda.get_prices(instruments="USD_JPY") # 中身を確認 print(res) --出力 {'prices': [{'instrument': 'USD_JPY', 'time': '2018-10-25T09:52:19.848138Z', 'bid': 112.317, 'ask': 112.321}]} |
それでは、このファイルを『$ python scraping.py』と実行して、上記コードの出力結果を得られれば成功です。
また、このAPIで取得してきた為替レートの時間表示というのは、確かロンドンの時間に設定されていると思います。
なので、以下のコードを追記して、時間表示を日本時間に変更しましょう。
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 |
# 文字列 -> datetime def iso_to_jp(iso): date = None try: date = datetime.strptime(iso, '%Y-%m-%dT%H:%M:%S.%fZ') date = pytz.utc.localize(date).astimezone(pytz.timezone("Asia/Tokyo")) except ValueError: try: date = datetime.strptime(iso, '%Y-%m-%dT%H:%M:%S.%f%z') date = date.astimezone(pytz.timezone("Asia/Tokyo")) except ValueError: pass return date # datetime -> 表示用文字列 def date_to_str(date): if date is None: return '' return date.strftime('%Y/%m/%d %H:%M:%S') # ドル円の現在のレートを取得 res = oanda.get_prices(instruments="USD_JPY") print(date_to_str(iso_to_jp(res['prices'][0]['time']))) --出力 2018/10/25 19:05:49 |
これで取得したデータを、日本時間に変換できました。
ちなみに、『res[‘prices’][0][‘time’] = date_to_str(iso_to_jp(res[‘prices’][0][‘time’]))』を入力することで、resの中身の時間を変更することができます。
・為替レートの過去レートを5000件取得する方法
oandapy を使えば、現在のレートから指定した時間足でのレート情報を、最大で5000件取得することができます。
以下のコードを実行すると、5000件取得することができます。試しに1時間足を現在レートから5000件取得するコードを紹介します。
ファイル名を『scraping_h1.py』としておきましょう。
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 29 30 31 32 33 34 35 36 |
# 必要なライブラリの読み込み import pandas as pd import oandapy import datetime from datetime import datetime, timedelta import pytz # API接続設定のファイルを読み込む import configparser # 設定 config = configparser.ConfigParser() config.read('./config/config_v1.txt') # パスの指定が必要です account_id = config['oanda']['account_id'] api_key = config['oanda']['api_key'] # APIへ接続 oanda = oandapy.API(environment="practice", access_token=api_key) #過去レートを取得 => granularity:取得したい時間足 (5秒足:'S5', 10秒足:'S10', 1分足:'M1', 15分足:'M15', 1時間足:'H1', 日足:'D' などなど), count:取得件数 res_hist = oanda.get_history(instrument="USD_JPY", granularity="H1", count=5000) #ローソク足情報を取得 res = res_hist.get("candles") #データフレームに変換しておく df = pd.DataFrame(res) #確認 print(df[0:3]) --出力 closeAsk closeBid complete highAsk highBid lowAsk lowBid openAsk openBid time volume 0 113.205 113.192 True 113.207 113.194 113.181 113.168 113.183 113.171 2018-01-08T04:00:00.000000Z 119 1 113.236 113.224 True 113.281 113.266 113.206 113.192 113.207 113.194 2018-01-08T05:00:00.000000Z 240 2 113.220 113.206 True 113.246 113.233 113.211 113.198 113.239 113.226 2018-01-08T06:00:00.000000Z 176 |
では、以上のコードを記入したPythonファイルをターミナル等で『python scraping_h1.py』と実行してみて、同様の出力結果を得られたら成功です。
また、注意なのですが、指定できる時間足は最小で5秒足だと思われます。取得できる件数も最大で5000件までです。
今後パイソンを使って、為替情報を機械学習したいと思っている人にとっては、データが5000件というのは少々心もとないと思いますので、
次の項目で、過去レートを5000件以上取得する方法をご紹介します。
・過去レートを5000件以上取得する方法
それでは、過去レートを5000件以上取得する方法をご紹介します。
コードの中に『get_history()』がありますが、これの引数に『end』というのがあり、その時間を指定すると、その時間よりも過去のレートを取得していってくれます。
それも意識した上で、以下のコードで、1時間足を3万件取得するコードを紹介します。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# 必要なライブラリの読み込み import pandas as pd import oandapy import datetime from datetime import datetime, timedelta import pytz # API接続設定のファイルを読み込む import configparser # 設定 config = configparser.ConfigParser() config.read('./config/config_v1.txt') # パスの指定が必要です account_id = config['oanda']['account_id'] api_key = config['oanda']['api_key'] # APIへ接続 oanda = oandapy.API(environment="practice", access_token=api_key) for i in range(6): if i == 0: res_hist = oanda.get_history(instrument="USD_JPY", granularity="H1", count=5000) else: res_hist = oanda.get_history(instrument="USD_JPY", granularity="H1",end=endtime, count=5000) res = res_hist.get("candles") endtime = res[0]['time'] if i == 0 : res1 = res else : for j in range(len(res1)): res.append(res1[j]) res1 = res print('res ok', i+1, 'and', 'time =', res1[0]['time']) #データフレームに変換しておく df = pd.DataFrame(res1) #取得件数を数えて出力 print(len(df)) --出力 res ok 1 and time = 2018-01-08T05:00:00.000000Z res ok 2 and time = 2017-03-19T22:00:00.000000Z res ok 3 and time = 2016-05-27T12:00:00.000000Z res ok 4 and time = 2015-08-06T23:00:00.000000Z res ok 5 and time = 2014-10-16T09:00:00.000000Z res ok 6 and time = 2013-12-26T22:00:00.000000Z 30000 |
以上のコードを実行した時に、同様の出力結果を得られ、30000という表示がされれば成功です。
時間表示も見てみると、2013年まで遡れていることがわかります。
このように、for文と引数:end を用いれば5000件以上の過去レートを取得できることができます。
また、もっと期待値の高い稼ぐ方法を知りたい方はこちらまで↓
総括
今回はoandapy のご紹介と、レートの取得方法をご紹介しました。
近々、oandapy を用いて、注文を出したり、決済したりできるプログラムをご紹介しようかと思います。
また、このコードじゃ上手くいかない!!という方は、以下の少しバージョンアップさせたコードお試しください。おそらくOANDA APIがV20になってると思いますので…
【V20版】PythonでOANDA APIを使って、指定した期間の過去レートを取得する方法
報告!!実際に利益の出たプログラムをnoteにて販売中!!
自分が長いこと研究して実際に1週間に3%ほどの利益を上げれている自動取引BOTを下記のリンク先にて公開中です!気になるかたはぜひご覧ください!
FxトレーダーでOANDA使ってる方、Pythonで作ったこの自動売買BOTを試して欲しいです。
また、新しく人工知能の知識を用いた線形回帰をベースとした特殊な強化学習のモデルを作成しました。かなりのパフォーマンスを上げることができたいますので、是非お試しください。
【論文実装編】線形回帰モデルのFx自動売買ー学習パート+取引モデルのパート統合
ディスカッション
コメント一覧
こんにちは。
当方、OANDAのAPIで自動売買をしようと、Pythonを勉強中です(初学者です)。
勉強になる記事をありがとうございます。
当記事を参考にして、デモ口座の開設から順に進んできましたが、”現在レートを取得する”でつまずいてしまいました。
記事中のコードをコピペして、Pythonのファイルを実行したところ、次のようなエラーが出ました。
oanda = oandapy.API(environment=”practice”, access_token=api_key)
AttributeError: module ‘oandapy’ has no attribute ‘API’
これはどういった原因が考えられるでしょうか?
ModuleNotFoundErrorとは出ていないので、oandapyは正常に読み込めていると思うのですが…。
お忙しいところ恐縮ですが、ご意見をいただけると幸いです。
(使用環境はWindows10、Anaconda3インストール、VSCode使用です)
そちらの記事では、oandapyのパッケージでAPIを使用していますが、namuさんがデモ口座ではおそらくOANDAのバージョンが違うと思われます。
去年あたりまでは日本のOANDAはバージョン1のみでしたが、世界的にはバージョン20が使用されていました。それが最近日本でもバージョン20に対応したので、namuさんのデモ口座もバージョン20だと思います。ログイン画面にてv20という表記があればそうです。
ですので「pip install oandaV20」で、バージョン20に対応したパッケージをインストールしてください。
使用方法に関しては、こちらの記事にてあると思います、ご参考までに(https://mathokapro.com/2019/07/25/oandav20_get_data/)
お返事ありがとうございます。
自分でも調べてみてそうかなと思いましたが、おっしゃる通りバージョンの違いが原因のようです。
貼っていただいたリンク先を参考にさせていただきます。
お忙しいところお答えいただき、ありがとうございました。