シストレどうですか

  Algorithmic Trading for Dummies

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で銘柄情報を取得しておけば便利です。