RSI指数的计算非常简单,就是使用一段时间内的平均上涨除以平均上涨加平均下跌(取正值)。也就意味着RSI指数的取值是[0,100]之间,其中0表示周期内没有上涨的,100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期内的上涨力占总量的比例,值越高上涨力越强。超过70表示的是进入了超买阶段、低于30表示进入超卖阶段。
实际RSI的计算公式如下:
其中RS公式为:
所以:
也就是说,RSI指数实际上就是周期内的收盘价上升数值的均值比总变化值。
下面来实战一下:
这个图中可以看到最下面的RSI指数为11.72。说明这只ETF已经进入了超卖的状态;K线图显示最低报价都有成交,说明下行的力量比较强大,并且从半日的成交量来看成交量巨大,MACD比较胶着,KDJ指数可以看到J线有所放缓,有抬头趋势,但是K线还在D线之下,说明还未达到上涨要求。因此预判这只ETF可能会再下跌1-2天,然后再上涨。
下面是用AI写的一个Python模拟程序:
# -*- coding: GBK -*-
import numpy as np
import matplotlib.pyplot as plt
def calculate_RSI_array(d, n):
if len(d) <= n:
raise ValueError("Data length should be greater than the period.")
rsi_array = []
for i in range(n, len(d)):
data = d[i-n:i+1] #* 获得周期切片
gains = np.where(np.diff(data) >= 0, np.diff(data), 0) #* 获取数值上升的
losses = np.where(np.diff(data) < 0, -np.diff(data), 0) #* 获取数值下降的
avg_gain = np.mean(gains) #* 获取数值上升的均值
avg_loss = np.mean(losses) #* 获取数值下降的均值
rs = avg_gain / avg_loss #* 计算RS
rsi = 100 - (100 / (1 + rs)) #* 计算RSI
rsi_array.append(round(rsi, 2)) #* 将数值加到数组中
return rsi_array
data = np.random.rand(100)
period = 5
rsi_array = calculate_RSI_array(data, period)
x = np.arange(period, len(data))
plt.plot(x, rsi_array)
plt.xlabel('Time')
plt.ylabel('RSI')
plt.title('RSI Index')
plt.show()
运行结果可以得到一个RSI的折线图,使用matplotlib进行绘制: