最近在學(xué)習(xí)量化交易肩民,需要自己實現(xiàn)RSI指標(biāo),參考了TA-LIB的實現(xiàn)方式肮塞。
RSI英文全稱:Relative Strength Index
RSI中文名稱:相對強(qiáng)弱指數(shù)
是衡量價格波動的一個重要指標(biāo)舟扎。
計算公式
UP_AVG = UP_AMOUNT/PERIODS (周期內(nèi)上漲數(shù)量平均)
DOWN_AVG = DOWN_AMOUNT/PERIODS(周期內(nèi)下跌數(shù)量平均)
RS = UP_AVG/DOWN_AVG(相對平均)
RSI = 100 - 100 / (1 + RS) (相對強(qiáng)弱指數(shù))
快速計算公式
利用前一個UP_AVG, DOWN_AVG快速計算當(dāng)前UP_AVG, DOWN_AVG
UP_AVG = (UP_AVG_PREV * (PERIODS - 1) + UP) / PERIODS
DOWN_AVG = (UP_AVG_PREV * (PERIODS - 1) + DOWN) / PERIODS
RS = UP_AVG/DOWN_AVG
RSI = 100 - 100 / (1 + RS)
Python代碼實現(xiàn)
def RSI(t, periods=10):
length = len(t)
rsies = [np.nan]*length
#數(shù)據(jù)長度不超過周期,無法計算婿失;
if length <= periods:
return rsies
#用于快速計算;
up_avg = 0
down_avg = 0
#首先計算第一個RSI啄寡,用前periods+1個數(shù)據(jù)豪硅,構(gòu)成periods個價差序列;
first_t = t[:periods+1]
for i in range(1, len(first_t)):
#價格上漲;
if first_t[i] >= first_t[i-1]:
up_avg += first_t[i] - first_t[i-1]
#價格下跌;
else:
down_avg += first_t[i-1] - first_t[i]
up_avg = up_avg / periods
down_avg = down_avg / periods
rs = up_avg / down_avg
rsies[periods] = 100 - 100/(1+rs)
#后面的將使用快速計算;
for j in range(periods+1, length):
up = 0
down = 0
if t[j] >= t[j-1]:
up = t[j] - t[j-1]
down = 0
else:
up = 0
down = t[j-1] - t[j]
#類似移動平均的計算公式;
up_avg = (up_avg*(periods - 1) + up)/periods
down_avg = (down_avg*(periods - 1) + down)/periods
rs = up_avg/down_avg
rsies[j] = 100 - 100/(1+rs)
return rsies