4.1 KDJ 随机指标

 

4.1.1 KDJ 概念

KDJ 指标又叫随机摆动指标(Stochastics Oscillator),是由乔治·蓝恩博士所创,是一种实用的技术分析指标。它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具之一。
KDJ 指标由 k 线数值与 D 线数值和 J 线数值,共计三条曲线组合而成。并且三条曲线的数值只在 0—100 之间变动。其中波动最快速的是指标线 J,其次是指标线 K,波动最缓慢的是指标线 D。
KDJ 根据统计学原理,通过一个特定的周期(常为 9 日、9 周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值 RSV,然后根据平滑移动平均线的方法来计算 K 值、D 值与 J 值,并绘成曲线图来研判股票走势。

KDJ 计算主要有 4 步:
(1) 计算 RSV:RSV=(C-Ln)/(Hn-Ln)×100
C 为当天的收盘价;Ln 为之前 n 日内的最低价;Hn 为之前 n 日内的最高价。
(2)计算 K:K 值 =2/3×前一日 K 值 +1/3×当日 RSV
(3)计算 D:D 值 =2/3×前一日 D 值 +1/3×当日 K 值
(4)计算 J:J 值 =3* 当日 K 值 -2* 当日 D 值
若无前一日 K 值与 D 值,则可分别用 50 来代替

以代码 600000 的股票数据为例,计算其 9 日 KDJ 值

A
1 9
2 =T(“D://600000.csv”).select( 收盘价 >0)
3 =A2.sort(日期)
4 =A3.new(日期,max( 最高价 [1-A1:0]):Hn,min(最低价 [1-A1:0]):Ln,(收盘价 -Ln)/(Hn-Ln)*100:RSV)
5 =A4.derive(if(#>1,2/3*K[-1]+1/3*RSV,50):K,if(#>1,2/3*D[-1]+1/3*K,50):D,3*K-2*D:J)

A3 将 A2 按照日期升序排列
A4 计算 9 日最高价和最低价,进而计算 RSV
A5 分别带入递归公式计算 K、D、J 值

imagepng

4.1.2 KDJ 常见形态

KDJ 金叉:KDJ_K 上穿 KDJ_D
KDJ 死叉:KDJ_K 下穿 KDJ_D
KDJ 多头:KDJ_K 在 KDJ_D 上方
KDJ 空头:KDJ_K 在 KDJ_D 下方
继续上一小节代码:

A
6 =A5.derive(if(K>K[-1] && K>D && K[-1]<D[-1],1,0):KDJ 金叉)
7 =A6.derive(if(K<K[-1] && K<D && K[-1]>D[-1],1,0):KDJ 死叉)
8 =A7.derive(if(K>D,1,0):KDJ 多头,if(K<D,1,0):KDJ 空头 )
9
10 =A8.select(日期 >date(“2022-03-01”) )
11 =canvas()
12 =A11.plot(“DateAxis”,“name”:“x”)
13 =A11.plot(“NumericAxis”,“name”:“y”,“location”:2,“autoRangeFromZero”:12)
14 =A11.plot(“Line”,“markerStyle”:0,“lineColor”:-16777216,“axis1”:“x”,“data1”:A10.( 日期),“axis2”:“y”,“data2”:A10.(K))
15 =A11.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-256,“axis1”:“x”,“data1”:A10.( 日期),“axis2”:“y”,“data2”:A10.(D))
16 =A11.plot(“Legend”,“name”:“K”,“legendText”:“K”,“legendType”:3,“legendLineColor”:-16777216,“legendFillColor”:[“ChartColor”,0,true,-16777216,-16777216,0])
17 =A11.plot(“Legend”,“name”:“D”,“legendText”:“D”,“y”:0.3,“legendType”:3,“legendLineColor”:-256,“legendFillColor”:[“ChartColor”,0,true,-256,-256,0])
18 =A11.draw@p(800,400)

A6 判断是否出现 KDJ 金叉,是返回 1,否返回 0。金叉判断条件:KDJ_K(t) > KDJ_K (t-1) and KDJ_K (t) > KDJ_D (t) and KDJ_K(t -1) <KDJ_D (t-1)
A7 判断是否出现 KDJ 死叉,是返回 1,否返回 0。死叉判断条件:KDJ_K(t) < KDJ_K (t-1) and KDJ_K (t) < KDJ_D (t) and KDJ_K(t -1) >KDJ_D (t-1)
A8 判断多头和空头

imagepng

A9-A18 画图表示 K 值和 D 值走势,观察金叉和死叉形态

imagepng

图中圈 1,K 线上穿 D 线,金叉
圈 2,K 线下穿 D 线,死叉
圈 1 和圈 2 之间为多头,圈 2 之后出现空头

KDJ 顶背离:当 K 线图上的股票价格创一峰比一峰高时,其对应的 KDJ 值却是在高位上一峰比一峰低,形成价格位置与指标位置的明显反差。
KDJ 底背离:当股价 K 线图上的股票走势一谷比一谷低,股价在向下跌,而 KDJ 曲线图上的 KDJ 指标的走势是在低位一底比一底高,这叫底背离现象。
继续上述代码:

A
20 =A8.pselect@a(KDJ 死叉 >0)
21 =A8.new(收盘价,K,KDJ 死叉,A8(A20.select(~<A8.#).m(-2)). 收盘价: 收盘价 _last_ 死叉 2, A8(A20.select(~<A8.#).m(-2)).K:K_last_ 死叉 2)
22 =A21.derive(if( 收盘价 _last_ 死叉 2< 收盘价 && K<K_last_ 死叉 2 && KDJ 死叉 >0,1,0):KDJ 顶背离 )
23 =A8.pselect@a(KDJ 金叉 >0)
24 =A8.new(收盘价,K,KDJ 金叉,A8(A23.select(~<A8.#).m(-2)). 收盘价: 收盘价 _last_ 金叉 2, A8(A23.select(~<A8.#).m(-2)).K:K_last_ 金叉 2)
25 =A24.derive(if( 收盘价 _last_ 金叉 2> 收盘价 && K>K_last_ 金叉 2 && KDJ 金叉 >0,1,0):KDJ 底背离 )
26 =A8.derive(A22(#).KDJ 顶背离:KDJ 顶背离,A25(#).KDJ 底背离:KDJ 底背离 )
27
28 =A8.select(日期 >date(“2017-08-15”) && 日期 <date(“2017-11-01”) )
29 =canvas()
30 =A29.plot(“DateAxis”,“name”:“x”)
31 =A29.plot(“NumericAxis”,“name”:“y”,“location”:2,“autoRangeFromZero”:12)
32 =A29.plot(“NumericAxis”,“name”:“y2”,“location”:2,“autoRangeFromZero”:12,“scalePosition”:0)
33 =A29.plot(“Line”,“markerStyle”:0,“lineColor”:-16777216,“axis1”:“x”,“data1”:A28.( 日期),“axis2”:“y”,“data2”:A28.(K))
34 =A29.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-256,“axis1”:“x”,“data1”:A28.( 日期),“axis2”:“y”,“data2”:A28.(D))
35 =A29.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-65536,“axis1”:“x”,“data1”:A28.( 日期),“axis2”:“y2”,“data2”:A28.(收盘价))
36 =A29.plot(“Legend”,“name”:"K",“legendText”:“K”,“legendType”:3,“legendLineColor”:-16777216,“legendFillColor”:[“ChartColor”,0,true,-16777216,-16777216,0])
37 =A29.plot(“Legend”,“name”:“D”,“legendText”:“D”,“y”:0.3,“legendType”:3,“legendLineColor”:-256,“legendFillColor”:[“ChartColor”,0,true,-256,-256,0])
38 =A29.plot(“Legend”,“name”:“colse”,“legendText”:“close”,“y”:0.4,“legendType”:3,“legendLineColor”:-65536,“legendFillColor”:[“ChartColor”,0,true,-65536,-65536,0])
39 =A29.draw@p(800,400)

A20-A22 计算顶背离,判定条件:上两次出现死叉日的收盘价 < 当日收盘价 and 当日 K 值 < 上两次出现死叉日的 K 值 and KDJ 死叉 >0
A20 取出现死叉日的行号
A21 在上两次出现死叉日的数据中取收盘价和 macd_dif,分别命名为收盘价 _last_ 死叉 2 和 dif_last_ 死叉 2
A22 根据判定条件,判定是否顶背离,是返回 1,否返回 0
A23-A25 计算底背离,判定条件:上两次出现金叉日的收盘价 > 当日收盘价 and 当日 K 值 > 上两次出现金叉日的 K 值 and KDJ_ 金叉 >0
A31-A42 画图观察顶背离和底背离

imagepng

在上图箭头处,股价在持续上升,KDJ 指标已下降,出现顶背离
在下图箭头处,股价在持续下跌,KDJ 指标已上升,出现底背离


imagepng