【Python×仮想通貨】RSIを活用した自動売買|ビットコインのテクニカル分析・取引入門

こんにちは、Kosei(@kay_diacc2)です!

こんな方におすすめ!
  • テクニカル分析を採用した仮想通貨の自動売買に興味がある
  • Pythonでオシレーター指標である「RSI」を用いた仮想通貨のテクニカル分析を実践したい
目次

RSIとは

RSI(Relative Strength Index)とは、現在の相場に対して、仮想通貨が「買われすぎか」「売られすぎか」を判断するためのの指標です。日本語で相対力指数とも呼ばれ、仮想通貨に限らず株やFX等にも広く利用されている代表的なオシレータ系指標になります。

RSIの計算式

RSIは、ある期間の平均上昇幅を同じ期間の平均下落幅で引いた値(RS)に基づき、割合として表現した指標です。RSIが取りうる範囲は0~100[%]であり、その値は一般的に下記のように考察されます。

RSIの考察
  • RSI = 70 〜 80% : 買われすぎ(売りのサイン
  • RSI = 20 〜 30% : 売られすぎ(買いのサイン

具体的な計算方法も確認し、RSIの算出イメージを掴んでおきましょう。

期間価格上昇・下落幅
1日目1,000円
2日目1,020円+20円
3日目1,010円-10円
4日目1,050円+40円
5日目1,090円+40円
6日目1,080円-10円
7日目1,110円+30円

上記表の場合、2日目からが前日比較できる起算日となるため、例えば5日間の価格データを取り込むには6日分のデータが必要になります。その上で期間を5日間としたRSIを計算する場合、下記のような手順で算出します。

  1. 5日間の平均上昇幅:(20 + 40 + 40 + 30)/5 = 26
  2. 5日間の平均下落幅:(10 + 10)/5 = 4
  3. RSを計算: RS = 26 – 4 = 22
  4. RSIを計算: RSI = 100 – 100/(1+22) = 95[%]

【参考】テクニカル分析採用の自動取引におすすめの暗号資産(仮想通貨)取引所

スクロールできます
取引所名最低取引量現物取引手数料*1入金手数料[円]入金手数料[BTC]出金手数料[円]送金手数料[BTC]信用取引API提供ccxt自動売買おすすめ
0.0001BTCMaker:-0.01%
Taker:0.05%
無料無料0円/
400円(大口出金)
無料×★★★★★
0.0001BTCMaker:-0.02%
Taker:0.12%
無料無料550円/
770円(3万円以上)
0.0006 BTC×★★★★☆
bitFlyer*20.001 BTC0.01〜0.15%0〜330 円無料220〜770 円0.0004 BTC★★★★☆
0.0001 BTC無料無料無料330 円無料××★★★★☆
0.0001 BTC無料無料無料330 円0.0005 BTC★★★★★
0.005 BTC無料無料無料407円0.0005 BTC×★★★★★
表:暗号資産取引所の比較表(最低取引量の単位はBTCで記載)
補足
  1. 現物取引手数料の対象通貨はBTC/JPY。手数料は約定数量 × 上記記載の割合[%]として算出可能。
  2. bitFlyerの取引手数料はLightningBTC現物の手数料を表示
  3. 期間限定で4/22〜6/30に口座開設&72時間以内入金を行うと、対象者全員に2,500円相当のビットコインプレゼントとのこと!

テクニカル分析を活用した自動取引を実践した場合、短期間での暗号資産の取引回数が増加する傾向にあります。さらに、自動取引の期間にデイトレードを採用した場合、なおさら増加すると言えます。

したがって、テクニカルトレードで取引利益を最大化したい場合は「取引手数料が安い取引所を選択する」ことを推奨します。

上記に示した暗号資産(仮想通貨)取引所は全てテクニカルトレードと相性が良いおすすめ取引所です。また、以下には仮想通貨の自動取引を実践する上で必須となるAPI利用方法についても言及しています。

APIの利用方法をマスターすると自動取引で実現できる幅も広がります。是非合わせてご参考下さい。

スクロールできます
API利用手順確認API利用手順確認API利用手順確認API利用手順確認API利用手順確認

【事前準備】Python環境の構築

RSIを用いた仮想通貨テクニカル分析を実行するために、Python環境を構築します。以下に示すパッケージを事前にインストールしておきましょう。

TA-Lib

Ta-Libはテクニカル分析結果を算出するためのパッケージです。以下、ご自身のOSに合ったインストール方法をご覧ください。

ccxt

デイトレ向けの仮想通貨の価格データ取得には、ccxtというパッケージを用います。次のようにインストールしましょう。

pip install ccxt

Yahoo Finance

スイングトレード向けの仮想通貨の価格データ取得には、Yahooファイナンスのパッケージを用いて取得します。

pip install yfinance

matplotlib

テクニカルチャートの可視化にはmatplotlibを用います。次のようにインストールしましょう。

pip install matplotlib

mlpfinance

上記と同じく、テクニカルチャートの可視化にはmplfinanceも用います。

pip install mplfinance

【デイトレ向け】PythonによるビットコインのRSIテクニカル分析

はじめに、上図の動画に示すような、 RSIに基づく仮想通貨テクニカル分析を実践するためのPythonプログラミング手法について解説します。

この見出しでは、データの期間はデイトレード向けに秒単位を例として紹介します。スイング・長期トレードにも対応したプログラミング手法は後述の見出しで言及しています。

今回RSIを計算するのに用いる仮想通貨データには、コインチェック取引所のビットコイン価格を採用しています。また、このデータの取得手段にはコインチェックが提供するAPIを利用しています。

コインチェックAPIの詳しい利用方法を知りたい」または「仮想通貨注文機能も理解して、本件紹介の移動平均線を組み合わせた自動売買ツールを完成させたい」という方向けに、下記の記事を配信しています。合わせてご覧ください。

Pythonライブラリ呼出

テクニカル分析、データ取得・加工およびグラフ可視化を用途としたPythonライブラリをインポートします。

# テクニカル分析
import talib

# データ取得・加工
import ccxt
import json
import pandas as pd

# グラフの可視化で利用
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
from matplotlib import rcParams
rcParams["font.family"]     = "sans-serif"
rcParams["font.sans-serif"] = "Hiragino Maru Gothic Pro"
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')

ビットコインの価格情報取得

リアルタイムにビットコイン価格を取得する関数と出力イメージを以下記述します。

# コインチェックオブジェクト
base = ccxt.coincheck()

# 板情報取得関数
def ticker_info():
    symbol = "BTC/JPY"
    result = base.fetch_ticker(symbol)
    return result
# 関数実行
print(ticker_info())

# 出力イメージ
#     'symbol': 'BTC/JPY',
#        'bid': '5262277.0',
#        'ask': '5264471.0',       ★この値を今回利用
#       'high': '5471000.0',
#        'low': '5240000.0',
#     'volume': '1574.78371738',
#  'timestamp': '1649462093'

RSIの指標算出・グラフ可視化

前述の関数でRSIのテクニカル指標を計算し、グラフとして可視化します。次のように記載しましょう。

# グラフ軸
index        = count() # x軸(カウント)
x            = []      # x軸
bctPrice     = []      # ビットコイン価格

# グラフ可視化関数
def animate(i):

    # X軸データ追加
    x.append(next(index))

    # コインチェック価格取得
    bctPrice.append(ticker_info()["ask"])

    # 引数情報
    period = 14

    # RSIの算出プログラム
    RSI = talib.RSI(pd.Series(bctPrice),   # 価格データ
                    period)                # データ取得期間

    # RSI評価
    try:
        RSI_New = int(RSI[len(RSI)-1])
        if RSI_New > 80:
            text = "[買われすぎ!]"
        elif RSI_New < 20:
            text = "[売られすぎ!]"
        else:
            text = ''
    except ValueError:
        RSI_New = None
        text = ''

    # グラフ設定
    plt.cla()
    if text == '':
        plt.title("RSI: "+str(RSI_New)+"%"+text)
    else:
        plt.title("RSI: "+str(RSI_New)+"%"+text, color="red")
    plt.xlabel("時間")
    plt.ylabel("Bitcoin価格[BTC]")
    plt.plot(x, bctPrice, label="Bitcoin価格")
    plt.legend(loc="upper left")
    plt.tight_layout()

# アニメーショングラフ適用
ani = FuncAnimation(plt.gcf(),animate,interval=1000)

# グラフ表示
plt.tight_layout()
plt.show()

ここではRSIはTA-Libライブラリのtalib.RSI()メソッドを用いて算出しています。このメソッドに用いる引数情報は下記になります。ポイントは第一引数のデータ取得元であり、ここに期間の異なるデータを指定することで、デイトレだけでなく、スイングトレードおよび長期トレードに応用可能です。

# 引数情報
period = 10

# RSIの算出プログラム
RSI = talib.RSI(data['Price Data'],   # 価格データ
                period                # データ取得期間
                )
pprint(RSI)

【まとめ】プログラミングコード全量

前述したプログラミングコードの全量を以下にまとめて示します。

Pythonスクリプトを実行し、ビットコイン価格とRSIの推移を観察してみましょう!

# テクニカル分析
import talib

# データ取得・加工
import ccxt
import json
import pandas as pd

# グラフの可視化で利用
from time import sleep
from itertools import count
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
from matplotlib import rcParams
rcParams["font.family"]     = "sans-serif"
rcParams["font.sans-serif"] = "Hiragino Maru Gothic Pro"
plt.style.use('fivethirtyeight')
mpl.use('TkAgg')

# コインチェックオブジェクト
base = ccxt.coincheck()

# 板情報
def ticker_info():
    symbol = "BTC/JPY"
    result = base.fetch_ticker(symbol)
    return result

# グラフ軸
index        = count() # x軸(カウント)
x            = []      # x軸
bctPrice     = []      # ビットコイン価格

# グラフ可視化関数
def animate(i):

    # X軸データ追加
    x.append(next(index))

    # コインチェック価格取得
    bctPrice.append(ticker_info()["ask"])

    # 引数情報
    period = 14

    # RSIの算出プログラム
    RSI = talib.RSI(pd.Series(bctPrice),   # 価格データ
                    period)                # データ取得期間

    # RSI評価
    try:
        RSI_New = int(RSI[len(RSI)-1])
        if RSI_New > 80:
            text = "[買われすぎ!]"
        elif RSI_New < 20:
            text = "[売られすぎ!]"
        else:
            text = ''
    except ValueError:
        RSI_New = None
        text = ''

    # グラフ設定
    plt.cla()
    if text == '':
        plt.title("RSI: "+str(RSI_New)+"%"+text)
    else:
        plt.title("RSI: "+str(RSI_New)+"%"+text, color="red")
    plt.xlabel("時間")
    plt.ylabel("Bitcoin価格[BTC]")
    plt.plot(x, bctPrice, label="Bitcoin価格")
    plt.legend(loc="upper left")
    plt.tight_layout()

# アニメーショングラフ適用
ani = FuncAnimation(plt.gcf(),animate,interval=1000)

# グラフ表示
plt.tight_layout()
plt.show()

【スイング・長期トレード向け】Pythonによる仮想通貨のRSIテクニカル分析

続いて、スイング・長期トレーダー向けに、上記のような広範囲のデータ期間を対象とするRSIのテクニカルチャート算出方法を解説します。

最下の赤い折れ線グラフがRSIのチャートを示したものです。最上のグラフは日足のビットコイン価格データであり、真ん中のグラフは出来高を表しています。

前述のデイトレ向けプログラムと近しい内容が多いため、こちらのコードは全量を下記に記載します。

import talib
import numpy as np
import pandas as pd
import yfinance
import mplfinance as mpf


"""
*******************************************************
① データ取得
*******************************************************
""" 

# 引数情報
symbol = "BTC-JPY"  # 仮想通貨の銘柄を指定
period = "max"      # データ取得範囲を指定

data = yfinance.Ticker(symbol).history(period=period)

""" 
*******************************************************
② RSI 
*******************************************************
"""

# RSIの期間
period = 12

# RSIの算出プログラム
RSI = talib.RSI(data['Close'],   # 価格データ
                period)          # データ取得期間

# データフレーム作成
data["RSI"] = RSI

"""
*******************************************************
③ グラフ可視化
*******************************************************
"""

# データ分析範囲(直近3ヶ月分を指定)
period = 90
data   = data.tail(period)

# グラフ可視化
rsi  = [
         mpf.make_addplot(data["RSI"], panel=2, color='red'),
         ]

mpf.plot(data, # データ 
         type='candle',     # グラフの種類('candle', 'line')
         volume=True,       # 出来高の表示有無
         style='yahoo',     # グラフスタイル
         addplot=rsi,       # 連結するグラフ情報
        )

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

テクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

テクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる