ooFFiioo

V1

2023/02/19阅读:37主题:全栈蓝

ADTM探究

Q&A

ADTM 是什么?

ADTM 指标全称为动态买卖气指标(Adaptive Dynamic Trading Money Flow Index),是一种技术指标,用于衡量买卖气的强弱,以及股票或市场的趋势和力度。它是由市场分析师兼专家金志锡提出的一种技术分析工具。

ADTM 指标通过比较当前时段内开盘价向上涨的幅度和向下跌的幅度,来计算当前市场的人气情况,然后将这个值进行标准化,使其在-1 到 1 之间波动。

如果 ADTM 指标的值大于 0,表明市场人气较旺,多头力量占优势;如果 ADTM 指标的值小于 0,表明市场人气较低迷,空头力量占优势。因此,当 ADTM 指标上穿 0.5 时,说明市场人气较旺,通常为多头行情;当 ADTM 指标下穿-0.5 时,说明市场人气较低迷,通常为空头行情。

在实际交易中,当 ADTM 指标上穿 0.5 时,可以作为买入信号;当 ADTM 指标下穿-0.5 时,可以作为卖出信号。但需要注意的是,这只是一种参考,应该结合其他技术指标和基本面因素,综合考虑,做出交易决策。

ADTM 中的 DTM 和 DBM 做了什么?

在 ADTM 中,DTM 和 DBM 分别是用来衡量市场买气和卖气的指标。

在计算 DTM 和 DBM 的过程中,分别比较当日开盘价与昨日开盘价的大小关系。若当日开盘价高于昨日开盘价,则用当日的最高价减去开盘价作为 DTM 的值;否则用昨日开盘价减去当日的开盘价作为 DTM 的值。类似地,若当日开盘价低于昨日开盘价,则用开盘价减去当日的最低价作为 DBM 的值;否则用当日的开盘价减去昨日开盘价作为 DBM 的值。

DTM 和 DBM 的值分别反映了当日市场买气和卖气的强度。在 ADTM 中,通过将 DTM 和 DBM 分别在一段时间内求和,再用两者之差除以二者之和的最大值,得到 ADTM 值,从而衡量市场人气的方向和强度。

DTM 若当日开盘价高于昨日开盘价,则用当日的最高价减去开盘价作为 DTM 的值能表现出什么?

如果当日开盘价高于昨日开盘价,那么说明市场情绪较为乐观,此时以当日的最高价减去开盘价作为 DTM 的值,可以反映出当日市场向上的力量或者说买盘力量,因为当日最高价距离开盘价越远,说明当日市场上涨的幅度越大,市场情绪越乐观,买盘力量越强。所以当 DTM 值较高时,说明市场人气相对较旺,可能存在上涨的趋势。

为什么 STM 要将 20 天的 DTM 求和,乐观的情绪能够在 20 天中积累吗?

在股票市场中,交易者对于某个股票的情绪通常是在一段时间内逐渐积累和释放的,而不是瞬间形成。因此,使用一定的时间段(例如 20 天)来计算 DTM 的总和可以反映出市场乐观情绪在一段时间内的积累程度,也就是在这段时间内,多数交易者看涨该股票的信心度较高,从而反映在 DTM 上的总和也较大。

在技术分析中,使用滚动平均线或总和等技术指标来反映市场趋势或情绪变化的做法比较常见,其中 20 天是一种常用的时间窗口,通常被认为可以反映出一个月的交易行情,也可以根据具体情况选择不同的时间窗口。

ADTM 中为何需要使用 ADTM=(STM-SBM)/MAX(STM,SBM),它完成了什么?

ADTM 指标的计算使用的是 STM(上升动量线)和 SBM(下降动量线)的比值。它将市场上涨和下跌的力量进行比较,以反映市场的整体趋势。

STM 和 SBM 分别是 20 天内市场的上涨动量和下跌动量的累计值。如果 STM 大于 SBM,说明市场买盘力量比卖盘力量强,市场情绪较为乐观,ADTM 值将大于 0。反之,如果 STM 小于 SBM,说明市场卖盘力量比买盘力量强,市场情绪较为悲观,ADTM 值将小于 0。如果 STM 等于 SBM,说明市场上涨和下跌的力量相当,市场情绪比较平静,ADTM 值将等于 0。

将 STM 减去 SBM,再将差值除以二者中的最大值,就可以得到 ADTM 指标。这个指标的取值范围在-1 到 1 之间,越接近 1 表示市场买盘力量越强,越接近-1 则表示市场卖盘力量越强。通过观察 ADTM 的变化,可以判断市场情绪的变化,以辅助投资决策。

代码

trading view 实现

//@version=5

strategy(title="ADTM", shorttitle="ADTM", overlay=true)

n = input(20, title="N")

o = open

h = high

l = low



DTM = if o > o[1]

    math.max(h - o, o - o[1])

else

    0



DBM = if o < o[1]

    math.max(o - l, o[1] - o)

else

    0



STM = math.sum(DTM, n)

SBM = math.sum(DBM, n)



ADTM = (STM - SBM) / math.max(STM, SBM)

plot(STM,color = color.blue)

plot(SBM,color = color.red)




buySignal = ta.crossover(ADTM, 0.5)

sellSignal = ta.crossunder(ADTM, -0.5)



// 绘制买入和卖出信号箭头

// plotshape(buySignal, title="Buy Signal", location=location.belowbar, style=shape.arrowup, color=color.green,size = size.auto,text = '买',textcolor = color.black)

