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

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

    • 介绍
      • 算法解释:
    • 核心代码:
      • rolling函数介绍
    • 完整代码:
    • 一定要看


介绍

先看看官方介绍:

EMV(简易波动指标)
用法
1.EMV 由下往上穿越0 轴时,视为中期买进信号;
2.EMV 由上往下穿越0 轴时,视为中期卖出信号;
3.EMV 的平均线穿越0 轴,产生假信号的机会较少;
4.当ADX 低于±DI时,本指标失去效用;
5.须长期使用EMV指标才能获得最佳利润。

算法解释:

VOLUME:=MA(VOL,N)/VOL;
MID:=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW);
EMV:MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N);
MAEMV:MA(EMV,M);
指标描述计算方法
MA (Moving Average)移动平均线通过计算一段时间内的价格平均值来观察价格的长期趋势。
VOLUME成交量指在某一时间段内股票交易的总量。成交量通常被认为是价格走势的重要指标之一。
MID价格中点用于衡量价格在一个周期内的相对位置。计算方式为100*(最高价+最低价-上一周期的最高价+最低价)/(最高价+最低价)。
EMV (Ease of Movement)动量潜在指标通过价格变动和成交量的变化率之间的关系来计算,用于衡量价格相对于成交量的变化速度。
MAEMVEMV的移动平均值通过计算EMV的移动平均线,可以进一步平滑数据,更好地观察价格走势的长期趋势。

这些数据都依赖于收盘价格。我们找一个股票进行参考:

在这里插入图片描述

核心代码:

  • data:包含股票数据的DataFrame。
  • n:用于计算移动平均值的窗口大小。
  • m:用于计算MAEMV的窗口大小。

执行步骤:

  1. 计算VOLUME:首先计算成交量的移动平均值,并将其除以原始成交量,得到VOLUME。
  2. 计算MID:根据公式计算价格中点(MID)。
  3. 计算EMV:根据给定的数据,计算EMV值。这里使用了价格中点、VOLUME以及价格波动范围的移动平均值。
  4. 计算MAEMV:计算EMV的移动平均值,以平滑数据。

返回四个Series对象,分别是VOLUME、MID、EMV和MAEMV。


def calculate_EMV(data, n, m):# 计算VOLUMEdata['MA_VOL'] = data['VOL'].rolling(window=n).mean()data['VOLUME'] = data['MA_VOL'] / data['VOL']# 计算MIDdata['MID'] = 100 * (data['HIGH'] + data['LOW'] - data['HIGH'].shift(1) - data['LOW'].shift(1)) / (data['HIGH'] + data['LOW'])# 计算EMVdata['HL_MA'] = data['HIGH'] - data['LOW']data['MA_HL'] = data['HL_MA'].rolling(window=n).mean()data['EMV'] = data['MID'] * data['VOLUME'] * data['HL_MA'] / data['MA_HL']data['EMV'] = data['EMV'].rolling(window=n).mean()# 计算MAEMVdata['MAEMV'] = data['EMV'].rolling(window=m).mean()return data['VOLUME'], data['MID'], data['EMV'], data['MAEMV']

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

完整代码:

