技术分析有点像烹饪,收盘价、最值、成交量等是食材;均值,移动平均,方差等是烹饪方法。随意组合一下就是一个技术指标。
KDJ又称随机指标(随机这个名字起的很好)。KDJ的计算依据是最高价、最低价和收盘价。K、D、J 是图中的三条线。
要计算 KDJ,需要先计算价差 RSV,RSV=((收盘价-最低价)/(最高价-收盘价))*100
- K = RSV 的指数移动平均值(平滑因子=1/3)
- D = K 的指数移动平均值(平衡因子=1/3)
- J = K3 - D2
看到这个有没有有点眼熟,先求差值,然后做移动平均,然后再二次平均,最后再取差值。是哪个指标呢??
答案揭晓:MACD
我们直接来看KDJ 和 MACD 的代码,就能直观的看到两者的相似之处。
n = 9
m = 3
df['lowest low'] = df['low'].rolling(window=n).min()
df['highest high'] = df['high'].rolling(window=n).max()
df['RSV'] = (df['close'] - df['lowest low']) / (df['highest high'] - df['lowest low']) * 100
df['K'] = df['RSV'].ewm(adjust=False, alpha=1/m).mean()
df['D'] = df['K'].ewm(adjust=False, alpha=1/m).mean()
df['J'] = 3 * df['K'] - 2 * df['D']
df['EMA12'] = pd.DataFrame.ewm(df['close'],span=12).mean()
df['EMA26'] = pd.DataFrame.ewm(df['close'],span=26).mean()
df['DIF'] = pd.DataFrame.ewm(df['close'],span=12).mean() - pd.DataFrame.ewm(df['close'],span=26).mean()
df['DEA'] = pd.DataFrame.ewm(df['DIF'],span=9).mean()
df['OSC'] = df['DIF'] - df['DEA']
通过对比,我们可以发现:
- KDJ 比 MACD 多引入了最高价和最低价,在计算前后都进行了加权。
- KDJ 对比的是收盘价与最值间的差值,MACD 对比的是不同周期收盘价的差值。
- KDJ 反应的是同一周期内价格的波动程度,MACD 反应的是价格在一段时间的变化趋势。
具体代码我就不放了,因为和其他指标的实现方法基本相同。直接关门放 AI 就可以了。
题外话
在周期短的情况下,KDJ 指标的变化非常剧烈基本不具有指导意义,将计算周期拉长,更有参考意义。
网上很多文具在介绍 KDJ 时,都提到使用 KDJ 来预测转折点。对于至一点,我一直持怀疑态度。所有的技术指标都是根据历史数据计算出来的,依据的是历史信息,对未来的指导意义我认为是有限的。
技术指标用来做趋势的确认,我认为是合理的,但是充当预测的水晶球,就有点梦幻了。