エンジニアの頭の中

トレードbotエンジニアが書く技術と投資のブログ

為替(USドル、日本円)のローソク足をOANDA APIで取得する

f:id:mitsu3204:20180925150706j:plain

バックテストに使用するため、為替の日々の価格データをAPI経由で取得したいと思い、データを入手する手段を探していました。

OANDAのAPIを使用すれば可能だったので、メモ残しておきます。

準備

まず、以下の3つの準備を行います。

  1. OANDA Japan の口座を開設する
  2. OANDA REST APIキーを発行する
  3. Pythonライブラリをインストールする

1. OANDA Japan の口座を開設する

OANDAのAPIを使用するには、口座を持っている必要があります。私は既にOANDA Japan の口座を持っていたためそれを使用しました。

新規口座を作る場合、本人確認書類もWeb上で提出可能です。開設手続きが完了するには、申し込んでから数日はかかったと思います。

口座開設は、OANDA JapanのHPから申仕込み可能です。

www.oanda.jp

2. OANDA REST APIキーを発行する

OANDAには、本番環境とデモ環境の二つの環境があります。

  • 本番環境・・・実際に為替の取引が行われている環境
  • デモ環境・・・シミュレーション用のテスト環境

本番環境のREST APIキーを発行するには、口座に25万円以上の残高があることが条件となります。デモ環境用のREST APIキーであればこのような制限はありません。残高25万円以上確保することのハードルが高いようであれば、デモ環境でAPIキーを発行してみましょう。

以下は、デモ口座の画面を例として説明します。

(1) OANDA Japanの口座にログインします。(ログイン先が本番口座かデモ口座かはログイン画面上で選択可能です。)

f:id:mitsu3204:20180919140550p:plain

(2) 画面右下に表示されている「APIアクセスの管理」をクリックします。

f:id:mitsu3204:20180919140605p:plain

(3)「REST APIの管理」をクリックします。

f:id:mitsu3204:20180919133548p:plain

(4)「発行する」ボタンをクリックします。

f:id:mitsu3204:20180919133558p:plain

(5) Personal Access Tokenというトークンが発行されます。APIを実行する際にこのトークンを使用するため、トークンの文字列はコピーして保管しておきましょう。「再発行」のボタンをクリックすると、新しいトークンを発行できます。トークンを再発行した場合は、古いトークンは自動的に無効化されます。

f:id:mitsu3204:20180919135509p:plain

Pythonライブラリをインストールする

自分でAPI通信処理を書くより、実装を簡単に済ませることができるので、oandapyV20というOANDAのAPIを実行するためのPythonライブラリを使用します。

pipでインストールします。

pip install oandapyV20

その他にrequests, sixをodanapyV20が使用するので、同じようにインストールします。

実装

以下のソースコードは、OANDAのデモ環境に接続して、ローソク足の情報をAPI経由で取得するための実装です。

処理内容は以下のとおりです。

ソースコード

import json
import datetime
from oandapyV20 import API

from oandapyV20.endpoints.instruments import InstrumentsCandles

access_token = '<発行した自分のPersonal Access Token>'

# 1. データの取得開始日時を作成
fmt = '%Y-%m-%dT%H:%M:00.000000Z'
_from = datetime.datetime(year=2018, month=9, day=10, hour=0, minute=0, second=0).strftime(fmt)

# 2. APIトークンと接続先環境を指定してAPIオブジェクトを作成
api = API(access_token=access_token, environment='practice')

# 3. 通貨ペア、タイムゾーン、ローソク足の本数、種別を指定してリクエスト情報を作成する
req = InstrumentsCandles(instrument=,USD_JPY',
                          params={
                              'alignmentTimezone': 'Japan',
                              'from': _from,
                              'count': 24,
                              'granularity': 'H1'
                           })

# 4. リクエストを送信
api.request(req)

# 5. レスポンスを標準出力へ表示
print(json.dumps(req.response, indent=True))
1. データの取得開始日時を作成する

2018年9月10日のデータを取得するとしたら、以下のような日時の文字列を作成します。

2. APIトークンと接続先環境を指定してAPIオブジェクトを作成

access_tokenには、OANDA Japanのサイトで発行したPersonal Access Tokenの文字列を指定します。

environmentには、接続先の環境名を指定します。デモ環境に接続するのでpracticeと指定します。

なお、アクセストークンは環境ごとに発行されるものなので、環境を変更する場合はその環境に応じたアクセストークンを使用する必要があります。

3. 通貨ペア、タイムゾーンローソク足の本数、種別を指定してリクエスト情報を作成する

通貨ペアはinstrumentに指定します。例では、USドルと日本円のペアを指定しています。

paramsには辞書形式で、各種パラメータを以下のように指定します。

  • alignmentTimezone 扱う日時のタイムゾーンを指定します。例では、日本時間を扱っているため、Japanとしています。
  • from ローソク足データの取得開始日時を文字列で指定します。
  • count 取得するローソク足の本数を数値で指定します。
  • granularity ローソク足の期間を指定します。H1であれば1時間足、M5であれば5分足、S5なら5秒足といった感じです。
4. リクエストを送信

OANDAのAPIサーバへリクエストを送信します。

5. レスポンスを標準出力へ表示

サーバからのレスポンスは、request.responseに辞書形式で格納されてます。見やすくするため、json.dumpsindent=Trueを指定してフォーマットを整えたうえでprintで表示しています。

出力結果は以下のようになりました。

{
 "instrument": "USD_JPY",
 "granularity": "H1",
 "candles": [
  {
   "complete": true,
   "volume": 1057,
   "time": "2018-09-10T00:00:00.000000000Z",
   "mid": {
    "o": "110.918",
    "h": "111.036",
    "l": "110.910",
    "c": "110.950"
   }
  },
  {
   "complete": true,
   "volume": 1144,
   "time": "2018-09-10T01:00:00.000000000Z",
   "mid": {
    "o": "110.947",
    "h": "110.981",
    "l": "110.850",
    "c": "110.980"
   }
  },
  {
   "complete": true,
   "volume": 684,
   "time": "2018-09-10T02:00:00.000000000Z",
   "mid": {
    "o": "110.978",
    "h": "111.058",
    "l": "110.928",
    "c": "111.019"
   }
  },

  ... 以下省略 ...

 ]
}

各属性の内容は以下のとおりです。

以上です。

いつもは仮想通貨いじっているほうが多いです。仮想通貨のローソク足取得に関する記事もあります。

www.hacky.xyz