APIの使い方

「REST API」でOANDAオーダーブックを取得しローソク足チャートに表示する方法


OandaのREST API(以下、API)を使って、オーダーブックのデータを取得する方法について解説します。

オーダーブックはOANDAが独自で提供しているツールの1つで、世界中に分布するOandaグループの顧客の取引状況を確認することができます。

オープンオーダーとオープンポジションの2種類があり、オープンオーダーでは未約定のオーダー状況、オープンポジションでは保有中のポジション状況が把握することができます。

APIを使って、オーダーブックのデータを取得する方法

これらオーダーブックの情報はAPIを介して取得することが可能です。

本記事では、APIを使ってオーダーブック情報を取得し、ローソク足チャートに表示する方法について解説していきます。

参考記事:オーダーとポジション状況が一目瞭然、次の価格動向予想に役立ちます

事前準備

PythonでAPIを利用するためには、次の2点が必要です。

  • 1.APIトークンの発行
  • 2.oandapyV20のインストール

詳細についてはこちらの記事で解説しておりますのでご参照ください。

参考記事:Pythonで「REST API」を使用するまでの4つの手順について解説

APIでオーダーブックを取得する

APIでオーダーブック情報を取得するためには、oandapyV20.endpoints.instrumentsのInstrumentsOrderBookあるいはInstrumentsPositionBookを使います。

InstrumentsOrderBookでオープンオーダー、InstrumentsPositionBookでオープンポジションの情報を取得することができます。

オープンオーダーを取得する

次のコードでは、ドル円の最新のオープンオーダーを取得しています。


from oandapyV20.endpoints import instruments
from oandapyV20 import API

access_token = "APIトークンを設定してください"

client = API(access_token=access_token, environment="practice")
r = instruments.InstrumentsOrderBook(instrument="USD_JPY")

client.request(r)

print(r.response)

ドル円の最新のオープンオーダーを取得

ここでは一部の結果のみ表示しています。

結果はJson形式で、orderBookのなかにデータが格納されています。

bucketsに価格ごとのデータがあります。

オープンポジションを取得する

次にオープンポジションを取得してみます。

次のコードでは、ドル円の最新のオープンポジションを取得しています。


from oandapyV20.endpoints import instruments
from oandapyV20 import API

access_token = "APIトークンを設定してください"

client = API(access_token=access_token, environment="practice")
r = instruments.InstrumentsPositionBook(instrument="USD_JPY")

client.request(r)

print(r.response)

ドル円の最新のオープンポジションを取得

こちらも結果の一部のみを表示しています。

結果を見ると、内容はオープンオーダーとほとんど変わらないことがわかります。

orderBookがpositionBookに変わっているのみで、その他のデータ構造は同じです。

以降のコードでは、オープンオーダーのみを例に解説していきます。

日時を指定してオープンオーダーを取得する

次に日時を指定してオープンオーダーを取得します。

指定しないと最新のデータが取得されますが、特定の日時におけるデータを取得することも可能です。

オープンオーダーやオープンポジションのデータは5分間隔で更新されているので、日時を指定する際には、分の値に5で割り切れる数字を指定する必要があります。

次のコードでは、例として日本時間の2022年10月31日11時05分のデータを取得しています。


from oandapyV20.endpoints import instruments
from oandapyV20 import API
import datetime
import pytz

def convert_to_utc(dt):
    return dt.astimezone(pytz.utc).strftime("%Y-%m-%dT%H:%M:%SZ")


dt = datetime.datetime(2022, 10, 31, 11, 5)

params = {
    "time": convert_to_utc(dt)
}

access_token = "APIトークンを設定してください"

client = API(access_token=access_token, environment="practice")
r = instruments.InstrumentsOrderBook(instrument="USD_JPY", params=params)

client.request(r)

print(r.response)

日本時間の2022年10月31日11時05分のデータを取得

指定した日時のデータを取得することができました。

日時はUTCで指定する必要があるため、convert_to_utcという関数を定義して、日本時間をUTCに変換しました。

これで任意の日時におけるオープンオーダーとオープンポジションのデータを取得することができます。

オープンオーダーを棒グラフで可視化する

次に取得したオープンオーダーのデータを可視化する方法について解説します。

冒頭で紹介したような棒グラフで可視化することができると状況を簡単に把握することができます。

本記事では、オープンオーダーを冒頭で紹介したような棒グラフで示す方法と、さらにローソク足チャートの中にこの棒グラフを表示する方法について解説します。

棒グラフで可視化する

まずは単純な棒グラフで示してみます。

取得データをDataFrameに変換する

棒グラフで可視化するためには、データの加工が必要です。

まずは先ほど取得したデータをDataFrameに変換します。


import pandas as pd

df_orderbook = pd.DataFrame(r.response.get("orderBook").get("buckets"))
df_orderbook = df_orderbook.astype(float)
df_orderbook.head()

取得したデータをDataFrameに変換

価格情報を取得する

次に閾値となる価格情報を取得します。

過去の価格情報を取得するためには、oandapyV20.endpoints.instrumentsのInstrumentsCandlesを使います。

