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

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

    • 介绍
      • 算法解释
    • 代码
      • rolling函数介绍
      • 计算 MTR
        • max 函数
        • sum 函数
      • 计算 HD
      • 计算 LD
      • 计算 DMP
      • 计算 DMM
      • 计算 PDI、MDI 和 ADX
      • 完整代码


介绍

先看看官方介绍:

DMI (趋向指标)
用法
1.PDI线从下向上突破MDI线,显示有新多头进场,为买进信号;
2.PDI线从上向下跌破MDI线,显示有新空头进场,为卖出信号;
3.ADX值持续高于前一日时,市场行情将维持原趋势;
4.ADX值递减,降到20以下,且横向行进时,市场气氛为盘整;
5.ADX值从上升倾向转为下降时,表明行情即将反转。

算法解释

MTR:= SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N);
HD := HIGH-REF(HIGH,1);
LD := REF(LOW,1)-LOW;
DMP:= SUM(IF(HD>0 AND HD>LD,HD,0),N);
DMM:= SUM(IF(LD>0 AND LD>HD,LD,0),N);
PDI: DMP*100/MTR;
MDI: DMM*100/MTR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,M);
ADXR:(ADX+REF(ADX,M))/2;

代码

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

计算 MTR

MTR 是真实范围指标(True Range),它是用来衡量股票或其他金融资产价格波动性的指标。

# 计算 MTR
df['HL'] = df['HIGH'] - df['LOW']
df['HC'] = abs(df['HIGH'] - df['CLOSE'].shift(1))
df['LC'] = abs(df['LOW'] - df['CLOSE'].shift(1))
df['MAX1'] = df[['HL', 'HC']].max(axis=1)
df['MAX2'] = df[['MAX1', 'LC']].max(axis=1)
df['MTR'] = df['MAX2'].rolling(window=N).sum()
  1. df['HL'] = df['HIGH'] - df['LOW']:计算每日的价格范围(High - Low)。
  2. df['HC'] = abs(df['HIGH'] - df['CLOSE'].shift(1)):计算当日的最高价与前一日收盘价的差的绝对值。
  3. df['LC'] = abs(df['LOW'] - df['CLOSE'].shift(1)):计算当日的最低价与前一日收盘价的差的绝对值。
  4. df['MAX1'] = df[['HL', 'HC']].max(axis=1):取每日价格范围与 HC 列的最大值。
  5. df['MAX2'] = df[['MAX1', 'LC']].max(axis=1):取 MAX1 列与 LC 列的最大值。
  6. df['MTR'] = df['MAX2'].rolling(window=N).sum():对 MTR 列进行滚动窗口计算,窗口大小为 N,每日的 MTR 是该日及前 N-1 日的 MAX2 列的总和。
max 函数

.max(axis=1) 函数是 Pandas DataFrame 中的函数,用于沿着指定的轴(这里是轴1,即列)计算最大值。例如,df[['HL', 'HC']].max(axis=1) 将计算 DataFrame 中 ‘HL’ 和 ‘HC’ 列对应行的最大值。

sum 函数

.sum() 函数是用于对指定轴(默认是轴0,即行)上的元素求和。在这里,.rolling(window=N).sum() 表示对滚动窗口中的元素进行求和,窗口大小为 N。

计算 HD

HD 是真实高点(True High),它表示当日的最高价与前一日的最高价之差。

# 计算 HD
df['HD'] = df['HIGH'] - df['HIGH'].shift(1)

df['HD'] = df['HIGH'] - df['HIGH'].shift(1):这行代码计算了每日最高价与前一日最高价的差,得到了真实高点。使用 .shift(1) 函数是为了获取前一日的数据,从而与当日的最高价相减得到差值。

计算 LD

LD 是真实低点(True Low),它表示当日的最低价与前一日的最低价之差。

# 计算 LD
df['LD'] = df['LOW'].shift(1) - df['LOW']

df['LD'] = df['LOW'].shift(1) - df['LOW']:这行代码计算了每日最低价与前一日最低价的差,得到了真实低点。使用 .shift(1) 函数是为了获取前一日的数据,从而与当日的最低价相减得到差值。

计算 DMP

