・RSIとは何かを知りたい
・RSIを利用したPython投資botを作りたい
こういった思いを持つ人に向けて記事を書いていきます。・RSIを利用したPython投資botを作りたい
この記事に書いてあること
・RSIとは一体何で、どういう風に使うのか・RSIを使用した仮想通貨の自動売買コード
目次
RSIとは、売られすぎ・買われすぎを判定するテクニカル指標
まず今回の主題であるRSIについて説明します。RSIは、ボリンジャーバンドやMACDと並んで有名なテクニカル指標です。
RSIを見ることで、テクニカル派のトレーダーはその銘柄が売られ過ぎなのか買われ過ぎなのかを判断します。
過去の価格データから計算されるRSIは、0〜100の値をとります。
一般的にRSIが30を下回ると売られすぎ、70を上回ると買われすぎと判断されることが多いですね。
具体的な定義
RSIの具体的な定義は以下のようになります。 一定期間の値上がり値の合計を、値上がりの合計と値下がりの合計(絶対値)で割って算出します。ものすごくシンプルな指標ですね。
(参考: RSIの計算方法 )
具体例も考えてみましょう。
例えば仮想通貨や為替、株などの価格が以下のように変化したとします。
100
120
90
110
100
この期間の価格の上昇と下落はそれぞれ次のようになります。120
90
110
100
+20
-30
+20
-10
この時例えばRSIの期間として「4」を使用すると、RSIは-30
+20
-10
(20+20)/{(20+20)+(30+10)}=0.5
と計算されるわけです。
見てわかるとおり、この計算式のRSIは0〜1の値を取ります。
厳密には、RSIの計算の流儀にも色々あるようです。 一般的にはこれに100をかけたものをRSIとして使いますが、本質的に同じことなので今回の実装では100をかけるのを省略することにしました。
場合によっては、こうやって計算した RSI を使って、また次の期間の RSI を計算していくというやり方もあるようです。
ですが今回はシンプルさを重視して上記の計算方法を使って行きます。
PythonでRSIを実装するには
さてここからはメジャーなプログラミング言語であるPython3を使ってRSIを実装する方法を見ていきましょう。参考:Pythonをインストールする方法(無料)
Pandasを使う方法
まずは、金融系のデータ分析で最も良く使うであろうライブラリのPandasを使った実装です。乱数を使って発生させたランダムなデータに対して RSI を計算してみます。
まずは、Pandasがまだ入っていない人はpipでインストールしておきます。
pip3 install pandas
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)
もしかすると、もっとスマートな実装があるかも知れません。
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)
これは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)
十分な量の日本円と Bitcoin を予め口座に入れておけば実際にRSIを使った自動の売買が成立します(ので注意してください)。
プログラム動作に必要なもの
補足として、このプログラムを動かすために必要なものについても最後に述べておきます。このコードはbitFlyerのAPIを使用しているので、bitFlyerの口座を事前に開設しておく必要があります。
>>無料でbitFlyerの口座を開設する
口座開設完了後、bitFlyerのサーバーにPythonプログラムから命令を出すのに必要な「APIキー」を発行します。
ログインページから、bitFlyer Lightningに進み、左メニューの「API」というところからAPIキーを作成することができます。
APIキーの発行手順は、下記記事でも画像付きで解説しているのでぜひ参考にしてみてください。
Bitcoinの自動売買のやり方!Pythonでbitflyer用の無料ツールを作る
その次は必要なライブラリをインストールします。
とはいってもコレはpipで入るので超簡単です。
pip3 install pybitflyer
これに加えて、長時間自動売買botを動作させる場合はVPSサーバーがあると便利です。
企業のVPSサーバーを借りることで、不意に自宅のPCの電源が落ちてプログラムが停止するアクシデントや電気代の問題から解放されます。
使い勝手のいいVPSサーバーについては下記記事も参考になると思います。
コメントを残す