次のコードでは、先ほど例として使用した日本時間の2022年10月31日11時05分のドル円の価格を取得しています。


import oandapyV20.endpoints.instruments as instruments
from oandapyV20 import API
import datetime
import pytz


def convert_to_utc(dt):
    return dt.astimezone(pytz.utc).strftime("%Y-%m-%dT%H:%M:%SZ")


dt = datetime.datetime(2022, 10, 31, 11, 5)

# APIトークンの定義
access_token = "APIトークンを設定してください"

# パラメータの設定
params = {
    "granularity": "M1",
    "from": convert_to_utc(dt),
    "to": convert_to_utc(dt),
    "price": "M",
}

# 通貨ペアの設定
instrument = "USD_JPY" 

# API用のクラスを定義
client = API(access_token=access_token, environment="practice")

# 為替データを取得
r = instruments.InstrumentsCandles(instrument=instrument, params=params)
client.request(r)

print(r.response)

日本時間の2022年10月31日11時05分のドル円の価格を取得

candlesに価格データが格納されているので、これを取り出します。

文字列になっているのでfloatへの変換も必要になります。


price = float(r.response.get("candles")[0].get("mid").get("c"))
print(price)

文字列をfloatに変換

これで価格情報を取得することができました。

参考記事:Pythonで「REST API」から為替データを取得する方法について解説

matplotlibで棒グラフを描く

データの用意が整ったので、オープンオーダーを棒グラフで描いてみます。

次のコードでは、matplotlibを使ってオープンオーダーを棒グラフで可視化しています。

価格を閾値として色分けしています。

import matplotlib.pyplot as plt d = df_orderbook[(df_orderbook["price"]>price-5) & (df_orderbook["price"]<=price+5)] fig, ax = plt.subplots(figsize=(12, 10)) ax.barh(y=d[d["price"]>price]["price"], width=d[d["price"]>price]["longCountPercent"], height=0.05, color="orange") ax.barh(y=d[d["price"]<price]["price"], width=d[d["price"]<price]["longCountPercent"], height=0.05, color="lightblue") ax.barh(y=d[d["price"]>price]["price"], width=d[d["price"]>price]["shortCountPercent"]*-1, height=0.05, color="lightblue") ax.barh(y=d[d["price"]<price]["price"], width=d[d["price"]<price]["shortCountPercent"]*-1, height=0.05, color="orange") ax.axhline(price) ax.text(y=price,s=price, x=d["longCountPercent"].max()+0.05)

価格を閾値として色分け

冒頭で紹介したような棒グラフを表示することができました。

ローソク足チャートにオープンオーダーの棒グラフを表示する

次に上記の棒グラフをローソク足チャートに表示してみます。

ローソク足チャートに基づいて、どこに注文が集中しているのかが簡単に把握することができるので、売買判断の際にも有用です。

為替データの準備

まずはローソク足チャートを描くための為替データを用意します。

過去の価格情報を取得するためには、oandapyV20.endpoints.instrumentsのInstrumentsCandlesを使います。

次のコードでは、oandapyV20.endpoints.instruments.InstrumentsCandlesを使って直近500個のドル円の5分足のデータを取得しています。

さらに取得データをDataFrameに変換し、データの型変換も行っています。

APIを使って為替データを取得する方法については、こちらの記事で詳しく解説していますので、本記事では詳細の解説は割愛します。


import oandapyV20.endpoints.instruments as instruments
from oandapyV20 import API
import pandas as pd

# APIトークンの定義
access_token = "APIトークンを設定してください"

# パラメータの設定
params = {
    "granularity": "M5",  # ローソク足の間隔
    "count": 500,         # 取得する足数
    "price": "M",        # B: Bid, A:Ask, M:Mid
}

# 通貨ペアの設定
instrument = "USD_JPY"   

# API用のクラスを定義
client = API(access_token=access_token, environment="practice")

# 為替データを取得
r = instruments.InstrumentsCandles(instrument=instrument, params=params)
client.request(r)

# 為替データを格納するためのリストを定義
price_data = []

# データを1つずつ取り出してprice_dataに格納する
for row in r.response["candles"]:
    # 辞書を定義
    data = {}
    
    # dataに格納する
    data["datetime"] = row["time"]
    data.update(row["mid"])
    data["volume"] = row["volume"]
    
    # price_dataに追加する
    price_data.append(data)

# DataFrameに変換する
df = pd.DataFrame(price_data)

# カラム名の定義
columns = {
    "o": "open",
    "h": "high",
    "l": "low",
    "c": "close"
}

# カラム名の変更
df.rename(columns=columns, inplace=True)

# datetimeの型変換
datetime_format = "%Y-%m-%dT%H:%M:%S.000000000Z"
df["datetime"] = pd.to_datetime(df["datetime"], format=datetime_format)

# datatimeをindexに指定
df.set_index("datetime", inplace=True)

# 数値データをfloatに変換
df = df.astype(float)

df.head()

取得データをDataFrameに変換し、データの型変換

