2.6 MACD

 

2.6.1 MACD 概念

MACD(Moving Average Convergence and Divergence)是 Geral Appel 于 1979 年提出的,利用收盘价的短期(常用为 12 日)指数移动平均线(EMA)与长期(常用为 26 日)指数移动平均线 (EMA) 之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。

计算方法:
1、 离差值 DIF:
MACD _DIF=EMA(收盘价,12)-EMA(收盘价,26),EMA 采用收盘价计算
2、 根据离差值 DIF 计算其 9 日的 EMA,即离差平均值,是所求的 MACD 值。为了不与指标原名相混淆,此值又名 DEA 或 DEM。
MACD_DEA = EMA(MACD_DIF, 9)
计算出的 DIF 和 DEA 的数值均为正值或负值
3、 MACD 柱状值 = 2 *(MACD_DIFF - MACD_DEA)
故 MACD 指标是由两线一柱组合起来形成,快速线(白色线)为 DIF,慢速线(黄色线)为 DEA,柱状图为 MACD。

以代码 600000 的股票数据为例,计算其 MACD(12,26,9) 值

A
1 [12,26,9]
2 =T(“D://600000.csv”).select( 收盘价 >0)
3 =A1.(2/(~+1))
4 =A2.sort(日期)
5 =A4.new(日期, 收盘价,if(#>1,A3(1)* 收盘价 +(1-A3(1))*ema 短线 [-1], 收盘价 ):ema 短线,if(#>1,A3(2)* 收盘价 +(1-A3(2))*ema 长线 [-1], 收盘价 ):ema 长线)
6 =A5.derive(ema 短线 -ema 长线:macd_dif)
7 =A6.derive(if(#>1,A3(3)*macd_dif+(1-A3(3))*macd_dea[-1],macd_dif):macd_dea)
8 =A7.derive(2*(macd_dif-macd_dea):macd)

A3 循环 A1,计算出 3 个平滑系数 k
A4 将 A2 按照日期升序排列
A5 用递归公式计算 ema 短线和长线
A6 计算 macd_dif
A7 计算 macd_dea
A8 计算 macd 柱状值

imagepng

2.6.2 MACD 常见形态

MACD 金叉:MACD_DIF 上穿 MACD_DEA
MACD 死叉:MACD_DIF 下穿 MACD_DEA
MACD 多头:MACD_DIF 在 MACD_DEA 上方
MACD 空头:MACD_DIF 在 _DEA 下方
继续上一小节的代码:

A
9 =A8.derive(if(macd_dif>macd_dif[-1] && macd_dif>macd_dea && macd_dif[-1]<macd_dea[-1],1,0):macd 金叉)
10 =A9.derive(if(macd_dif<macd_dif[-1] && macd_dif<macd_dea && macd_dif[-1]>macd_dea[-1],1,0):macd 死叉)
11 =A10.derive(if(macd_dif>macd_dea,1,0):macd 多头,if(macd_dif<macd_dea,1,0):macd 空头 )
12
13 =A8.select(日期 >date(“2022-02-01”) )
14 =canvas()
15 =A14.plot(“DateAxis”,“name”:“x”)
16 =A14.plot(“NumericAxis”,“name”:“y”,“location”:2,“autoRangeFromZero”:12)
17 =A14.plot(“Line”,“markerStyle”:0,“lineColor”:-16777216,“axis1”:“x”,“data1”:A13.( 日期),“axis2”:“y”,“data2”:A13.(macd_dif))
18 =A14.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-256,“axis1”:“x”,“data1”:A13.( 日期),“axis2”:“y”,“data2”:A13.(macd_dea))
19 =A14.plot(“Legend”,“name”:"macd_dif",“legendText”:"macd_dif",“legendType”:3,“legendLineColor”:-16777216,“legendFillColor”:[“ChartColor”,0,true,-16777216,-16777216,0])
20 =A14.plot(“Legend”,“name”:“macd_dea”,“legendText”:“macd_dea”,“y”:0.3,“legendType”:3,“legendLineColor”:-256,“legendFillColor”:[“ChartColor”,0,true,-256,-256,0])
21 =A14.draw@p(800,400)

A9 判断每日是否出现金叉,是返回 1,否返回 0。判定条件:MACD_DIF(t) > MACD_DIF(t-1) and MACD_DIF(t) –MACD_DEA(t)> 0 and MACD_DIF(t-1) – MACD_DEA(t-1)< 0
A10 判断每日是否出现死叉,是返回 1,否返回 0。判定条件:MACD_DIF(t) <MACD_DIF(t-1) and MACD_DIF(t) –MACD_DEA(t)< 0 and MACD_DIF(t-1) – MACD_DEA(t-1)> 0
A11 判断每日是否多头和空头。判定条件 MACD_DIF(t) > MACD_DEA(t) 为多头,MACD_DIF(t) <MACD_DEA(t) 为空头。
A13-A21 用图形表示 DIF 和 DEA 走势,分析金叉死叉
A13 选择绘图时间段
A15 A16 定义横坐标 x 为日期轴,纵坐标 y 为数值轴
A17 A18 选择 x 和 y 轴数据
A19 A20 定义图例
A21 画图

imagepng

从图中可以看出圈 1 MACD_DIF 下穿 MACD_DEA,出现死叉
圈 2 MACD_DIF 上穿 MACD_DEA,出现金叉
圈 1 和圈 2 之间为空头,圈 2 之后为多头

MACD 顶背离:指当价格不断的创新高时, 但对应的 MACD 指标却没有相应的走高, 并未对价格走势进行有效的验证, 而是背离式的走低或走平钝化。
MACD 底背离:指当价格不断的创新低时, 对应的 MACD 指标却并未相应的走低, 并未对价格走势进行有效的验证, 而是背离式的走高或走平钝化。
继续代码:

A
23 =A11.pselect@a(macd 死叉 >0)
24 =A11.new( 收盘价,macd_dif,macd 死叉,A11(A23.select(<A11.#).m(-2)). 收盘价: 收盘价 _last_ 死叉 2, A11(A23.select(<A11.#).m(-2)).macd_dif:dif_last_ 死叉 2)
25 =A24.derive(if( 收盘价 _last_ 死叉 2< 收盘价 && macd_dif<dif_last_ 死叉 2 && macd 死叉 >0,1,0):macd 顶背离 )
26 =A11.pselect@a(macd 金叉 >0)
27 =A11.new( 收盘价,macd_dif,macd 金叉,A11(A26.select(<A11.#).m(-2)). 收盘价: 收盘价 _last_ 金叉 2, A11(A26.select(<A11.#).m(-2)).macd_dif:dif_last_ 金叉 2)
28 =A27.derive(if( 收盘价 _last_ 金叉 2> 收盘价 && macd_dif>dif_last_ 金叉 2 && macd 金叉 >0,1,0):macd 底背离 )
29 =A11.derive(A25(#).macd 顶背离:macd 顶背离,A28(#).macd 底背离:macd 底背离 )
30
31 =A8.select(日期 >date(“2007-03-01”) && 日期 <date(“2007-12-01”) )
32 =canvas()
33 =A32.plot(“DateAxis”,“name”:“x”)
34 =A32.plot(“NumericAxis”,“name”:“y”,“location”:2,“autoRangeFromZero”:12)
35 =A32.plot(“NumericAxis”,“name”:“y2”,“location”:2,“autoRangeFromZero”:12,“scalePosition”:0)
36 =A32.plot(“Line”,“markerStyle”:0,“lineColor”:-16777216,“axis1”:“x”,“data1”:A31.( 日期),“axis2”:“y”,“data2”:A31.(macd_dif))
37 =A32.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-256,“axis1”:“x”,“data1”:A31.( 日期),“axis2”:“y”,“data2”:A31.(macd_dea))
38 =A32.plot(“Line”,“shadow”:true,“markerStyle”:0,“lineColor”:-65536,“axis1”:“x”,“data1”:A31.( 日期),“axis2”:“y2”,“data2”:A31.(收盘价))
39 =A32.plot(“Legend”,“name”:"macd_dif",“legendText”:"macd_dif",“legendType”:3,“legendLineColor”:-16777216,“legendFillColor”:[“ChartColor”,0,true,-16777216,-16777216,0])
40 =A32.plot(“Legend”,“name”:“macd_dea”,“legendText”:“macd_dea”,“y”:0.3,“legendType”:3,“legendLineColor”:-256,“legendFillColor”:[“ChartColor”,0,true,-256,-256,0])
41 =A32.plot(“Legend”,“name”:“colse”,“legendText”:“close”,“y”:0.4,“legendType”:3,“legendLineColor”:-65536,“legendFillColor”:[“ChartColor”,0,true,-65536,-65536,0])
42 =A32.draw@p(800,400)

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

imagepng

上图中箭头处,股票价格还在持续上升,但 macd 指标背离式走低,出现顶背离
下图中箭头处,股票价格持续下跌,macd 指标背离式走高,出现底背离


imagepng