「REST API」で為替データをリアルタイムに取得してチャートに反映させる方法
OANDAのREST API(以下、API)を使って、為替データをリアルタイムで取得してチャートに反映させる方法について解説します。
Pythonを使ってAPI経由で為替データを取得し、Plotlyを使ってリアルタイムでチャートに反映します。
事前準備
PythonでAPIを利用するためには、次の2点が必要です。
- 1.APIトークンの発行
- 2.oandapyV20のインストール
詳細についてはこちらの記事で解説しておりますのでご参照ください。
参考記事: Pythonで「REST API」を使用するまでの4つの手順について解説
為替の過去データをローソク足チャートで描く
まずはPlotlyを使って過去データからローソク足チャートを描いてみます。
最終的には過去データにリアルタイムデータを組み合わせて、チャートに反映させていきます。
過去データの取得
最初に、APIを使って過去の為替データを取得します。
ここでは例としてドル円の1分足のデータを使用します。
次のコードでは、ドル円の過去1時間分の1分足のデータを取得しています。
import oandapyV20.endpoints.instruments as instruments
from oandapyV20 import API
# APIトークンの定義
account_id = "アカウントIDを設定してください"
access_token = "APIトークンを設定してください"
# パラメータの設定
params = {
"granularity": "M1", # ローソク足の間隔
"count": 60, # 取得する足数
"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)
これでドル円の1分足のデータが取得できました。
ここからcandlesの中身を取り出して整形します。
import datetime
candles = {}
for candle in r.response.get("candles"):
dt = datetime.datetime.strptime(candle["time"][:-4], "%Y-%m-%dT%H:%M:%S.%f")
dt_jst = dt + datetime.timedelta(hours=9)
candles[dt_jst] = {
"open": float(candle["mid"]["o"]),
"high": float(candle["mid"]["h"]),
"low": float(candle["mid"]["l"]),
"close": float(candle["mid"]["c"])
}
candlesという辞書に過去データを格納しました。
これで過去データの取得は完了です。
参考記事: Pythonで「REST API」から為替データを取得する方法について解説
Plotlyでローソク足チャートを表示する
次にPythonのPlotlyを使って、取得したデータをローソク足チャートで表示します。
Plotlyを使うとインタラクティブなチャートを描くことができ、後述するリアルタイムのデータ更新にも対応可能です。
次のコードでは、先ほど用意したcandlesを使ってローソク足チャートを描いています。
import plotly.graph_objects as go
fig = go.Figure(
data=[
go.Candlestick(
x=list(candles.keys()),
open=[v["open"] for v in candles.values()],
high=[v["high"] for v in candles.values()],
low=[v["low"] for v in candles.values()],
close=[v["close"] for v in candles.values()])
]
)
fig.show()
Plotlyでローソク足チャートを描くには、plotly.graph_objects.Candlestickを使います。
ここでxに日時データ、さらに open(始値), high(高値), low(安値), close(終値)を指定すればローソク足チャートを描くことができます。
Plotlyで描くチャートはインタラクティブで、チャートを拡大・縮小したり、ホバーすると該当データが表示されたりします。
これでPlotlyを使ってローソク足チャートを描くことができました。
リアルタイムにチャートを更新する
次に、Plotlyでリアルタイムに更新されるチャートを作成してみます。
リアルタイムに更新される為替データを用意する
まずは為替データの準備です。
oandapyV20.endpoints.pricing.PricingStreamを使って、リアルタイムに更新される価格データを取得します。
次のコードではドル円のリアルタイムデータを取得しています。
from oandapyV20.endpoints.pricing import PricingStream
from oandapyV20 import API
# APIトークンの定義
account_id = "アカウントIDを設定してください"
access_token = "APIトークンを設定してください"
# パラメータの設定
params = {
"instruments": "USD_JPY"
}
# API用のクラスを定義
client = API(access_token=access_token, environment="practice")
# 為替データを取得
r = PricingStream(accountID=account_id, params=params)
client.request(r)
print(r.response)
返り値はgeneratorとなっており、これをforループで表示させるとデータが更新されるたびに新しいデータが表示されます。
for i in r.response:
print(i)
このデータを先ほどのPlotlyに反映させることで、リアルタイムにチャートを更新することができます。
参考記事: Pythonで「REST API」から為替データを取得する方法について解説
リアルタイムデータからローソク足を生成する
次にリアルタイムデータからローソク足を生成します。
リアルタイムデータには日時情報と価格情報しかありません。
ローソク足チャートを作成するためには、このデータをローソク足に変換する処理が必要です。
次のコードでは、リアルタイムデータを1分足のローソク足データに変換しています。
candles = {}
for i in r.response:
# typeがPRICEの場合のみ処理を続行する
if i.get("type") == "PRICE":
# 日時データを取得
dt = datetime.datetime.strptime(i.get("time")[:-4], "%Y-%m-%dT%H:%M:%S.%f")
# 日本時間に変換
dt_jst = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0) + datetime.timedelta(hours=9)
# bidsとasksからmid価格を計算
bid_price = float(i.get("bids")[0].get("price"))
ask_price = float(i.get("asks")[0].get("price"))
price = (bid_price + ask_price) / 2
# candlesを更新
if candles.get(dt_jst) is None:
candles[dt_jst] = {"open": price, "high": price, "low": price, "close": price}
else:
candle = candles.get(dt_jst)
candle["close"] = price
if price > candle["high"]:
candle["high"] = price
if price < candle["low"]:
candle["low"] = price
candles[dt_jst] = candle
これでリアルタイムデータを1分足のローソク足に変換することができます。
ポイントは、日本時間に変換する際に、秒を常に0にすることです。
これで1分単位のデータになります。
仮に5分足のローソク足に変換する場合には、「秒」は0にしたうえで、なおかつ「分」も5分刻みに指定する必要があります。
日本時間に変換した後は、価格情報の更新を行います。
candlesに特定の日時データが存在しない場合には、新規として追加します。
この際は始値、高値、安値、終値を全て同じ値とします。
すでにデータが存在する場合は、その値と比較して必要に応じてデータを更新します。
終値は常に更新し、既存の高値を現在の価格が上回っていれば高値を更新、安値を下回っていれば安値を更新します。
これでリアルタイムデータをローソク足に変換することができます。
リアルタイムデータをチャートに反映させる
最後に、このリアルタイムデータをPlotlyのローソク足チャートに反映させます。
過去データとリアルタイムデータを組み合わせて、Plotlyでリアルタイムに更新されるローソク足チャートを描きます。
まずは空のチャートを用意します。
import plotly.graph_objects as go
fig = go.FigureWidget()
fig.add_candlestick()
FigureWidget()でチャートを定義して、add_candlestickで空のローソク足チャートを追加します。
このローソク足チャートのデータを更新していくことで、リアルタイムにチャートに反映させることができます。
次のコードでは過去データとリアルタイムデータを組み合わせた為替データを準備しています。
Plotlyのデータを更新してリアルタイムにチャートに反映させています。
import oandapyV20.endpoints.instruments as instruments
from oandapyV20.endpoints.pricing import PricingStream
from oandapyV20 import API
import datetime
import pandas as pd
# APIトークンの定義
account_id = "アカウントIDを設定してください"
access_token = "APIトークンを設定してください"
"""
過去データの取得
"""
# パラメータの設定
params = {
"granularity": "M1", # ローソク足の間隔
"count": 60, # 取得する足数
"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)
candles = {}
for candle in r.response.get("candles"):
dt = datetime.datetime.strptime(candle["time"][:-4], "%Y-%m-%dT%H:%M:%S.%f")
dt_jst = dt + datetime.timedelta(hours=9)
candles[dt_jst] = {
"open": float(candle["mid"]["o"]),
"high": float(candle["mid"]["h"]),
"low": float(candle["mid"]["l"]),
"close": float(candle["mid"]["c"])
}
"""
リアルタイムデータの取得
"""
# パラメータの設定
params = {
"instruments": "USD_JPY"
}
# API用のクラスを定義
client = API(access_token=access_token, environment="practice")
# 為替データを取得
r = PricingStream(accountID=account_id, params=params)
client.request(r)
"""
リアリタイムデータをローソク足に変換して、Plotlyチャートを更新
"""
for i in r.response:
if i.get("type") == "PRICE":
# get dateime
dt = datetime.datetime.strptime(i.get("time")[:-4], "%Y-%m-%dT%H:%M:%S.%f")
dt_jst = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0) + datetime.timedelta(hours=9)
# get price
bid_price = float(i.get("bids")[0].get("price"))
ask_price = float(i.get("asks")[0].get("price"))
price = (bid_price + ask_price) / 2
price_dict[dt_jst] = price
if candles.get(dt_jst) is None:
candles[dt_jst] = {"open": price, "high": price, "low": price, "close": price}
else:
candle = candles.get(dt_jst)
candle["close"] = price
if price > candle["high"]:
candle["high"] = price
if price < candle["low"]:
candle["low"] = price
candles[dt_jst] = candle
# Plotlyチャートの更新
current_fig = fig.data[0] #既存データの取得
# 各データの更新
current_fig.x = list(candles.keys())
current_fig.open = [v["open"] for v in candles.values()]
current_fig.high = [v["high"] for v in candles.values()]
current_fig.low = [v["low"] for v in candles.values()]
current_fig.close = [v["close"] for v in candles.values()]
上記のコードを実行すると、先ほど定義した空のチャートが表示されます。
処理の流れとしては、まずはcandlesに過去データを格納します。
次にリアルタイムデータを取得し、ローソク足データに変換したうえでcandlesに更新していきます。
更新されたデータをPlotlyチャートに反映させればチャートにも自動で反映されるようになります。
これでリアルタイムで更新されるチャートを作成することができました。
ここにさらに移動平均線などのテクニカル指標を加えたりするとさらに分析に活用できるオリジナルのチャートを作成することができます。
このように、OANDAのAPIとPythonのPlotlyを組み合わせると、リアルタイムで更新されるチャートを簡単に作成することができます。
本記事の執筆者:TAT
本記事の執筆者:TAT | 経歴 |
---|---|
2016年大学院卒業後、外資系IT企業に入社。 その後は金融情報→不動産テック→アドテク企業で、Pythonを用いたプロセスオートメーション、ダッシュボード開発、データ分析、AI開発などの業務に従事。 プログラミングや株式投資に関する情報を発信する「気ままなブログ」を運営中。 |
「REST API」をさらに学びたい方へオススメのコンテンツ
OANDA証券では、「REST API」に関する記事を豊富に提供しています。
「REST API」を利用するための手順、プログラミング言語の一つPythonを使い「REST API」を使用するまでの手順など、初心者の方向けコンテンツも豊富にあるので、APIを使った取引を始めてみたい方はぜひ参考にしてください。
ただしAPIを利用した取引は、OANDA証券の口座開設+いくつかの条件があります。
事前に確認を行い、ぜひOANDA証券の口座を開設し「REST API」を使った取引をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。