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://www.mzph.cn/news/699110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++奇怪的 ::template

答疑解惑 怎么会有::template的写法 起初 在阅读stl的源码的时候&#xff0c;发现了一条诡异的代码 // ALIAS TEMPLATE _Rebind_alloc_t template<class _Alloc,class _Value_type> using _Rebind_alloc_t typename allocator_traits<_Alloc>::template rebind…

【misc | CTF】攻防世界 simple_transfer

天命&#xff1a;这题其实不简单啊 拿到流量包&#xff0c;丢进去wireshare&#xff0c;题目都说了flag在里面 ctrl f 直接搜索字符串 右键&#xff0c;追踪流 -> TCP流 查找 .pdf 文件&#xff0c;其实这里思路是比较奇怪的&#xff0c;毕竟是的确比较多内容&#xff0c…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例&#xff0c;也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

NestJS入门4:MySQL typeorm 增删改查

前文参考&#xff1a; NestJS入门1 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 1. 安装数据库相关模块 npm install nestjs/typeorm typeorm mysql -S 2. MySql中创建数据库 ​ 3. 添加连接数据库代码 app.module.ts ​ import { M…

给自己留个备忘,blender是右手坐标系

所谓右手坐标系&#xff0c;就是三个轴的方向和右手三根手指的方向一致&#xff08;当然&#xff0c;有要求的&#xff0c;这个要求是大拇指指向x轴方向&#xff0c;食指指向y轴方向,中指指向z轴方向&#xff09;。 不过blender默认是z轴朝上的&#xff0c;如下图。 右手坐标系…

element导航菜单el-menu添加搜索功能

element导航菜单-侧栏&#xff0c;自带的功能没有搜索或者模糊查询。 找了找资料 找到一个比较可行的&#xff0c;记录一下&#xff1a; //index.vue的代码 <div style"overflow:auto"><el-menu :default-active"$route.path":default-openeds&…

<网络安全>《49 网络攻防专业课<第十三课 - 华为防火墙的使用(2)>

6 防火墙的防范技术 6.1 ARP攻击防范 攻击介绍 攻击者通过发送大量伪造的ARP请求、应答报文攻击网络设备&#xff0c;主要有ARP缓冲区溢出攻击和ARP拒绝服务攻击两种。 ARP Flood攻击&#xff08;ARP扫描攻击&#xff09;&#xff1a;攻击者利用工具扫描本网段或者跨网段主机时…

构造器详解

定义: 是一种特殊类型的方法&#xff0c;用于创建对象时初始化对象的状态。 使用new关键字创建对象 构造器特点: 1.和类名相同 2.没有返回值 public class Person {String name;public Person() {this.name"John";}}public class Test {public static void main…

vue2+element医院安全(不良)事件报告管理系统源代码

目录 安全不良事件类型 源码技术栈 医院安全&#xff08;不良&#xff09;事件报告管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要对象&#xff0c;可以自动、及时、实际地反应医院的安全、不良、近失事件…

测试环境搭建整套大数据系统(六:搭建sqoop)

一&#xff1a;下载安装包 https://archive.apache.org/dist/sqoop/ 二&#xff1a;解压修改配置。 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt cd /opt mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7修改环境变量 vi /etc/profile#SQOOP_HOME export SQOOP_…

nginx-------- 高性能的 Web服务端 (四)

一、高级配置 1 .1网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机…

【Android 性能优化:内存篇】——ExoPlayer 释放后内存没有恢复问题探索

背景 最近笔者承接项目的内存优化指标&#xff0c;在内存调研的过程中发现项目中视频播放结束后&#xff0c;内存没有恢复到播放前到水平。项目中用的 EXO 版本为2.19.1&#xff0c;并且笔者自己也写了个简单的 Demo&#xff0c;发现也是如此。虽然有一些偏门方法可以优化&…

4 buuctf解题

[CISCN 2019 初赛]Love Math1 打开题目 题目源码 <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("…

无人机的视频图传技术

在操控无人机时&#xff0c;视频图传技术显得尤为关键。通过这项技术&#xff0c;无人机的摄像头所捕捉的画面能实时回传至遥控器&#xff0c;使操作者全面掌握无人机的拍摄情况。同时&#xff0c;无人机图传技术也是衡量无人机性能的重要标准&#xff0c;它关乎飞行距离与时间…

【Vuforia+Unity】AR07-实现识别条码、二维码内容功能(Barcode Scanner)

Barcode Scanner in Unity | Vuforia Library官方教程&#xff0c;写的很详细&#xff0c;本教程主要参考对象&#xff01; 主要实现扫描生活中常见的二维码&#xff0c;然后弹出二维码链接&#xff0c;当然我们也可以再次回调自定义函数&#xff0c;弹出数字内容&#xff0c;…

编译GreatSQL with RocksDB引擎

GreatSQL里也能用上RocksDB引擎 1. 前言 RocksDB 是基于Facebook 开源的一种支持事务的、高度可压缩、高性能的MyRocks存储引擎&#xff0c;特别适用于高度压缩和大容量的数据。以下是一些关键特点&#xff1a; 高性能&#xff1a; LSM 树结构使得RocksDB在写入密集型负载下表现…

剪辑视频调色软件有哪些 剪辑视频软件哪个最好 剪辑视频怎么学 剪辑视频的方法和步骤 会声会影2024 会声会影视频制作教程

看了很多调色教程&#xff0c;背了一堆调色参数&#xff0c;可最终还是调不出理想的效果。别再怀疑自己了&#xff0c;不是你的剪辑技术不行&#xff0c;而是剪辑软件没选对。只要掌握了最基本的调色原理&#xff0c;一款适合自己的视频剪辑软件是很容易出片的。 有关剪辑视频…

python实现维特比算法

对于维特比算法&#xff0c;首先想到的就是高通公司&#xff0c;对于现在的通信行业的两大巨头公司之一&#xff0c;高通公司的发家是由器创始人维特比发明了一种高效的通信解码技术&#xff0c;维特比算法。 对于维特比算法是什么&#xff0c;以一个例子来讲述什么是维特比算…

如何查看Linux中运行了哪些应用

在Linux中&#xff0c;有多种方法可以查看正在运行的应用程序。以下是一些常用的命令&#xff1a; ps 命令&#xff1a;ps 命令用于显示当前终端会话中运行的进程。要查看系统上运行的所有进程&#xff0c;可以使用 -e 或 -A 选项。例如&#xff1a; ps -e或 ps -A这将列出所有…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…