# RSI ## rsi_1 ```python= import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime #整理檔案 dataname = '1722_2020.csv' SData = pd.read_csv(dataname, index_col = 'Date') SData.index = pd.DatetimeIndex(SData.index) #收盤價 close = SData.Close #每日漲跌 change = close - close.shift(1) #上漲幅度,nan以0填滿 change_p = pd.Series(index = change.index,data = change[change>0]) change_p = change_p.fillna(0) #下跌幅度,nan以0填滿,取正值所以加-號 change_n = pd.Series(index = change.index,data = -change[change<0]) change_n = change_n.fillna(0) ''' 計算n日平均漲跌幅 RSIn = 100 × 前n日漲幅的平均值 ÷ ( 前n日漲幅的平均值 + 前n日跌幅的平均值 ) ''' n = 9 #平均漲幅 up_mean = [0]*(n) #平均跌幅 down_mean = [0]*(n) #第一天沒有漲跌幅 for i in range(n+1,len(change)+1): up_mean.append(np.mean(change_p.values[i-n:i])) down_mean.append(np.mean(change_n.values[i-n:i])) #計算RSI rsi_n= [] for i in range(len(up_mean)): if (up_mean[i] + down_mean[i]) == 0: rsi_n.append(0) else: rsi_n.append(100 * up_mean[i] / (up_mean[i] + down_mean[i])) rsi_n_series = pd.Series(index = close.index, data = rsi_n) rsi_n_series = rsi_n_series.fillna(0) #設定策略 buyp = 30 sellp = 80 #訊號 signal = [] #庫存,只會是 0 or 1 stock = 0 cost = 0 benifit = 0 #偵測RSI訊號 for i in range(len(rsi_n_series)): if rsi_n_series[i] > sellp and stock ==1: stock -= 1 signal.append(-1) cost = benifit + close[i] * (1+0.001425) elif rsi_n_series[i] < buyp and stock == 0: stock += 1 signal.append(1) benifit = cost + close[i] * (1-0.004425) else: signal.append(0) rsi_sig = pd.Series(index = rsi_n_series.index, data = signal) #return print('cost:',cost) print('benifit:',benifit) n_income = benifit - cost n_return = n_income / cost print('return',n_return) ``` ## rsi_2 ```python= import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime def rsi(close,n): change = close - close.shift(1) #上漲幅度,nan以0填滿 change_p = pd.Series(index = change.index,data = change[change>0]) change_p = change_p.fillna(0) #下跌幅度,nan以0填滿,取正值所以加-號 change_n = pd.Series(index = change.index,data = -change[change<0]) change_n = change_n.fillna(0) #平均漲幅 up_mean_n = [] #平均跌幅 down_mean_n = [] #第一天沒有漲跌幅,計算平均漲跌幅 for i in range(n+1,len(change)+1): up_mean_n.append(np.mean(change_p.values[i-n:i])) down_mean_n.append(np.mean(change_n.values[i-n:i])) #計算RSI rsi_n = [0]*n for i in range(len(up_mean_n)): rsi_n.append(100 * up_mean_n[i] / (up_mean_n[i] + down_mean_n[i])) rsi_n_series = pd.Series(index = close.index, data = rsi_n) return rsi_n_series #整理資料 dataname = "0050_2020.csv" SData = pd.read_csv(dataname, index_col = 'Date') SData.index = pd.DatetimeIndex(SData.index) #收盤價 close = SData.Close rsi_fast = rsi(close,2) rsi_slow = rsi(close,14) ''' 策略:RSI_fast向上穿破RSI_slow買進,RSI_fast向下穿破RSI_slow賣出 ''' #訊號 signal = [] #庫存,只會是 0 or 1 stock = 0 #成本、獲益 cost = 0 benifit = 0 std = 50 #偵測RSI訊號 for i in range(len(close)): #buy if stock == 0: if (rsi_fast[i-1] < rsi_slow[i-1]) and (rsi_fast[i] > rsi_slow[i]) and (rsi_slow[i-1] > std): stock += 1 signal.append(1) cost = benifit + close[i] * (1+0.001425) else: signal.append(0) #sell elif stock == 1: if (rsi_fast[i-1] > rsi_slow[i-1]) and (rsi_fast[i] < rsi_slow[i]) and (rsi_slow[i-1] < std): stock -= 1 signal.append(-1) benifit = cost + close[i] * (1-0.004425) else: signal.append(0) rsi_sig = pd.Series(index = SData.index, data = signal) return_final = (benifit - cost) / cost print("cost:",cost) print("benifit:",benifit) print("return:",return_final) #plot from matplotlib import gridspec fig = plt.figure(figsize=(15,10)) gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) ax0 = plt.subplot(gs[0]) ax0.plot(rsi_fast) ax0.plot(rsi_slow) ax0.axhline(y=50, color='red') ax1 = plt.subplot(gs[1], sharex = ax0) ax1.plot(rsi_sig) ```