APIの使い方

Pythonで「REST API」を利用して1分足で10pips変動したらLINEでアラート通知する方法


REST API(以下、API)を活用すれば、さまざまなシステムを開発することができます。

本記事では、PythonでAPIを利用して1分足で10pips以上の変動があればLINEでアラートを通知するシステムを作ります。

システムの流れは次の通りです。

  • 1.最新の1分足データを取得
  • 2.直近のローソク足データの高値と安値から差分を計算
  • 3.差分が10pips以上ならLINEでアラート通知

上記のチェックを1分ごとに行い、10pips以上の変動が確認されたらLINEでアラートを通知します。

STEP1: 最新の1分足データを取得

まずはAPIを使って最新の1分足のデータを取得します。

事前準備

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

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

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

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

1分足のローソク足データを取得する

ローソク足データを取得するためには、oandapyV20.endpoints.instruments.InstrumentsCandlesを使います。

次のコードでは、直近5分のドル円の1分足データを取得しています。


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

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

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

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

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

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

print(r.response)

直近5分のドル円の1分足データを取得

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

STEP2: 直近のローソク足データの高値と安値から差分を計算

次にAPIで取得したデータから直近のローソク足データを取得して、高値と安値の差分を計算します。

返り値の’candles’のなかには、ローソク足データが格納されています。

ここで気をつけなければいけないのが’complete’の値です。

これがFalseになっているとローソク足データはまだ更新中を意味します。

直近のローソク足を取得するには、’complete’がTrueになっていて、なおかつtimeが最新のものを抽出する必要があります。

次のコードでは、completeがTrueになっている最新のローソク足データを抽出しています。


for candle in r.response["candles"]:
    if candle["complete"]:
        last_data = candle
        
print(last_data)

completeがTrueになっている最新のローソク足データを抽出

‘complete’がTrueになっている場合にのみ値を抽出しています。

‘candles’のデータはtimeの古い順になっているため、上記のコードでlast_dataに最後に格納されているものが最新のデータになります。

抽出されたデータから、高値と安値の差分を計算します。


diff = float(last_data["mid"]["h"]) - float(last_data["mid"]["l"])
print(diff)

last_dataに最後に格納されているものが最新のデータ

返り値のローソク足データは全て文字列になっているので、floatに変換してから差分を計算しています。

STEP3: 差分が10pips以上ならLINEでアラート通知

このdiffが10pips以上であればLINEでアラートを通知します。

事前準備

Pythonを介してLINEでメッセージを送るためには、LINEのAPIが必要です。

本記事ではMessaging APIを使います。

Messaging APIを利用するためには、LINE Developersコンソールでチャネルを作成する必要があります。

以下の手順に従ってチャネルを作成してください。

  • 1. LINE Developersコンソールにログインする
  • 2. (初回ログイン時のみ)開発者情報を登録する
  • 3. 新規プロバイダーを作成する
  • 4. チャネルを作成する
  • 5. チャネルアクセストークンを発行する
  • 6. ボットを友達として追加する

1~4については、公式サイトで詳しい手順が説明されています。

「5. チャネルアクセストークンを発行する」および「6. ボットを友達として追加する」については、「Messaging API設定」から作成できます。

例として、FX Botというチャネルを作成しました。

「Messaging API設定」にはボット情報として、ボットのベーシックIDとQRコードがあります。

こちらを利用してボットを友達として追加することができます。

Messaging API設定」で友達として追加

また、「Messagin API設定」のページの一番下にチャネルアクセストークンを発行できるボタンがあります。

「Messagin API設定」のページの一番下のチャネルアクセストークンを発行できるボタン

こちらをクリックするとチャネルアクセストークンを発行できます。

チャネルアクセストークンを発行

PythonプログラムでLINEのMessaging APIを利用するために必要になるのは次の2つです。

  • 1.チャネルアクセストークン
  • 2.ユーザーID

チャネルアクセストークンは上記で発行したものを利用します。

ユーザーIDは「チャネル基本設定」の一番下で確認できます。

ユーザーIDは「チャネル基本設定」の一番下で確認

