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