これで為替データの準備が整いました。

参考記事:Pythonで「REST API」から為替データを取得する方法について解説

オープンオーダーの準備

次にオープンオーダーのデータを用意します。

為替データの最新の日時のオープンデータを取得します。


df.tail()

為替データの最新の日時のオープンデータを取得

ここでの最新の日時情報は2022-11-18 21:55:00です。

この時点のオープンオーダーのデータを取得します。


from oandapyV20.endpoints import instruments
from oandapyV20 import API

params = {
    "time": df.index[-1].strftime("%Y-%m-%dT%H:%M:%SZ")
}

access_token = "APIトークンを設定してください"

client = API(access_token=access_token, environment="practice")
r = instruments.InstrumentsOrderBook(instrument="USD_JPY", params=params)

client.request(r)

df_orderbook = pd.DataFrame(r.response.get("orderBook").get("buckets"))
df_orderbook = df_orderbook.astype(float)
df_orderbook.head()

オープンオーダーのデータを取得

ローソク足チャートにオープンオーダーを表示する

必要なデータの準備が整ったので、ローソク足チャートにオープンオーダーを表示してみます。

ここではmplfinanceを利用してローソク足チャートを描いていきます。

mplfinanceでローソク足チャートを描くためには、plotを使います。


import mplfinance as mpf

# ローソク足チャートを表示
mpf.plot(df,type='candle', style="yahoo")

ローソク足チャートにオープンオーダーを表示

plotに、DataFrameを引き渡し、さらにtypeをcandleと指定するとローソク足チャートが表示されます。

styleをyahooを指定すると、yahoo financeのようなデザインになります。

DataFrameはindexを日時データとして、カラムは左からOpen, High, Low, Closeの順になっている必要があります。

最後に、このローソク足チャートに先ほどのオープンオーダーの棒グラフを表示させてみます。

直近の終値を閾値にして色分けも行いました。

また、オープンオーダーのデータは、為替データの終値の最小値と最大値で絞っています。


import mplfinance as mpf

# 直近の終値を取得
price = df["close"].tolist()[-1]

# オープンオーダーのデータを為替データの最小値と最大値で絞る
df_orderbook = df_orderbook[(df_orderbook["price"] > df["close"].min()) & (df_or
derbook["price"] < df["close"].max())]

# ローソク足チャートを表示
fig, ax = mpf.plot(df,type='candle', returnfig=True,style="yahoo")

# オープンオーダーを追加
vpax = fig.add_axes(ax[0].get_position())
vpax.set_axis_off()

vpax.barh(df_orderbook[df_orderbook["price"]>price]["price"], df_orderbook[df_orderbook["price"]>price]["longCountPercent"],  align='center', color='blue', alpha=0.5, height=0.01)
vpax.barh(df_orderbook[df_orderbook["price"]<price]["price"], df_orderbook[df_orderbook["price"]<price]["longCountPercent"],  align='center', color='orange', alpha=0.5, height=0.01)

vpax.barh(df_orderbook[df_orderbook["price"]>price]["price"], df_orderbook[df_orderbook["price"]>price]["shortCountPercent"]*-1,  align='center', color='orange', alpha=0.5, height=0.01)
vpax.barh(df_orderbook[df_orderbook["price"]<price]["price"], df_orderbook[df_orderbook["price"]<price]["shortCountPercent"]*-1,  align='center', color='blue', alpha=0.5, height=0.01)

mpf.show()

ローソク足チャートに先ほどのオープンオーダーの棒グラフを表示

ローソク足チャートに棒グラフを追加するには少し工夫が必要です。

まず、vpax = fig.add_axes(ax[0].get_position())で軸を追加します。

そしてこのvpaxに棒グラフを追加していけばローソク足チャートの上に棒グラフを重ねて表示することができます。

この際、alphaとheightを調整することで見やすくなります。

ローソク足チャートに重ねて表示することで、どこに注文が集中しているのかを視覚的に容易に把握することができるようになります。

本記事の執筆者:TAT

               
本記事の執筆者:TAT 経歴
TAT2016年大学院卒業後、外資系IT企業に入社。
その後は金融情報→不動産テック→アドテク企業で、Pythonを用いたプロセスオートメーション、ダッシュボード開発、データ分析、AI開発などの業務に従事。
プログラミングや株式投資に関する情報を発信する「気ままなブログ」を運営中。

「REST API」をさらに学びたい方へオススメのコンテンツ

API

OANDA証券では、「REST API」に関する記事を豊富に提供しています。
「REST API」を利用するための手順、プログラミング言語の一つPythonを使い「REST API」を使用するまでの手順など、初心者の方向けコンテンツも豊富にあるので、APIを使った取引を始めてみたい方はぜひ参考にしてください。
ただしAPIを利用した取引は、OANDA証券の口座開設+いくつかの条件があります。
事前に確認を行い、ぜひOANDA証券の口座を開設し「REST API」を使った取引をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » APIの使い方 » 「REST API」でOANDAオーダーブックを取得しローソク足チャートに表示する方法