前提
接続までの箇所は、接続ページとほぼ同じですが、過去データの取得には以下をインポートする必要があります。
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 | 
このように歯抜けになりますので、当然、インジゲーターなどもおかしくなりますので、足りない時間は前の時間の値を追加するようにしましょう。

コメント