DMP(上升动向值)是用来衡量股票或其他金融资产价格上涨趋势的指标。具体来说,DMP 是在一定时间内(这里使用滚动窗口大小为 N)价格上涨幅度的累积。一般情况下,它是通过比较当日的真实高点(HD)与真实低点(LD)来确定是否存在上升趋势。

# 计算 DMP
df['DMP'] = df.apply(lambda x: x['HD'] if (x['HD'] > 0 and x['HD'] > x['LD']) else 0, axis=1).rolling(window=N).sum()
  1. 对于每一行数据,使用 apply() 函数应用一个匿名函数(lambda x)。
  2. 在匿名函数中,根据条件 x['HD'] > 0 and x['HD'] > x['LD'] 来判断是否满足上升动向的条件。如果当日的真实高点(HD)大于 0 且大于真实低点(LD),则将该行的 HD 作为 DMP 的值,否则设为 0。
  3. 最后,使用 .rolling(window=N).sum() 对 DMP 列进行滚动窗口求和,窗口大小为 N,得到了每日的 DMP 值。

计算 DMM

DMM(下降动向值)是用来衡量股票或其他金融资产价格下跌趋势的指标。与DMP相似,DMM是在一定时间内(这里使用滚动窗口大小为N)价格下跌幅度的累积。它通常通过比较当日的真实低点(LD)与真实高点(HD)来确定是否存在下降趋势。

# 计算 DMM
df['DMM'] = df.apply(lambda x: x['LD'] if (x['LD'] > 0 and x['LD'] > x['HD']) else 0, axis=1).rolling(window=N).sum()
  1. 对于每一行数据,使用apply()函数应用一个匿名函数(lambda x)。
  2. 在匿名函数中,根据条件x['LD'] > 0 and x['LD'] > x['HD']来判断是否满足下降动向的条件。如果当日的真实低点(LD)大于0且大于真实高点(HD),则将该行的LD作为DMM的值,否则设为0。
  3. 最后,使用.rolling(window=N).sum()对DMM列进行滚动窗口求和,窗口大小为N,得到了每日的DMM值。

计算 PDI、MDI 和 ADX

指标名称描述
PDI(Positive Directional Indicator)正向指标,用于衡量上升趋势的强度。它是上升动向值(DMP)与真实范围(MTR)的比值,通常用百分比表示。
MDI(Negative Directional Indicator)负向指标,用于衡量下降趋势的强度。它是下降动向值(DMM)与真实范围(MTR)的比值,通常用百分比表示。
ADX(Average Directional Index)平均动向指数,用于衡量趋势的强度。它是 PDI 和 MDI 之间的差的绝对值与它们之和的比值,然后再乘以 100,得到的结果就是 DX(方向指标)值。最后,使用滚动窗口计算 DX 值的平均值,得到了 ADX。
# 计算 PDI、MDI 和 ADX
df['PDI'] = df['DMP'] * 100 / df['MTR']
df['MDI'] = df['DMM'] * 100 / df['MTR']
df['DX'] = (df['PDI'] - df['MDI']).abs() / (df['PDI'] + df['MDI']) * 100
df['ADX'] = df['DX'].rolling(window=M).mean()

df['PDI'] = df['DMP'] * 100 / df['MTR']:计算了正向指标(PDI),即上升动向值与真实范围的比值,再乘以100得到百分比。

df['MDI'] = df['DMM'] * 100 / df['MTR']:计算了负向指标(MDI),即下降动向值与真实范围的比值,再乘以100得到百分比。

df['DX'] = (df['PDI'] - df['MDI']).abs() / (df['PDI'] + df['MDI']) * 100:计算了方向指标(DX),即 PDI 和 MDI 之间的差的绝对值与它们之和的比值,再乘以 100。

df['ADX'] = df['DX'].rolling(window=M).mean():最后,计算了平均动向指数(ADX),使用滚动窗口计算 DX 值的平均值,窗口大小为 M。

完整代码

import pandas as pd

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

df = pd.DataFrame(data)

N = 14
M = 6

# 计算 MTR
df['HL'] = df['HIGH'] - df['LOW']
df['HC'] = abs(df['HIGH'] - df['CLOSE'].shift(1))
df['LC'] = abs(df['LOW'] - df['CLOSE'].shift(1))
df['MAX1'] = df[['HL', 'HC']].max(axis=1)
df['MAX2'] = df[['MAX1', 'LC']].max(axis=1)
df['MTR'] = df['MAX2'].rolling(window=N).sum()

