【初心者向け】PythonでRSIを実装してbitFlyerでbitcoinを自動売買してみる

・RSIとは何かを知りたい
・RSIを利用したPython投資botを作りたい
こういった思いを持つ人に向けて記事を書いていきます。
この記事に書いてあること
・RSIとは一体何で、どういう風に使うのか
・RSIを使用した仮想通貨の自動売買コード
ちなみに、今回の記事の後半部分の自動売買コードはbitFlyerの口座で動作する仕様になっています。

RSIとは、売られすぎ・買われすぎを判定するテクニカル指標

まず今回の主題であるRSIについて説明します。
RSIは、ボリンジャーバンドやMACDと並んで有名なテクニカル指標です。

RSIを見ることで、テクニカル派のトレーダーはその銘柄が売られ過ぎなのか買われ過ぎなのかを判断します。
過去の価格データから計算されるRSIは、0〜100の値をとります。
一般的にRSIが30を下回ると売られすぎ70を上回ると買われすぎと判断されることが多いですね。

具体的な定義

RSIの具体的な定義は以下のようになります。
RSIの計算式
一定期間の値上がり値の合計を、値上がりの合計と値下がりの合計(絶対値)で割って算出します。
ものすごくシンプルな指標ですね。
(参考: RSIの計算方法

具体例も考えてみましょう。
例えば仮想通貨や為替、株などの価格が以下のように変化したとします。
100
120
90
110
100
この期間の価格の上昇と下落はそれぞれ次のようになります。
+20
-30
+20
-10
この時例えばRSIの期間として「4」を使用すると、RSIは

(20+20)/{(20+20)+(30+10)}=0.5

と計算されるわけです。
見てわかるとおり、この計算式のRSIは0〜1の値を取ります。

一般的にはこれに100をかけたものをRSIとして使いますが、本質的に同じことなので今回の実装では100をかけるのを省略することにしました。

厳密には、RSIの計算の流儀にも色々あるようです。

場合によっては、こうやって計算した RSI を使って、また次の期間の RSI を計算していくというやり方もあるようです。
ですが今回はシンプルさを重視して上記の計算方法を使って行きます。

PythonでRSIを実装するには

さてここからはメジャーなプログラミング言語であるPython3を使ってRSIを実装する方法を見ていきましょう。

参考:Pythonをインストールする方法(無料)

Pandasを使う方法

まずは、金融系のデータ分析で最も良く使うであろうライブラリのPandasを使った実装です。
乱数を使って発生させたランダムなデータに対して RSI を計算してみます。
まずは、Pandasがまだ入っていない人はpipでインストールしておきます。
pip3 install pandas
実装はこのようにすればOKのです。
import pandas as pd
import numpy as np

#RSIの計算に使う期間。14を使うことが多い。
duration = 14

#ランダムに生成した100個の価格データ
random_price = np.random.rand(100)

df = pd.DataFrame()
df["close-price"] = random_price

#上昇も下落もごっちゃになった値動きが得られる
df["close-price-diff"]=df["close-price"].diff()

#上昇と下落それぞれ専用のカラムを用意
df["up"]=df["close-price-diff"]
df["down"]=df["close-price-diff"]
df.loc[df['up'] <= 0, 'up'] = 0
df.loc[df['down'] > 0, 'down'] = 0

#それぞれの合計値を計算。(先述の"A"と"B"を計算している)
df["up-sum"]=df["up"].rolling(duration).sum().abs()
df["down-sum"]=df["down"].rolling(duration).sum().abs()

df["RSI"]=df["up-sum"]/(df["up-sum"]+df["down-sum"])

Latest_RSI=df["RSI"].iloc[-1]
print(Latest_RSI)
Pandasのデータフレーム上で愚直に計算していく感じですね。
もしかすると、もっとスマートな実装があるかも知れません。

TA-Libを使う方法

次はテクニカル系の指標を計算する時に便利なTa-Libというモジュールを使う方法です。
import talib as ta
import numpy as np

#ランダムの価格データ
random_price = np.random.rand(100)

rsi = ta.RSI(random_price, timeperiod=14)
print(rsi)
ちなみに同じ価格データに対しても、実行してみるとPandasでの実装とTA-Libの実装ではRSIの値が微妙に異なっていることに気付いた方がいると思います。

これはTA-Libの内部でのRSIの定義式が先述のものと微妙に異なっているからだと思われます。
TA-Libの方がコードの量がかなり少なくなりますが、その分改造しにくい面があります。
なので以下ではPandasを使った実装を元にして仮想通貨の自動売買にRSIを応用していきます。

仮想通貨の自動売買に応用した例

さて、ただ単にインジケーターのようなものを実装しても面白くありませんね。
ここでは、一歩進んでRSIに従って仮想通貨を自動売買するbotでも作ってみましょう。
具体的にはこんな動きをするプログラムを実装します。
RSI使用botの動作の内容
・動作後しばらくは何も取引せず、静かにビットコインの価格データを収集する
・ある程度価格データが集まったら、 数秒ごとにRSIを計算していく
・もしRSIが0.3以下になっていれば買い注文を出し、0.7以上なら売り注文を出す
・RSIの計算と注文を無限に繰り返す
それではさっそく実装していきましょう。

コード本体

まずはコートの本体を公開します。
import pybitflyer
import time
import pandas as pd

api_key = input("api_keyを入力し、Enterを押してください")
api_secret =input("api_secretを入力し、Enterを押してください")

#何秒足で価格の観察や売買注文を行うか
#僕がテストしたときは少しサーバーからの応答に遅延が見られたので誤差を相対的に小さくするために10秒以上を推奨。
interval_sec = 10

#取引するbitcoinの量
size = 0.005

#慣習的にRSIの期間が14とすることが多い
rsi_duration = 14

api = pybitflyer.API(api_key=api_key, api_secret=api_secret)

#最初は価格データをただ収集する
def BTC_price_collecting(samples=20):
    price_list=[]
    for _ in range(samples):
        price_list.append(api.ticker(product_code="BTC_JPY")["ltp"])
        time.sleep(interval_sec)
    return price_list

print("これからしばらく(デフォルトで200秒間)BTC価格データを収集します。その間何も表示されません。")
BTC_price_data = BTC_price_collecting()

df = pd.DataFrame()
df["close-price"]=BTC_price_data

while True:
    #最新の価格を取ってくる
    price_now = api.ticker(product_code="BTC_JPY")["ltp"]
    df=df.append({'close-price': price_now,}, ignore_index=True)

    #RSIの計算処理
    df["close-price-diff"]=df["close-price"].diff()

    df["up"]=df["close-price-diff"]
    df["down"]=df["close-price-diff"]
    df.loc[df['up'] <= 0, 'up'] = 0
    df.loc[df['down'] > 0, 'down'] = 0

    df["up-sum"]=df["up"].rolling(rsi_duration).sum().abs()
    df["down-sum"]=df["down"].rolling(rsi_duration).sum().abs()

    df["RSI"]=df["up-sum"]/(df["up-sum"]+df["down-sum"])

    Latest_RSI=df["RSI"].iloc[-1]

    if Latest_RSI > 0.7:
        print("RSIが0.7を超えました。売り注文を出します。RSIの値:"+str(Latest_RSI))
        print(api.sendchildorder(product_code="BTC_JPY",child_order_type="MARKET",side="SELL",size=size,minute_to_expire=10000,time_in_force="GTC"))

    elif Latest_RSI < 0.3:
        print("RSIが0.3を下回りました。買い注文を出します。RSIの値:"+str(Latest_RSI))
        print(api.sendchildorder(product_code="BTC_JPY",child_order_type="MARKET",side="BUY",size=size,minute_to_expire=10000,time_in_force="GTC"))

    else:
        print("取引はありません。")

    #先頭行を削除してdfの長さを一定に保つ(長時間の運用時のメモリ対策)
    df=df.drop(df.index[0])
    time.sleep(interval_sec)
先ほどのPandasによるRSIの実装をそのまま使い回しました。
十分な量の日本円と Bitcoin を予め口座に入れておけば実際にRSIを使った自動の売買が成立します(ので注意してください)。

プログラム動作に必要なもの

補足として、このプログラムを動かすために必要なものについても最後に述べておきます。
このコードはbitFlyerのAPIを使用しているので、bitFlyerの口座を事前に開設しておく必要があります。

>>無料でbitFlyerの口座を開設する

口座開設完了後、bitFlyerのサーバーにPythonプログラムから命令を出すのに必要な「APIキー」を発行します。
ログインページから、bitFlyer Lightningに進み、左メニューの「API」というところからAPIキーを作成することができます。

APIキーの発行手順は、下記記事でも画像付きで解説しているのでぜひ参考にしてみてください。

Bitcoinの自動売買のやり方!Pythonでbitflyer用の無料ツールを作る

その次は必要なライブラリをインストールします。
とはいってもコレはpipで入るので超簡単です。
pip3 install pybitflyer
コード実行時に、ターミナル上に先ほどの API キーを入力すればbotが動作すると思います。

これに加えて、長時間自動売買botを動作させる場合はVPSサーバーがあると便利です。
企業のVPSサーバーを借りることで、不意に自宅のPCの電源が落ちてプログラムが停止するアクシデントや電気代の問題から解放されます。
使い勝手のいいVPSサーバーについては下記記事も参考になると思います。

【初心者向け】FX・仮想通貨の自動売買用のVPSサーバーのオススメはコレ!

2021年3月20日
スポンサーリンク

SNSシェアお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA