什么是KDJ
说到KDJ,我们首先需要提到威廉指数,该指标的计算首先选定一个特定的时间跨度,比如14天,然后找出这一特定时间的最高价和最低价,构成一个价格变化区间,而后分析这一时间跨度最后一个时间点的收盘价与期间最高价和最低价的相对位置,以此来衡量市场的超买或超卖现象。
而KDJ指标最早是由芝加哥期货交易商George Lane提出的KD指标,该指标还被称为随机震荡指标。与威廉指数不同的是,该指标在收盘价与最高价和最低价的相对位置的比值上,融合了移动平均的思想,用更多的信息来捕捉市场的超买与超卖。顾名思义,KDJ就是比威廉指数多了一个J线,进一步提高了数据的准确度。
KDJ的计算公式
关于KDJ的计算,我们可以分为4个步骤:
(1)首先,需要计算RSV值,它的公式如下:
RSV=(第n天的收盘价-最近n天内的最低价)÷(最近n天内的最高价-最近n天内的最低价)*100
这个公式中,n为时间跨度,具体应用之时,视你需要观察的数据时间长度而定。而RSV取值范围在0~100之间,取值越大说明收盘价在价格区间中的相对位置越高,市场可能出现超买的现象,反之则出现超卖的现象。
(2)计算K值,K值由RSV值的指数移动平均(EMA)计算得到,即前一日的K值和当前RSV值经过一定权重调整后相加所得,计算公式如下:
K值=2/3前一日的K值+1/3当日RSV值
(3)计算D值,D值由K值的指数移动平均计算而来,即前一日的D值和当期K值经过一定权重调整后相加得到,计算公式如下:
D值=2/3前一日D值+1/3当日K值
(4)计算J值,J值是KD的辅助指标,进一步反映了K指标和D指标的乘离程度,计算公式如下:
J值=3K值-2D值
计算KDJ的值
这里,我们选择时间跨度为9日,也就是和之前讲解的均线一样。但和均线不同的是,前8日依旧有RSV值,但无效,第9日以及之后的数据才有效。
根据上面的公式,我们首先需要计算最近9天内的最低价以及最近9天内的最高价。这里,我们依旧使用前一章开头获取的歌尔股份k.xlsx文件中的股票数据。具体代码如下:
low_list = df["close"].rolling(9, min_periods=1).min() high_list = df["high"].rolling(9, min_periods=1).max()
得到这2个值后,我们就可以计算RSV值,具体的代码如下所示(套用公式1):
rsv = (df["close"] - low_list) / (high_list - low_list) * 100
得到RSV值之后,我们可以分别根据上面的公式推导出KDJ的值,具体代码如下所示:
df["K"] = rsv.ewm(com=2, adjust=False).mean() df["D"] = df["K"].ewm(com=2, adjust=False).mean() df["J"] = 3 * df["K"] - 2 * df["D"]
我们首先来分析一下ewm方法,其具体的定义如下:
DataFrame.ewm(self, com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0)
该方法为指数加权函数,当adjust为False时,是以递归方式计算加权平均值,公式如下所示:
当com为2时,则a=1/3,套用上图第2个公式,得出K值为(2/3)前一日的K值+1/3当日的RSV值,所以使用ewm就可以计算出K值。
而D值同样如此,只是RSV换成了K值。至于最后的J值,是最简单的,直接套用即可。
绘制KDJ曲线
既然KDJ的值都被计算出来了,那么曲线自然可以直接绘制出来,我们直接将3值代入到绘图库的方法中即可,具体代码如下所示(完整代码):
import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) df = pd.read_excel("歌尔股份k.xlsx") low_list = df["close"].rolling(9, min_periods=1).min() high_list = df["high"].rolling(9, min_periods=1).max() rsv = (df["close"] - low_list) / (high_list - low_list) * 100 df["K"] = rsv.ewm(com=2, adjust=False).mean() df["D"] = df["K"].ewm(com=2, adjust=False).mean() df["J"] = 3 * df["K"] - 2 * df["D"] plt.plot(df["date"], df["K"], label ="K") plt.plot(df["date"], df["D"], label ="D") plt.plot(df["date"], df["J"], label ="J") plt.legend() plt.show()
运行之后,显示的KDJ曲线如下:
KDJ指标我们就讲到这里,下一篇介绍MACD指标图绘制。