import pandas as pddef calculate_EMV(data, n, m):# 计算VOLUMEdata['MA_VOL'] = data['VOL'].rolling(window=n).mean()data['VOLUME'] = data['MA_VOL'] / data['VOL']# 计算MIDdata['MID'] = 100 * (data['HIGH'] + data['LOW'] - data['HIGH'].shift(1) - data['LOW'].shift(1)) / (data['HIGH'] + data['LOW'])# 计算EMVdata['HL_MA'] = data['HIGH'] - data['LOW']data['MA_HL'] = data['HL_MA'].rolling(window=n).mean()data['EMV'] = data['MID'] * data['VOLUME'] * data['HL_MA'] / data['MA_HL']data['EMV'] = data['EMV'].rolling(window=n).mean()# 计算MAEMVdata['MAEMV'] = data['EMV'].rolling(window=m).mean()return data['VOLUME'], data['MID'], data['EMV'], data['MAEMV']# 示例数据:数据可以参考附件文件,这里就展示一部分
data = {'HIGH': [35.6, 36.74, 38.21, 38.32, 38.2, 37.77, 38.88, 38.65, 38.8, 42.63, 37.75, 37.85, 37.74, 39.97, 38.88, 38.5, 39.07, 38.35, 36.33, 36.5, 38.3, 35.06, 35.66, 35.5, 33.76, 32.0, 34.0, 35.39, 35.1, 35.36, 33.74, 34.25, 37.41, 38.76, 39.0, 37.4, 36.83, 36.99, 37.45, 36.3, 36.4, 36.25, 36.21, 34.95, 33.29, 33.55, 33.05, 32.38, 34.38, 34.01, 34.01, 34.0, 36.3, 33.69, 32.36, 32.96, 32.51, 33.86, 33.44, 32.87, 32.23, 32.68, 31.26, 29.7, 28.36, 28.2, 27.25, 27.1, 27.98, 28.18, 28.36, 27.84, 26.85, 26.03, 25.68, 24.9, 24.98, 24.69, 25.33, 24.95, 23.98, 23.71, 22.87, 23.55, 23.6, 23.38, 22.82, 22.34, 23.99, 24.46, 22.47, 21.39, 20.36, 19.73, 19.44, 18.06, 17.17, 18.15, 17.31],'LOW': [32.89, 33.08, 36.43, 35.97, 36.4, 35.13, 36.3, 37.0, 37.27, 37.91, 35.88, 35.64, 35.9, 36.3, 37.52, 37.28, 36.4, 37.0, 33.34, 32.65, 34.6, 33.0, 32.8, 33.58, 30.8, 30.4, 30.5, 33.02, 33.09, 33.5, 32.72, 32.8, 35.0, 36.51, 36.22, 35.75, 35.84, 35.65, 35.89, 35.37, 35.45, 35.34, 34.38, 32.91, 32.33, 32.43, 32.34, 31.34, 31.3, 33.09, 32.81, 33.04, 34.11, 31.88, 31.72, 32.04, 31.68, 32.37, 32.35, 31.9, 31.8, 30.0, 29.07, 27.96, 27.01, 26.6, 25.89, 26.36, 26.4, 27.09, 27.68, 26.85, 24.7, 25.29, 24.48, 23.77, 23.72, 23.5, 24.0, 23.59, 23.0, 22.63, 21.85, 21.88, 22.7, 21.39, 21.2, 21.21, 21.7, 22.55, 20.84, 20.15, 18.82, 18.41, 17.48, 16.43, 15.3, 15.88, 15.5],'VOL': [45580764, 54578742, 75472698, 55958044, 43471376, 39089870, 65993166, 51725987, 59664851, 95828287, 64692075, 54151833, 54581088, 75630350, 40636266, 32590643, 46535705, 32208972, 65659275, 67488698, 57100011, 37509303, 44494331, 42006720, 56294769, 34236402, 57346512, 52584472, 46156969, 37854741, 30233442, 36844909, 74136219, 93002594, 72105475, 50722258, 30929788, 37269600, 32723194, 27491825, 26022766, 29478877, 37061997, 48042058, 22018987, 18617008, 16107171, 24764608, 47160698, 27157282, 27117523, 19243785, 55337568, 46107093, 22111567, 26169489, 18677657, 33233951, 22255922, 16218969, 11992250, 20560729, 37683555, 33974856, 28911947, 30993108, 23882463, 16380457, 38697438, 33720984, 33462661, 24071288, 40303016, 19186983, 26433462, 26414742, 36953528, 29789634, 54935510, 43667255, 28811811, 39282170, 38366540, 76358853, 40857274, 33171789, 44004578, 35894397, 70170103, 110181175, 62916228, 44189093, 46894875, 46711694, 45525470, 50214148, 56091415, 68644768, 78480358]
}# 转换为DataFrame
df = pd.DataFrame(data)# 设置参数
N = 14
M = 9# 计算指标
volume, mid, emv, maemv = calculate_EMV(df, N, M)print("VOLUME:")
print(volume)
print("\nMID:")
print(mid)
print("\nEMV:")
print(emv)
print("\nMAEMV:")
print(maemv)

四舍五入后:就是 -2.235,和图片一致了,数据越多指标小数点末尾也会随之变化

在这里插入图片描述

一定要看

EMV 指标的准确性取决于所选择的窗口大小以及市场的波动性。一般来说,窗口大小越大,需要的数据量也就越多才能获得更准确的结果。

通常来说,为了获得相对准确的 EMV 指标,至少需要足够长的时间序列数据,以便考虑到市场的变化和波动性。具体来说,EMV 的准确性至少需要数月甚至数年的数据,这样可以更好地捕捉到市场的长期趋势和周期性变化。

然而,对于具体的市场和交易策略,可能需要进行测试和优化,以确定合适的窗口大小和所需的历史数据量。

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

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

相关文章

Dynamo根据几何相交对墙体进行分组——群问题整理002

你好,这里是 BIM 的乐趣,我是九哥~ 近期给大家分享一些短平快的小教程,基本都是来自群里面常问的问题,不做过多的介绍了,直接上截图和代码。 问题:002 - 根据几何相交对墙体进行分组 今天分享的&#xff0…

OpenAI取消GPT-4 Turbo每日限制,速率提升一倍;扩散模型的理论基础

🦉 AI新闻 🚀 OpenAI取消GPT-4 Turbo每日限制,速率提升一倍 摘要:OpenAI宣布取消GPT-4 Turbo的每日限制,提升速率限制1倍,每分钟可处理高达150万TPM的数据。 OpenAI解释速率限制对防止API滥用、确保公平访…

用例是独立的-《软件方法》自测题解析38

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《软件方法》第5章自测题2 8 [ 多选题 ] 根据以下业务序列图,请问属于“一卡通系统”用例的有:  A) 外来办事人员→登记  B) 一卡通系统→判断黑名单 …

【IDEA关闭项目一直转圈】

IDEA关闭项目一直转圈: IDEA启动时,会自动打开上次关闭时所有显示的窗口,如果本次工作不需要上次打开的所有窗口,可以基于选择窗口界面的右上角去关闭。 项目关闭失败 但是偶尔会出现窗口关闭时,一直显示“正在关闭项…

如何选择阿里云服务器配置?阿里云服务器CPU内存带宽攻略

阿里云服务器配置怎么选择?根据实际使用场景选择,个人搭建网站可选2核2G配置,访问量大的话可以选择2核4G配置,企业部署Java、Python等开发环境可以选择2核8G配置,企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

leetcode日记(31)缺失的第一个正数

挺简单的困难题 class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());int nnums.size();int i0;bool b0;if(nums[0]>0) b1;int p1;for(;i<n;i){if(i1>0&&i1<nums.size()&&nums[i]<…

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

【Path Intellisense插件】配置@路径提示

问题 默认情况下&#xff0c;Path Intellisense插件安装后&#xff0c;使用路径简写是不带提示的 解决办法 点击插件中的扩展设置 往下翻&#xff0c;直到找到 在 settings.json 中编辑&#xff0c;点击 将下述代码直接复制粘贴到指定位置 "path-intellisense.mappings…

防火墙 iptables(二)--------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

深入解析鸿蒙系统的页面路由(Router)机制

鸿蒙系统以其独特的分布式架构和跨设备的统一体验而备受瞩目。在这个系统中&#xff0c;页面路由&#xff08;Router&#xff09;机制是连接应用各页面的关键组成部分。本文将深入探讨鸿蒙系统的页面路由&#xff0c;揭示其工作原理、特点以及在应用开发中的实际应用。 1. 实现…

java日志框架总结(六、logback日志框架 扩展)

springboot推荐使用logback-spring.xml而不是logback.xml而logback-spring.xml文件与logback.xml文件还是有一定的区别&#xff0c;所以简单讲解一下。 一、logback-spring.xml 配置文件实例&#xff1a; <?xml version"1.0" encoding"UTF-8"?> …

C#,二进制数的按位旋转(Bits Rotate)算法与源代码

1 二进制数的按位旋转 二进制数的按位旋转&#xff08;翻转&#xff09;是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大&#xff0c;右转意味着数据变小&#xff08;有损&#xff09;。 2 源程序 using System; using System.Text; us…

数据结构之时空复杂度

一、前言 1&#xff09;什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的 集合。 2&#xff09;什么是算法 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&am…

物联网实时补丁的未来:网络安全的期望

■ 未打补丁的设备通常存在已知的安全漏洞&#xff0c;可能会被攻击者利用 ■ 物联网实时修补即使在安全更新期间也能保持设备在线和运行&#xff0c;从而减少停机时间 ■ 自动修补解决方案使物联网设备更能抵御网络攻击 物联网 (IoT)正在迅速发展&#xff0c;数十亿联网设备渗…

LiveGBS流媒体平台GB/T28181功能-redis订阅国标设备状态redis订阅通道状态subscribe device操作及示例

支持Redis订阅国标设备状态及国标通道状态上线离线 1、设备状态监听的烦恼2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后 3.4、设备离线示例3.4.1、注…

Leetcode-429.N叉树的层序遍历

题目&#xff1a; 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff…

每日一题——LeetCode1455.检查单词是否为句中其他单词的前缀

方法一 js函数slice() 将字符串按空格符分割为单词数组&#xff0c;记searchWord的长度为n&#xff0c;分割每个单词的前n位看是否和searchWord匹配 var isPrefixOfWord function(sentence, searchWord) {let res sentence.split(" ")for(i 0 ; i < res.lengt…

线程池工作过程

线程池工作流程 线程池的处理流程总结 线程池的处理流程 当提交一个新任务到线程池时&#xff0c;线程池的处理流程如下&#xff1a; 1、线程池判断核心线程池里的线程是否都在执行任务。如果不是&#xff0c;则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执…

fgets的使用方法详解

fgets的使用 文章目录 fgets的使用前言&#xff08;吹水&#xff0c;不看也罢&#xff09;fgets 的基本语法使用示例fgets() 对输入的处理的特点gets() 与 fgets() 的主要区别 总结 前言&#xff08;吹水&#xff0c;不看也罢&#xff09; 鼠鼠今天在B站上大学的时候&#xff…

Vue2:组件间通信框架Vuex

一、原理图及作用 功能介绍&#xff1a; 简单说就是Vue项目中&#xff0c;各个组件间通信的一种框架 相较于之前的全局事件总线&#xff0c;该框架更实用&#xff01; 提高了代码的复用率&#xff0c;把核心业务代码&#xff0c;集中到store中&#xff0c;这样&#xff0c;一处…