talib.PLUS_DM返回值为何超出[0,100]且对数值缩放敏感?
为何talib.PLUS_DM返回值超出[0,100]范围且对数值缩放敏感?
关于返回值超出[0,100]的问题
你混淆了PLUS_DM和PLUS_DI的概念:
- PLUS_DM是「正向动向值」,计算的是价格上涨方向的绝对波动幅度,本身没有归一化步骤,所以数值会随着标的价格的量级变化,完全可能超出0-100的范围。
- 而你印象中在0-100之间的是PLUS_DI(正向方向指数),它的计算逻辑是
PLUS_DI = (PLUS_DM / ATR) * 100,通过除以真实波幅(ATR)做了归一化,才会被限制在0-100区间内。
关于数值缩放敏感的问题
PLUS_DM的核心计算依赖价格的绝对差值:
- 首先计算相邻周期的「正向动向」:如果当前高点与前一高点的差值,大于前一低点与当前低点的差值,且该差值为正,就取这个差值作为当期的+DM,否则为0。
- 之后再对这些+DM值做指定周期的平滑处理(比如移动平均)。
整个过程都是基于价格的绝对变化量,而非相对比例(比如涨跌幅)。当你把所有价格除以10000时,相邻周期的高低点差值也会同步除以10000,最终的PLUS_DM结果自然也会按相同比例缩小,不存在所谓的「比例抵消」——因为它从设计上就是反映绝对波动的指标,而非相对波动。
复现代码及结果
import numpy as np import talib highs= np.array([39050.0, 39050.0, 39100.0, 39100.0, 39050.0, 39061.0, 39090.0, 39100.0, 39100.0, 39050.0, 39100.0, 39100.0, 39050.0, 39050.0, 39150.0, 39200.0, 39175.0, 39200.0, 39200.0, 39200.0, 39200.0,]) lows = np.array([39000.0, 39000.0, 39000.0, 39000.0, 39000.0, 39000.0, 39000.0, 39000.0, 39050.0, 39000.0, 39050.0, 39000.0, 39000.0, 39000.0, 39000.0, 39100.0, 39100.0, 39100.0, 39100.0, 39100.0, 39100.0,]) span =14 dmip = talib.PLUS_DM(highs, lows, span) # 输出结果 >>> dmip array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 150. , 239.28571429, 272.19387755, 252.75145773, 259.69778217, 241.14794059, 223.92308769, 207.92858143]) # 缩放价格后重新计算 highs = highs/10000 lows = lows/10000 dmip = talib.PLUS_DM(highs, lows, span) # 输出结果 >>> dmip array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 0.015 , 0.02392857, 0.02721939, 0.02527515, 0.02596978, 0.02411479, 0.02239231, 0.02079286])
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