# 计算 HD
df['HD'] = df['HIGH'] - df['HIGH'].shift(1)

# 计算 LD
df['LD'] = df['LOW'].shift(1) - df['LOW']

# 计算 DMP
df['DMP'] = df.apply(lambda x: x['HD'] if (x['HD'] > 0 and x['HD'] > x['LD']) else 0, axis=1).rolling(window=N).sum()

# 计算 DMM
df['DMM'] = df.apply(lambda x: x['LD'] if (x['LD'] > 0 and x['LD'] > x['HD']) else 0, axis=1).rolling(window=N).sum()

# 计算 PDI、MDI 和 ADX
df['PDI'] = df['DMP'] * 100 / df['MTR']
df['MDI'] = df['DMM'] * 100 / df['MTR']
df['DX'] = (df['PDI'] - df['MDI']).abs() / (df['PDI'] + df['MDI']) * 100
df['ADX'] = df['DX'].rolling(window=M).mean()

# 计算 ADXR
df['ADXR'] = (df['ADX'] + df['ADX'].shift(M)) / 2

# 删除中间计算用的列
df.drop(['LOW', 'HL', 'HC', 'LC', 'MAX1', 'MAX2', 'HD', 'LD', 'DX'], axis=1, inplace=True)

print(df)



在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实习日志14

完善条件查询和word生成列表 条件查询 word生成列表 1.阶段性总结 1.1.入职培训 首先,蔡老师的活字格软件开发入门和应用培训为我提供了深入了解软件开发的机会。通过学习,我掌握了一些基础的开发技能,尤其是在数据库设计和管理方面有了更深…

Gin框架: HTML模板渲染之配置与语法详解

Gin的HTML模板配置 1 &#xff09;单一目录的配置 配置模板目录&#xff0c;在与main.go同级下, 新建目录&#xff0c;下面二选一&#xff0c;仅作举例, 这里选择 tpls templatestpls 在 tpls 目录下新建 news.html <!-- 最简单的 --> <h1>News Page</h1>&l…

爬虫之正则表达式

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 概念&#xff1a; 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;正则匹配是一个模糊的匹配(不是精确匹配) 如下四个方法经常使用&#xff1a; match()search()f…

AutoMQ 社区双周精选第七期(2024.01.29~2024.02.09)

本期概要 过去的两周里&#xff0c;社区贡献者lifepuzzlefun 为 AutoMQ 的 RocketMQ 项目优化了 LogCache 的二分查找性能&#xff0c;消除了不必要的List拷贝。 同时&#xff0c;AutoMQ 的主干动态展示了持续的性能优化和功能增强。在 Kafka 项目中&#xff0c;团队设计了新…

【Postgres】11、PROCEDURE 存储过程、FUNCTION 函数、使用方式和区别

文章目录 一、PROCEDURE1.1 语法1.2 描述1.3 参数1.4 示例 二、FUNCTION2.1 语法2.2 重载2.3 示例2.4 兼容性2.5 示例2.5.1 declare variable 定义变量2.5.2 declare、ARRAY、ANY2.5.2.1 ARRAY 和 ANY 三、其他3.1 PL/pgSQL 在PostgreSQL中&#xff0c;存储过程&#xff08;Pro…

家中R4S软路由iStoreOS配置内网穿透服务实现远程访问公司电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

【Jvm】性能调优(上)线上问题排查工具汇总

文章目录 一.互联网概念1.产品闭环和业务闭环2.软件设计中的上游和下游3.JDK运行时常量池 二.CPU相关概念1.查询CPU信息2.CPU利用率&#xff08;CPU utilization&#xff09;和 CPU负载&#xff08;CPU load&#xff09;2.1.如何理解CPU负载2.2.top命令查看CPU负载均值2.3.CPU负…

更改WordPress作者存档链接author和Slug插件Edit Author Slug