// plotshape(sellSignal, title="Sell Signal", location=location.abovebar, style=shape.arrowdown, color=color.red,size = size.auto,text = '卖',textcolor = color.black)



if (buySignal)

    strategy.entry("买入信号",strategy.long,1)

if (sellSignal)

    strategy.entry("卖出信号",strategy.short,1)

Python 实现

# ADTM 指标
"""
N=20
DTM=IF(OPEN>REF(OPEN,1),MAX(HIGH-OPEN,OPEN-REF(OP
EN,1)),0)
DBM=IF(OPEN<REF(OPEN,1),MAX(OPEN-LOW,REF(OPEN,1)-O
PEN),0)
STM=SUM(DTM,N)
SBM=SUM(DBM,N)
ADTM=(STM-SBM)/MAX(STM,SBM)
ADTM 通过比较开盘价往上涨的幅度和往下跌的幅度来衡量市场的
人气。ADTM 的值在-1 到 1 之间。当 ADTM 上穿 0.5 时,说明市场
人气较旺;当 ADTM 下穿-0.5 时,说明市场人气较低迷。我们据此构
造交易信号。
当 ADTM 上穿 0.5 时产生买入信号;
当 ADTM 下穿-0.5 时产生卖出信号。

"""

df['h_o'] = df['high'] - df['open']
df['diff_open'] = df['open'] - df['open'].shift(1)
max_value1 = df[['h_o''diff_open']].max(axis=1)
df.loc[df['open'] > df['open'].shift(1), 'DTM'] = max_value1
df['DTM'].fillna(value=0, inplace=True)

df['o_l'] = df['open'] - df['low']
max_value2 = df[['o_l''diff_open']].max(axis=1)
# DBM = pd.where(df['open'] < df['open'].shift(1), max_value2, 0)
df.loc[df['open'] < df['open'].shift(1), 'DBM'] = max_value2
df['DBM'].fillna(value=0, inplace=True)

df['STM'] = df['DTM'].rolling(n).sum()
df['SBM'] = df['DBM'].rolling(n).sum()
max_value3 = df[['STM''SBM']].max(axis=1)
df[factor_name] = (df['STM'] - df['SBM']) / max_value3

总结并改进

指标信号观察

BTC-USDT

Pasted image 20230219093631.png
Pasted image 20230219093631.png
image.png
image.png
image.png
image.png

CN50

image.png
image.png

总结

指标通过 N 求和一段时间内的多空占比,来衡量这段时间内多空的力量占比,但是对于波动幅度较差的情况来说,基本上就是在做垃圾的高买低卖。 指标有在波动率差的情况下精确度不足的问题,但是在波动幅度较大的情况下,一般能逃过危机及抓到大头,佐证如下: image.png 总结如下,该指标可以配合涨跌幅来做过滤,提高指标的正确率。

一种可能的改进

看了这个指标的实现,你想起什么了吗?是的,就是我们常用的 Cr 啊。

  1. 计算中间价(MM)= (最高价+最低价+2*收盘价)/4
  2. 计算 CR(n 日)= n 日内上升总值之和 / n 日内下降总值之和 其中,上升总值为 n 日内(MM 比前一日高)的股票个数之和,下降总值为 n 日内(MM 比前一日低)的股票个数之和。
  3. 计算 CRMA(m 日)= CR 的 m 日简单移动平均值 CR 指标的取值范围在 0-100 之间,一般认为当 CR 指标值高于 50 时,市场处于多头状态,当 CR 指标值低于 50 时,市场处于空头状态。

看了 Cr,我就想到用每日的中间价衡量多空双方的力量,实现如下:

//@version=5

strategy(title="ADTM", shorttitle="ADTM", overlay=true)

n = input(20, title="N")

o = open

h = high

l = low

c = close



average=(h+l+2*c)/4



DTM = if o > o[1]

    math.max(h - average, average - c[1])

else

    0



DBM = if o < o[1]

    math.max(average - l, c[1] - average)

else

    0



STM = math.sum(DTM, n)

SBM = math.sum(DBM, n)



ADTM = (STM - SBM) / math.max(STM, SBM)

plot(STM,color = color.blue)

plot(SBM,color = color.red)




buySignal = ta.crossover(ADTM, 0.5)

sellSignal = ta.crossunder(ADTM, -0.5)



// 绘制买入和卖出信号箭头

// plotshape(buySignal, title="Buy Signal", location=location.belowbar, style=shape.arrowup, color=color.green,size = size.auto,text = '买',textcolor = color.black)

// plotshape(sellSignal, title="Sell Signal", location=location.abovebar, style=shape.arrowdown, color=color.red,size = size.auto,text = '卖',textcolor = color.black)



if (buySignal)

    strategy.entry("买入信号",strategy.long,1)

if (sellSignal)

    strategy.entry("卖出信号",strategy.short,1)
image.png
image.png

比对

  1. 魔改 ADTM 平均线指标回测数据 image.png
image.png
image.png
image.png
image.png
image.png
image.png
  1. ADTM 标准版 image.png image.png
image.png
image.png

总结

指标确实反应了多空情绪的变化性,原始指标最好配合涨跌幅做限制,不然灵敏度过高 改版的指标则是因为用了平均,灵敏性差了很多,但是正确率做了点过滤,各有利弊吧

分类:

其他

标签:

金融

作者介绍

ooFFiioo
V1