前提
接続までの箇所は、接続ページとほぼ同じですが、過去データの取得には以下をインポートする必要があります。
import oandapyV20.endpoints.instruments as instruments
仕様
取得するためには以下の設定が必要です。
- 通貨ペア:”USD_JPY”などとなります。
- ローソク足の種類:”S5″,”M1″,”M5″,”M10″,”H1″,”D”,”W”,”M”などがあります。
- 件数:最大5000件までです。それ以上必要な場合はループさせるしかありません。
- 期間:いつから、いつまで、いつからいつまでと指定できます。期間を指定した場合は件数を外さないとエラーになります。
- タイムゾーン:UTCやJapanなど。OandaやFXの世界は基本的にUTCです。
取得
指定日からN件
# APIのPythonラッパーをインポート from oandapyV20 import API import oandapyV20.endpoints.instruments as instruments import pandas as pd import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIへ接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 取得情報 currency = "USD_JPY" granularity = "M1" count = 10 start_time = '2016-01-01T00:00:00.000000Z' end_time = '2016-01-01T00:00:00.000000Z' # ----------------------------------------------------------------------- # パラメーター設定 params = { 'alignmentTimezone': 'UTC', 'from': start_time, # "to": end_time, "count": count, # 最大値は5000 "granularity": granularity } # APIへ過去データをリクエスト req = instruments.InstrumentsCandles(instrument=currency, params=params) api.request(req) # リストに変換 data = [] for raw in req.response['candles']: data.append([raw['time'], float(raw['mid']['o']), float(raw['mid']['h']), float(raw['mid']['l']), float(raw['mid']['c']), raw['volume']]) # データフレームに変換 df = pd.DataFrame(data) df.columns = ['Date Time', 'Open', 'High', 'Low', 'Close', 'Volume'] print(df) # Date Time Open High Low Close Volume # 0 2016-01-03T22:00:00.000000000Z 120.195 120.218 120.194 120.216 4 # 1 2016-01-03T22:03:00.000000000Z 120.224 120.224 120.224 120.224 3 # 2 2016-01-03T22:04:00.000000000Z 120.224 120.225 120.211 120.211 6 # 3 2016-01-03T22:05:00.000000000Z 120.211 120.226 120.208 120.213 19 # 4 2016-01-03T22:06:00.000000000Z 120.212 120.231 120.212 120.222 17 # 5 2016-01-03T22:07:00.000000000Z 120.222 120.232 120.218 120.220 45 # 6 2016-01-03T22:08:00.000000000Z 120.222 120.235 120.222 120.225 33 # 7 2016-01-03T22:09:00.000000000Z 120.224 120.233 120.216 120.227 35 # 8 2016-01-03T22:10:00.000000000Z 120.226 120.229 120.216 120.229 13 # 9 2016-01-03T22:11:00.000000000Z 120.234 120.234 120.226 120.228 5
指定期間で5000件以上のデータを取得する場合
例えば以下のようになると思います。
ただし、毎回最後の行を削除しているの、実際の期間より1件少なくなります。
# APIのPythonラッパーをインポート from oandapyV20 import API import oandapyV20.endpoints.instruments as instruments import pandas as pd import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIへ接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 取得情報 currency = "USD_JPY" granularity = "M1" count = 5000 start_time = '2016-01-01T00:00:00.000000Z' end_time = '2016-02-01T00:00:00.000000Z' data = [] # ----------------------------------------------------------------------- while start_time < end_time: # パラメーター設定 params = { 'alignmentTimezone': 'UTC', 'from': start_time, # "to": end_time, "count": count, # 最大値は5000 "granularity": granularity } # APIへ過去データをリクエスト req = instruments.InstrumentsCandles(instrument=currency, params=params) api.request(req) # リストに変換 for raw in req.response['candles']: data.append([raw['time'], float(raw['mid']['o']), float(raw['mid']['h']), float(raw['mid']['l']), float(raw['mid']['c']), raw['volume']]) # 最後の日時を取得 start_time = raw['time'] print(start_time) # 最後の行を削除 data.pop() # データフレームに変換 df = pd.DataFrame(data) df.columns = ['DateTime', 'Open', 'High', 'Low', 'Close', 'Volume'] print(df) # 2016-01-07T10:27:00.000000000Z # 2016-01-12T22:21:00.000000000Z # 2016-01-18T10:13:00.000000000Z # 2016-01-21T23:44:00.000000000Z # 2016-01-27T12:08:00.000000000Z # 2016-02-02T00:23:00.000000000Z # DateTime Open High Low Close \ # 0 2016-01-03T22:00:00.000000000Z 120.195 120.218 120.194 120.216 # 1 2016-01-03T22:03:00.000000000Z 120.224 120.224 120.224 120.224 # 2 2016-01-03T22:04:00.000000000Z 120.224 120.225 120.211 120.211 # 3 2016-01-03T22:05:00.000000000Z 120.211 120.226 120.208 120.213 # 4 2016-01-03T22:06:00.000000000Z 120.212 120.231 120.212 120.222 # ... ... ... ... ... ... # 29989 2016-02-02T00:18:00.000000000Z 120.914 120.914 120.902 120.914 # 29990 2016-02-02T00:19:00.000000000Z 120.914 120.914 120.898 120.899 # 29991 2016-02-02T00:20:00.000000000Z 120.896 120.907 120.896 120.900 # 29992 2016-02-02T00:21:00.000000000Z 120.900 120.918 120.900 120.910 # 29993 2016-02-02T00:22:00.000000000Z 120.914 120.926 120.914 120.924
最後に(注意点
OANDA Japanの仕様で1点、注意事項があります。
1分足などで取得すると、足りない時間が発生します。
例えば、12:00:00の次のデータが12:02:00といったように歯抜けになります。
以下は実際にダウンロードしたデータの一部です。
Date Time | Open | High | Low | Close | Volume |
2019-01-01 22:00:00+00:00 | 109.59 | 109.59 | 109.59 | 109.59 | 1 |
2019-01-01 22:01:00+00:00 | 109.673 | 109.673 | 109.673 | 109.673 | 1 |
2019-01-01 22:02:00+00:00 | 109.673 | 109.673 | 109.673 | 109.673 | 1 |
2019-01-01 22:06:00+00:00 | 109.669 | 109.669 | 109.669 | 109.669 | 1 |
2019-01-01 22:11:00+00:00 | 109.666 | 109.669 | 109.666 | 109.669 | 2 |
2019-01-01 22:14:00+00:00 | 109.664 | 109.664 | 109.65 | 109.65 | 4 |
2019-01-01 22:15:00+00:00 | 109.65 | 109.674 | 109.65 | 109.674 | 6 |
2019-01-01 22:18:00+00:00 | 109.67 | 109.67 | 109.639 | 109.639 | 7 |
2019-01-01 22:19:00+00:00 | 109.635 | 109.635 | 109.635 | 109.635 | 1 |
このように歯抜けになりますので、当然、インジゲーターなどもおかしくなりますので、足りない時間は前の時間の値を追加するようにしましょう。
コメント