【Pythonテクニカル分析】RSIの算出
概要
Pythonを使用してRSIを算出していきたいと思います。今回はテクニカル分析の指標を簡単に計算することができるライブラリであるTA-Libを使用する方法とpandasだけを使用して手組で計算する方法の二つで試していきます。
TA-Libを用いる方法
まず初めにTA-Libをインストールする必要があります。インストール方法については以下に記載しています。
【Pythonテクニカル分析】TA-Libのインストール – IT Learning (obenkyolab.com)
TA-Libがインストールできていればあとは簡単にRSIを算出して描画することができます。以下が日経平均を取得して14日RSIを描画するコードです。pandas_DataReaderで取得した後にtalib.RSIメソッドを使用して計算しています。
# ライブラリの読み込み
import pandas_datareader as pdr
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import talib
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年前を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
# 終値のみを抽出
df.sort_values('Date', inplace=True) # 日付順にソート
# RSIを計算
rsi = talib.RSI(df['Close'], timeperiod=14)
# 描画
plt.plot(rsi, label='RSI')
plt.xlabel('date')
plt.ylabel('RSI')
plt.legend()
plt.show()
実際にRSIを計算している部分はrsi = talib.RSI(df[‘Close’], timeperiod=14)の部分で、非常に簡単に計算することができました。
手組でRSIを計算する場合
次にTA-Libを使わずに手組でRSIを計算してみます。今回はCutlerのRSIの計算式を使用したいと思います。定義は以下の通りとなっています。
RSI = n日間の値上がり幅合計 ÷ (n日間の値上がり幅合計 + n日間の値下がり幅合計) × 100
テクニカル指標一覧 – Wikipedia
この定義式を用いて算出してみたコードが以下になります。
# ライブラリの読み込み
import pandas_datareader as pdr
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import talib as ta
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年前を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
df.sort_values('Date', inplace=True) # 日付順にソート
# RSI算出
def nrsi(df_close, n):
df['Close_previous'] = df_close.shift(1) # 前回の終値を列として追加
df['Close_dif'] = df['Close']-df['Close_previous']
df['Close_dif_up'] = df['Close_dif'].mask(df['Close_dif'] < 0, 0) # 上昇した日以外を0にする
df['Close_dif_down'] = df['Close_dif'].mask(df['Close_dif'] > 0, 0) # 下落した日以外を0にする
df['n_up_sum']= df['Close_dif_up'].rolling(n).sum().abs() # 値上がり幅の合計
df['n_down_sum'] = df['Close_dif_down'].rolling(n).sum().abs() # 値下がり幅の合計
df['RSI'] = (df['n_up_sum'] / (df['n_up_sum'] + df['n_down_sum']))*100 # CulterのRSI計算
return df['RSI']
rsi = nrsi(df['Close'], 14)
# 描画
plt.plot(rsi, label='RSI')
plt.xlabel('date')
plt.ylabel('RSI')
plt.legend()
plt.show()
dataframeで値上がり幅と値下がり幅を追加し、rollingを用いることで計算しています。
TA-Libのグラフと若干異なっていますが、TA-LibはWilderのRSIの定義式を用いているか、修正移動平均によって計算している可能性もあると思われますが、正しく確認していないので分かりません。ただ、全体の傾向としては同じような形にはなりました。
まとめ
TA-libのほうが何も考えずに計算できるので楽でした。ただ、式を理解したかったり、TA-Libのインストールをするのが面倒な場合は手組でやってみて面白いと思います。