DMI(动向指标)
DMI 指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称 DMI”,也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI 指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
计算方法:
DMI 的计算方法比较复杂,需要计算 DI1(上升指标),DI2(下降指标),ADX(平均动向指数)和 ADXR 四个指标,计算过程中还要涉及到一些中间指标比如 TR,DMP,DMM 等
以日 DMI 为例,计算过程如下:
1. 计算每日真实波幅 TR,并对 N1 日的真实波幅求和,记作 TR_sum
真实波幅等于当日股价振幅、最高与昨收差价、最低与昨收差价中的最大值。
2. 计算上升动向值 DMP 和下降动向值 DMM
上升动向值 DMP,其数值等于当日的最高价减去前一日的最高价,如果 <=0 则 DMP=0。
下降动向值 DMM,其数值等于前一日的最低价减去当日的最低价,如果 <=0 则 DMM=0
再比较 DMP 和 DMM,较大的那个数字保持,较小的数字归 0
3. 分别对 N1 日 DMP 和 DMM 求和,记作 DMP_sum 和 DMM_sum
4. 上升指标 DI1=DMP_sum*100/TR_sum
5. 下降指标 DI2=DMM_sum*100/TR_sum
6. 计算 N2 日内的平均动向指数 ADX=MA(DX,N2)
其中,动向指数 DX 等于 DI1 和 DI2 间的差的绝对值除以总和的百分比
7. 计算评估数值 ADXR=(当日的 ADX+ 前 N2 日的 ADX)/2
例如计算浦发银行 2024 年 DMI 指标,N1、N2 分别取 14 和 6。
代码示例:
A | |
1 | 600000 |
2 | 2024-01-01 |
3 | 2024-12-31 |
4 | =call("adjustprice.splx", "", call("loadkday.splx", A1, A2,A3) ) |
5 | 14 |
6 | 6 |
7 | =A4.new(code,tdate,max(( high - low),abs(high - close[-1]),abs(low - close[-1])):TR, high - high [-1]:HD, low [-1]- low:LD) |
8 | =A7.derive(sum(TR[1-A5:0]):TR_sum, if(HD>0 && HD>LD,HD,0):DMP, if(LD>0 && LD>HD,LD,0):DMM, sum(DMP[1-A5:0]):DMP_sum, sum(DMM[1-A5:0]):DMM_sum) |
9 | =A8.derive(DMP_sum*100/TR_sum:DI1, DMM_sum*100/TR_sum:DI2, abs(DI1-DI2)/(DI1+DI2)*100:DX, avg(DX[1-A6:0]):ADX, (ADX+ADX[-A6])/2:ADXR) |
10 | =A9.new(code,tdate,DI1,DI2,ADX,ADXR) |
A1-A4 读取股票数据
A5-A6 输入 N1,N2
A7 计算 TR
A8 计算 TR_sum,DMP,DMM,DMP_sum,DMM_sum
A9 计算上升指标 DI1,下降指标 DI2,动向指数 DX,平均动向指数 ADX,评估数值 ADXR。
A10 返回需要的指标值。
也可以封装成脚本 dmi.splx,使用时直接调用。
脚本代码:
A | |
1 | =data.new(tdate,max((high - low),abs(high - close[-1]),abs(low - close[-1])):TR, high - high[-1]:HD, low[-1]- low:LD) |
2 | =A1.derive(sum(TR[1-N(1):0]):TR_sum, if(HD>0 && HD>LD,HD,0):DMP, if(LD>0 && LD>HD,LD,0):DMM, sum(DMP[1-N(1):0]):DMP_sum, sum(DMM[1-N(1):0]):DMM_sum) |
3 | =A2.derive(DMP_sum*100/TR_sum:DI1, DMM_sum*100/TR_sum:DI2, abs(DI1-DI2)/(DI1+DI2)*100:DX, avg(DX[1-N(2):0]):ADX, (ADX+ADX[-N(2)])/2:ADXR) |
4 | =A3.new(tdate,DI1,DI2,ADX,ADXR) |
参数:
data | 序表,某支股票的日线数据 |
N | Nx 日序列,如[14,6] |
返回数据集结构:
code | 股票代码 |
tdate | 日期 |
DI1 | 上升指标 |
DI2 | 下降指标 |
ADX | 平均动向指数 |
ADXR | 评估数值 |
例如,调用脚本计算浦发银行 2024 年收 DMI 指标,Nx 取 [14,6] 。
A | B | |
… | … | 读取股票数据 |
5 | =call("dmi.splx",A4,[14,6]) | 调用脚本计算 DMI |
运行效果: