Python 实现 ADTM 指标计算:股票技术分析的利器系列(9)

本文详细介绍了如何使用Python计算ADTM指标,这是一种衡量股票市场买卖双方力量对比的技术分析工具。涉及的核心代码包括rolling函数和np.where函数的使用,以及动态买盘指标(DTM)、动态卖盘指标(DBM)、STM、SBM和ADTM的计算方法。最后展示了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


介绍

ADTM(动态买卖气指标)是一种用于衡量市场买卖力量对比的指标。它通过计算动态买盘指标(DTM)和动态卖盘指标(DBM)之间的差值来反映买卖双方的力量对比情况。

简单点说,就是看买家和卖家谁更强的一个东西。就是算一算买盘(DTM)和卖盘(DBM)的活跃程度谁大,谁小。如果ADTM是正的,那就意味着买家比较牛,行情可能朝上走;反之,如果ADTM是负的,那就表示卖家势头强,股市可能往下走。所以,瞅瞅ADTM的数字,投资者就能稍微明白点市场的味道,更容易决定接下来是涨是跌。当然,有些人还会把ADTM搞个移动平均(MAADTM),就是为了数据更平滑些,看长期的买卖势头走向。

先看看官方介绍:

ADTM(动态买卖气指标)
用法
1.该指标在+1到-1之间波动;
2.低于-0.5时为很好的买入点,高于+0.5时需注意风险。

算法解释

DTM:=IF(OPEN<=REF(OPEN,1),0,MAX((HIGH-OPEN),(OPEN-REF(OPEN,1))));
DBM:=IF(OPEN>=REF(OPEN,1),0,MAX((OPEN-LOW),(OPEN-REF(OPEN,1))));
STM:=SUM(DTM,N);
SBM:=SUM(DBM,N);
ADTM:IF(STM>SBM,(STM-SBM)/STM,IF(STM=SBM,0,(STM-SBM)/SBM));
MAADTM:MA(ADTM,M);
指标描述
DTM(动态买盘指标)衡量股价上涨时买盘活跃程度的累加成交量
DBM(动态卖盘指标)衡量股价下跌时卖盘活跃程度的累加成交量
STM(动态买盘指标和)买盘活跃程度总和(上涨时)
SBM(动态卖盘指标和)卖盘活跃程度总和(下跌时)
ADTM(动态买卖气指标)买卖气势指标,DTM和DBM之差
MAADTM(ADTM的移动平均值)ADTM的移动平均值,用于观察长期买卖气势趋势

核心代码

rolling函数介绍