LINEでアラート通知を送信する

それでは、LINEでアラートを送信するPythonコードを書いていきます。

diffの値が10pips以上であればアラートを送信します。

ここではドル円を使っているので、10pipsは0.1円となります。


from linebot import LineBotApi
from linebot.models import TextSendMessage
import datetime

user_id = "ユーザーIDを設定してください"
channel_access_token = "チャネルアクセストークンを設定してください"


if diff >= 0.1:
    # define message
    now = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    text = "[{}]\nドル円 1分足: 10pips以上の変動が発生しました。".format(now)
    messages = TextSendMessage(text=text)
    
    # send alert
    line_bot_api = LineBotApi(channel_access_token)
    line_bot_api.push_message(user_id, messages=messages)

上記のコードで、ドル円で10pips以上の変動があれば、メッセージを作成してLINEでアラートを送信します。

テストでアラートを送信してみたところ、メッセージが届いていることが確認できました。

メッセージが届いていることが確認

上記のプログラムを毎分実行すれば、常に最新の1分足のデータをモニタリングすることができ、相場で変動があればすぐに察知することができるようになります。

アラートの基準は自由に変更できる

本記事では、10pipsをアラートのトリガーとしましたが、この基準値は自由に変更することが可能です。

例として、統計的な値を使った基準値の設定方法をご紹介します。

こちらのコードでは、過去5000分の1分足データを集計しています。


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

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

# パラメータの設定
params = {
    "granularity": "M1",  # 取得する足
    "count": 5000,         # 取得する足数
    "price": "M",        # B: Bid, A:Ask, M:Mid
}

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

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

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

# 高値と安値の差分を集計
diff_data = []

for candle in client.request(r)["candles"]:
    diff = float(candle["mid"]["h"]) - float(candle["mid"]["l"])
    diff_data.append(diff)

これをヒストグラムで示すと次のような形になります。


import seaborn as sns
sns.histplot(diff_data)

過去5000分の1分足データを集計ををヒストグラムで表示

これは対数正規分布と呼ばれる形で、各値の対数をとると正規分布になります。


import seaborn as sns
import numpy as np
sns.histplot(np.log(diff_data))

対数正規分布と呼ばれる形で、各値の対数をとると正規分布になります

この特性を活用すれば、平均値(m)と標準偏差(σ)から閾値を計算することができます。

m±2σには全体のデータの約95.45%が収まります。

m+2σ以上となる確率はわずか約2.275%です。

次のコードではm+2σとなる基準値を計算しています。


<# diffの対数を計算
log_diff_data = np.log(diff_data)

# -infをnanに変換
log_diff_data = np.where(log_diff_data==-np.inf, np.nan, log_diff_data)

# nanを排除して平均と標準偏差を計算
mean = np.nanmean(log_diff_data)
std = np.nanstd(log_diff_data)

# m+2σを計算
log_threshold = mean + (2*std)

# 指数をとって元の値に戻す
threshold = np.exp(log_threshold)

print(threshold)

m+2σとなる基準値を計算

計算した結果、約0.18となりました。

つまり、18pips以上の場合は異常値と判断できます。

この数値は取得するタイミングによって異なってくるので定期的に計算して基準値を計算して更新する必要があります。

この計算を行ったときは、日銀による為替介入が行われた直後でしたので、通常よりも基準値が大きくなっています。

このように、統計的な値を使ってアラートを送信する基準値を定義する方法も有効です。

まとめ

本記事では、PythonでAPIを利用して1分足で10pips以上の変動があればLINEでアラートを通知するシステムを作りました。

こういったシステムを活用すれば、常にチャートを確認していなくても、相場で変化が怒った際にはいち早く気づくことができるようになります。

ここでは基準値を10pipsとしましたが、任意の基準値を設定いただくことが可能です。

是非とも活用してみてください。

本記事の執筆者:TAT

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

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

API

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


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

この記事をシェアする

ホーム » APIの使い方 » Pythonで「REST API」を利用して1分足で10pips変動したらLINEでアラート通知する方法