WordPress默认所有用户的存档永久链接都是/author/username/&#xff0c;不管是管理员还是订阅者或贡献者或作者或编辑。如果你想要自定义用户存档链接&#xff0c;比如根据角色不同使用不一样的author&#xff0c;或者自定义作者链接中的用户名Slug&#xff0c;那么建议考虑使…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

选择结构switch

一、执行流程 所有case都和表达式的值不匹配&#xff0c;就会执行default语句体部分 从被匹配的位置开始执行&#xff0c;如果遇到break&#xff0c;那么退出选择结构 二、注意事项 1、case后面的【常量值】不能重复&#xff0c;不然编译器会报错 2、switch后面的小括号只…

MoonBit新增functional for loop控制流支持

1. 增加functional for loop控制流支持 与传统的命令式for loop 不同&#xff0c;循环变量是不可变的。这样的设计将来也容易抽取出来做形式化验证&#xff1a; fn init {for i 0; i < 5; i i 1 {debug(i)// i i 4 error: The variable i is not mutable.} }输出&am…

一文概括|CSC访问学者/博士后/联培申请及派出流程详解

为帮助申请者了解国家留学基金委&#xff08;CSC&#xff09;的政策&#xff0c;以及申报及派出的全过程&#xff0c;知识人网小编利用本文简略介绍并提出规划建议。 公派留学包括国家、地方&#xff08;含省市、行业、学校医院等单位&#xff09;资助派出。而国家公派则由留学…

十字星K线(Doji)含义,fpmarkets澳福一分钟讲解

许多新手交易者遇到过这种奇怪的烛台&#xff0c;看起来就像一个十字架&#xff0c;没有主体上下有长长的影子&#xff0c;fpmarkets澳福肯定的告诉各位投资者&#xff0c;这种就是十字星K线(用Doji表示)&#xff0c;开盘价与收盘价一致&#xff0c;价格运动已经停止时出现在烛…

洛谷C++简单题小练习day15—计算阶乘小程序(不用循环)

day15--计算阶乘小程序--2.19 习题概述 题目描述 求 n!&#xff0c;也就是 123⋯n。 挑战&#xff1a;尝试不使用循环语句&#xff08;for、while&#xff09;完成这个任务。 输入格式 第一行输入一个正整数 n。 输出格式 输出一个正整数&#xff0c;表示 n! 代码部分 …

从零开始的 dbt 入门教程 (dbt core 开发进阶篇)

引 在上一篇文章中&#xff0c;我们花了专门的篇幅介绍了 dbt 更多实用的命令&#xff0c;那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念&#xff0c;如果你是 dbt 初学者&#xff0c;我相信如下知识点一定会对你有极大的帮助&#xff1a; 了解 db…

简单贪吃蛇模拟(C语言版本·)

简单贪吃蛇模拟&#xff08;C语言版本&#xff09; 一、所需win32 API知识二、游戏逻辑实现 一、所需win32 API知识 1.在这儿&#xff0c;直接弱化概念&#xff0c;把在贪吃蛇中用到的API知识说一下&#xff01;  1.1用cmd命令来设置控制台窗口的长宽   1.2.用title 指令…

python入门----基础

这里写目录标题 重点虚拟环境/与//的区别/// 关于print字符串可以用号拼接单双引号转义符换行三引号 变量变量的定义变量名的命名 API库导库以及使用 注释单行注释多行注释 数据类型strboolNoneTypetype函数 交互模式介绍开启 input作用延伸 if-else条件嵌套语句逻辑运算符内容…

世界顶级名校计算机专业,都在用哪些书当教材?

前言 在当今信息化、数字化时代&#xff0c;计算机科学已成为全球最为热门和重要的学科之一。世界顶级名校的计算机专业&#xff0c;更是培养未来行业领袖和创新人才的重要基地。那么&#xff0c;这些名校的计算机专业究竟使用哪些教材呢&#xff1f;这些教材又具有哪些特色和…

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

Golang 更严格的代码格式化工具 gofumpt

一、前言 gofmt 是 golang 自带的代码自动格式化工具&#xff0c;是保证 Go 代码风格一致的大杀器。我们这次要推荐的 gofumpt 在 gofmt 的基础上添加了一系列更加严格的格式化规则&#xff0c;并保证了对 gofmt 的兼容。 二、gofumpt 简介 gofumpt(https://github.com/mvda…
最新文章