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

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

    • 介绍
      • 算法解释
    • 核心代码
      • rolling函数介绍
      • 计算 DTM
        • np.where 使用介绍
        • np.maximum
      • 计算 DBM
        • 计算 STM
        • 计算 SBM
        • 计算 ADTM
    • 完整代码


介绍

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 nparr = 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 nparr1 = 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 npimport a_get_dataN = 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'] = ADTMdf['MAADTM'] = MAADTMdata = {'CLOSE': 填每日收盘的数据,'HIGH': 填每日最高的数据,'LOW': 填每日最低的数据'OPEN': 填每日开盘的数据
}df = pd.DataFrame(data)
# 计算ADTM指标
calculate_ADTM(df, N, M)print(df)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803929.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

高级语言期末2012级B卷

1.编写函数&#xff0c;输出任意正整数n的位数&#xff08;n默认为存储十进制的整形变量&#xff09; 例如&#xff1a;正整数13&#xff0c;则输出2,&#xff1b;正整数3088&#xff0c;则输出4 #include <stdio.h>int func(int n) {int count0;while(n>0) {n/10;co…

【Redis服务搭建】

目录 Redis的修改配置启动以及参数调优Redis的常用基本操作Redis运维监控命令Redis的配置的动态更新和写入Redis的多用户管理Redis的慢日志Redis禁用危险命令和压测工具Redis持久化存储1.Redis的RDB持久化存储2.Redis的AOF持久化存储 Redis的主从复制redis的哨兵实现主从自动切…

捕捉消费新趋势,脉纷纷让生活更便捷

随着科技的飞速发展和消费者需求的不断升级,消费市场呈现出前所未有的新趋势。在这个变革的时代背景下,脉纷纷凭借其敏锐的市场洞察力和创新精神,致力于捕捉消费新趋势,为消费者带来更加便捷的生活体验。 脉纷纷深知消费者对于便捷生活的渴望。因此,它紧密关注市场动态,通过大数…

NLP_构建GPT模型并完成文本生成任务

文章目录 搭建GPT模型&#xff08;解码器&#xff09;构建文本生成任务的数据集训练过程中的自回归文本生成中的自回归&#xff08;贪婪搜索&#xff09;完整代码小结 搭建GPT模型&#xff08;解码器&#xff09; GPT 只使用了 Transformer的解码器部分&#xff0c;其关键组件…

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、图书…

基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型质量非常高&#xff0c;运行效果完美。本模型为4机并联孤岛系统&#xff0c;在下垂控制的基础上加入二次控制&#xff0c;二次电压与频率协同控制策略利用事件触发的方法来减少控制器的更新次数。该方法…

Python操作Kafka基础教程

01 Python操作Kafka基础教程 创建ZooKeeper容器 docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper创建Kafka容器 语法是&#xff1a; docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID0 -e KAFKA_ZOOKE…

观察者模式, 发布-订阅模式, 监听器模式

观察者模式, 发布-订阅模式, 监听器模式 观察者模式 观察者模式是一种行为型设计模式, 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中&#xff0c;只有两种…

码农永远高薪吃香的3项特质

最近看到Google在裁员滚滚&#xff0c;再次对CS就业环境有了清醒认知。之前听程序员担忧裁员&#xff0c;还以为他杞人忧天。然而&#xff0c;现实就是如此寒冷彻骨啊&#xff01; 当然&#xff0c;有些具备不可替代性的码农&#xff0c;永远吃香。总结发现有以下几点特质&…

vue Threejs实现任意画线(鼠标点击画线)

Threejs实现任意画线(鼠标点击画线) 鼠标左键单击添加点鼠标右键回退到上一个点,并继续画按住shift可以画平行于x轴或平行于z轴的线按Esc完成画线

蓝桥杯DP算法——区间DP(C++)

根据题意要求的是将石子合并的最小权值&#xff0c;我们可以根据DP思想使用二维数组f[i,j]来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。 然后由第二个图所示&#xff0c;我们可以将i到j区间分成两个区间&#xff0c;因为将i到j合并成一个区间的前一步一定是合…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

http相关概念以及apache的功能(最详细讲解!!!!)

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

HQYJ 2024-2-23 作业

自己实现单向循环链表的功能 整理思维导图 复习前面顺序表和链表的代码&#xff0c;重写链表逆置函数 1.实现单向循环链表的功能 loop_link_list.h文件 #ifndef __LOOP_LINK_LIST__ #define __LOOP_LINK_LIST__ #include<stdio.h> #include<stdlib.h> typedef…

Java零基础 - 三元运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

SpringBoot对于SpringMVC的支持

创建项目 版本说明这里使用的 SpringBoot 2.0.0.Release SpringBoot对于SpringMVC的支持 在之前的开发中很多场景下使用的是基于xml配置文件或者是Java配置类的方式来进行SpringMVC的配置。一般来讲&#xff0c;初始的步骤如下所示 1、初始化SpringMVC的DispatcherServlet2、…

C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串

#include<iostream> using namespace std; #include <string> //string的构造函数 /* -string(); //创建一个空的字符串 例如: string str; -string(const char* s); //使用字符串s初始化 -string(const string& str); //使…

前端JS学习(二):BOM、DOM对象与事件

Web API基本认知 Web API 的作用&#xff1a;使用JS去操作html和浏览器 Web API 的分类&#xff1a;DOM(网页文档对象模型)、BOM(浏览器对象模型) BOM BOM的全称是 Browser Object Model&#xff0c;浏览器对象模型。也就是 JavaScript 将浏览器的各个组成部分封装成了对象&…

修改单据转换规则后保存报错提示

文章目录 修改单据转换规则后保存报错提示 修改单据转换规则后保存报错提示

区块链与Solidity详细介绍及基本语法使用

一、区块链简介 区块链是一种分布式数据库技术&#xff0c;它以块的形式存储数据&#xff0c;并通过加密算法确保数据的安全性。每个块包含一系列交易&#xff0c;并通过哈希值与前一个块相连接&#xff0c;形成一个链式结构。这种结构使得数据难以被篡改&#xff0c;因为任何对…