OANDA API 解説編 第7回 銘柄(通貨ペア)情報の取得
OANDA APIを使ってレート系データの取得についていろいろ試してみましたが、今回は銘柄(通貨ペア)情報の取得の仕方を学んでみたいと思います。
銘柄情報には、オーダー時に必要な情報がいろいろ含まれていますので、これをあらかじめ取得しておいた上で実際のオーダーを出せるという訳です。
OANDA REST-v20の開発ガイド(英語版)はこちら。
銘柄情報を取得する
GET /v3/account/{account name}/instruments
指定された口座で取引可能な銘柄情報の一覧を取得
OANDAの開発ガイドの該当部分はこちらから。
引数の説明
名前 | 場所 | 型 | 必須 | 説明 | |
---|---|---|---|---|---|
Authorization | header | string | Y | トークンID | |
accountID | path | AccountID | Y | 自分の口座番号 | |
instrument | path | InstrumentName | Y | 取得したい通貨ペア |
例:USD_JPY 複数指定の場合はカンマ区切 USD_JPY,EUR_USD 指定なしの場合はすべての銘柄を出力 |
早速この引数を使って銘柄情報を取得してみます。
# 必要なモジュールの読み込み import requests import json # 口座情報の設定 API_Token = '********************************-********************************' API_AccountID = '999-999-99999999-999' # URLの設定 (デモ口座用非ストリーミングURL) API_URL = "https://api-fxpractice.oanda.com" # 通貨ペア #一つのみ指定 INSTRUMENT = "USD_JPY" #全部指定の場合は、 #INSTRUMENT = "" #複数指定の場合 #INSTRUMENT = "USD_JPY,EUR_USD" # <銘柄情報取得用URLの変数の設定> url = API_URL + "/v3/accounts/%s/instruments?instruments=%s" % (API_AccountID, INSTRUMENT) # ヘッダー情報の変数の設定 headers = { "Authorization": "Bearer " + API_Token } # サーバーへの要求 response = requests.get(url, headers=headers) # 処理結果の編集 Response_Body = response.json() print(json.dumps(Response_Body, indent=2))
json.dumpsで編集すると以下のようなデータを受け取れます。
{ "instruments": [ { "name": "USD_JPY", "type": "CURRENCY", "displayName": "USD/JPY", "pipLocation": -2, "displayPrecision": 3, "tradeUnitsPrecision": 0, "minimumTradeSize": "1", "maximumTrailingStopDistance": "100.000", "minimumTrailingStopDistance": "0.050", "maximumPositionSize": "0", "maximumOrderUnits": "100000000", "marginRate": "0.05", "guaranteedStopLossOrderMode": "DISABLED", "tags": [ { "type": "ASSET_CLASS", "name": "CURRENCY" } ], "financing": { "longRate": "-0.0076", "shortRate": "-0.0135", "financingDaysOfWeek": [ { "dayOfWeek": "MONDAY", "daysCharged": 1 }, { "dayOfWeek": "TUESDAY", "daysCharged": 1 }, { "dayOfWeek": "WEDNESDAY", "daysCharged": 3 }, { "dayOfWeek": "THURSDAY", "daysCharged": 1 }, { "dayOfWeek": "FRIDAY", "daysCharged": 1 }, { "dayOfWeek": "SATURDAY", "daysCharged": 0 }, { "dayOfWeek": "SUNDAY", "daysCharged": 0 } ] } } ], "lastTransactionID": "793" }
とりあえあず使えそうな値についての説明。
Key | 名前 | 説明 |
---|---|---|
name | 銘柄名 | 通貨名_通貨名 |
type | 銘柄タイプ | 通貨ペアの場合は”CURRENCY” |
displayName | 表示用銘柄名 | 通貨名/通貨名 例:USD/JPY _で表示したくない場合はこちらを使用。 |
piplocation | pipの小数桁位置 | 指数(10のべき乗) -2の時、10-2=0.01 |
displayPrecision | レートの表示桁数 | レートの表示桁数 例:3の時、小数第三位まで表示 |
tradeUnitsPrecision | トレードユニットの小数点精度 | 小数点以下の桁数を表す。0の時、小数部は使えない=整数のみ |
minimumTradeSize | 最小トレードサイズ | 通貨単位 (type = "CURRENCY"の場合) |
maximumTrailingStopDistance | トレイルストップの最大値 | 例:USD/JPY 100円=100*10-2=10,000pips |
minimumTrailingStopDistance | トレイルストップの最小値 | 例:USD/JPY 0.050円=0.050÷10-2=5pips |
marginRate | 証拠金率 | 例:0.05の時、0.05=5%、1÷0.05=20倍 |
"financing" Key以下はスワップポイントの計算に必要な部分になりますが、今回は飛ばします。 ちなみに上のUSD/JPYの例を見てもわかるように、
"financing": { "longRate": "-0.0076", "shortRate": "-0.0135",
Long/Short共にマイナスになっていますので、売り買いいずれのポジションでも持ち越すと支払いになってしまいます。
これは米国の口座(NYサーバー)では、1%の手数料を加算されてしまう為で、スワップポイントを得られるような通貨ペアは限られていますね。
参考までに米国口座でのスワップポイント一覧やその計算方法の説明は以下のリンクから
www.oanda.com
取得したデータをpandasのDataFrameに変換する
OANDAのサーバーから取得した銘柄情報の内、上記で説明した値を使うだけでしたら、以下のように行えば簡単に変換できます。 いくつも銘柄を扱うような場合はDataFrameに変換しておけば、後でいろいろ便利です。
df = pd.json_normalize(Response_Body, record_path="instruments")
0 name type displayName pipLocation displayPrecision tradeUnitsPrecision minimumTradeSize maximumTrailingStopDistance minimumTrailingStopDistance maximumPositionSize maximumOrderUnits marginRate ... USD_JPY CURRENCY USD/JPY -2 3 0 1 100.000 0.050 0 100000000 0.05 ...
USD/JPYだけのように固定の銘柄しか扱わない場合は、必要なKeyを直接指定してしまった方が簡単です。
(下の例ではpipLocationはpipsへ換算しています。他の値も後で数値として扱えるようにfloat()で型を変換しています。)
inst_name = Response_Body['instruments'][0]['name'] inst_displayPrecision = float(Response_Body['instruments'][0]['displayPrecision']) inst_pipvalue = 10**float(Response_Body['instruments'][0]['pipLocation']) 👈pipsへ変換の場合 inst_minsize = float(Response_Body['instruments'][0]['minimumTradeSize']) inst_maxts = float(Response_Body['instruments'][0]['maximumTrailingStopDistance']) inst_mints = float(Response_Body['instruments'][0]['minimumTrailingStopDistance'])
まとめ
今回は銘柄情報の取得方法についての解説でした。
固定の通貨ペアを扱うようなシストレであればあらかじめpipLocationやMin/Max値を定数にしておき、データをサーバーから特に取得する必要はありませんが、状況によって通貨ペアを変更したり、いろいろな通貨ペアの取引を行うようなシストレの場合は、このAPIで銘柄情報を取得しておけば便利です。