rolling 函数通常与其他函数(如 meansumstd 等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。

以下是 rolling 函数的基本语法:

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  • window: 用于计算统计量的窗口大小。
  • min_periods: 每个窗口最少需要的非空观测值数量。
  • center: 确定窗口是否居中,默认为 False
  • win_type: 窗口类型,例如 Noneboxcartriang 等,默认为 None
  • on: 在数据帧中执行滚动操作的列,默认为 None,表示对整个数据帧执行操作。
  • axis: 执行滚动操作的轴,默认为 0,表示按列执行操作。
  • closed: 确定窗口的哪一端是闭合的,默认为 None

计算 DTM

如果当天的开盘价小于等于前一天的开盘价,这意味着当天的股价下跌或者持平,那么对应的 DTM 值就是 0。
如果当天的开盘价大于前一天的开盘价,这意味着当天的股价上涨,那么我们要比较两者之间的差值。具体计算方式是用当天的最高价减去当天的开盘价,和前一天的开盘价减去前一天的开盘价的差值,然后取较大的那个差值作为 DTM 的值。

DTM = np.where(df['OPEN'] <= df['OPEN'].shift(1), 0,
                   np.maximum(df['HIGH'] - df['OPEN'], df['OPEN'] - df['OPEN'].shift(1)))
np.where 使用介绍

np.where 是 NumPy 库中的一个函数,用于根据条件返回输入数组中的元素。让我用更简单的语言解释一下 np.where 的作用:

这个函数有三个参数:条件、满足条件时返回的值、不满足条件时返回的值。它的作用就是根据条件来选择返回的值。

例如,假设我们有一个数组 arr,我们想要根据数组中的每个元素是否大于 0 来返回对应的值,如果大于 0,我们返回 'positive',否则返回 'non-positive',可以这样使用 np.where

import numpy as np

arr = np.array([1, -2, 3, -4, 5])
result = np.where(arr > 0, 'positive', 'non-positive')
print(result)

输出结果将会是 ['positive' 'non-positive' 'positive' 'non-positive' 'positive'],这就是根据条件返回的结果。

np.maximum

np.maximum 是 NumPy 库中的一个函数,用于比较两个数组中对应位置的元素,并返回一个新数组,该数组包含每个位置上两个数组中较大的元素。

让我用更简单的语言解释一下 np.maximum 的作用:

假设我们有两个数组 arr1arr2,它们有相同的形状(即相同的行数和列数)。我们想要创建一个新的数组,其中的每个元素都是对应位置上 arr1arr2 中较大的元素。这时我们就可以使用 np.maximum 函数。

例如,假设我们有以下两个数组:

import numpy as np

arr1 = np.array([1, 3, 5, 7])
arr2 = np.array([2, 4, 6, 8])

我们可以使用 np.maximum 函数来比较这两个数组中的元素:

result = np.maximum(arr1, arr2)
print(result)

输出结果将会是 [2 4 6 8],这个新数组中的每个元素都是对应位置上 arr1arr2 中较大的元素。

计算 DBM

如果当天的开盘价大于等于前一天的开盘价,这意味着当天的股价上涨或者持平,那么对应的 DBM 值就是 0。
如果当天的开盘价小于前一天的开盘价,这意味着当天的股价下跌,我们要比较两者之间的差值。具体计算方式是用当天的开盘价减去当天的最低价,和前一天的开盘价减去前一天的开盘价的差值,然后取较大的那个差值作为 DBM 的值。

DBM = np.where(df['OPEN'] >= df['OPEN'].shift(1), 0,
                   np.maximum(df['OPEN'] - df['LOW'], df['OPEN'] - df['OPEN'].shift(1)))

计算 STM

首先,将动态买盘指标(DTM)转换为 Pandas 的 Series 类型。
然后,使用 rolling 方法创建一个滚动窗口对象,该对象会在指定的窗口大小内对数据进行滚动计算。
在这个例子中,window=N 意味着窗口的大小为 N,即在 N 天内进行计算。min_periods=1 表示即使在窗口期间只有一个非空值也会进行计算。
最后,对滚动窗口中的数据进行求和操作,得到动态买盘指标和(STM)。

STM = pd.Series(DTM).rolling(window=N, min_periods=1).sum()
计算 SBM

首先,将动态卖盘指标(DBM)转换为 Pandas 的 Series 类型。
然后,使用 rolling 方法创建一个滚动窗口对象,该对象会在指定的窗口大小内对数据进行滚动计算。
在这个例子中,window=N 意味着窗口的大小为 N,即在 N 天内进行计算。min_periods=1 表示即使在窗口期间只有一个非空值也会进行计算。
最后,对滚动窗口中的数据进行求和操作,得到动态卖盘指标和(SBM)。

SBM = pd.Series(DBM).rolling(window=N, min_periods=1).sum()
计算 ADTM

首先,比较动态买盘指标和(STM)和动态卖盘指标和(SBM)的大小关系。
如果 STM 大于 SBM,则计算公式为 (STM - SBM) / STM,表示买盘力量较强时的买卖气指标值。
如果 STM 等于 SBM,则将买卖气指标值设为 0,表示买卖力量相对平衡。
如果 STM 小于 SBM,则计算公式为 (STM - SBM) / SBM,表示卖盘力量较强时的买卖气指标值。

ADTM = np.where(STM > SBM, (STM - SBM) / STM, np.where(STM == SBM, 0, (STM - SBM) / SBM))

完整代码

import pandas as pd
import numpy as np

import a_get_data

N = 23
M = 8

# 计算ADTM指标
def calculate_ADTM(df, N, M):
    DTM = np.where(df['OPEN'] <= df['OPEN'].shift(1), 0,
                   np.maximum(df['HIGH'] - df['OPEN'], df['OPEN'] - df['OPEN'].shift(1)))
    DBM = np.where(df['OPEN'] >= df['OPEN'].shift(1), 0,
                   np.maximum(df['OPEN'] - df['LOW'], df['OPEN'] - df['OPEN'].shift(1)))
    STM = pd.Series(DTM).rolling(window=N, min_periods=1).sum()
    SBM = pd.Series(DBM).rolling(window=N, min_periods=1).sum()
    ADTM = np.where(STM > SBM, (STM - SBM) / STM, np.where(STM == SBM, 0, (STM - SBM) / SBM))
    MAADTM = pd.Series(ADTM).rolling(window=M, min_periods=1).mean()
    df['ADTM'] = ADTM
    df['MAADTM'] = MAADTM


data = {
    'CLOSE': 填每日收盘的数据,
    'HIGH': 填每日最高的数据,
    'LOW': 填每日最低的数据
    'OPEN': 填每日开盘的数据
}

df = pd.DataFrame(data)
# 计算ADTM指标
calculate_ADTM(df, N, M)

print(df)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗理者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值