java 移动平均_EWMA之——EWMA指数加权移动平均模型的Java实现

article/2025/10/25 21:00:37

具体代码如下:

package com.lyz.storm.ewma;

import java.io.Serializable;

/**

* 实现指数移动平均值计算

* 实现中使用了流式风格的builder API

* @author liuyazhuang

*

*/

public class EWMA implements Serializable {

private static final long serialVersionUID = 2979391326784043002L;

//时间类型枚举

public static enum Time {

MILLISECONDS(1), SECONDS(1000), MINUTES(SECONDS.getTime() * 60), HOURS(MINUTES.getTime() * 60), DAYS(HOURS.getTime() * 24), WEEKS(DAYS.getTime() * 7);

private long millis;

private Time(long millis) {

this.millis = millis;

}

public long getTime() {

return this.millis;

}

}

//三个alpha常量,这些值和Unix系统计算负载时使用的标准alpha值相同

public static final double ONE_MINUTE_ALPHA = 1 - Math.exp(-5d / 60d / 1d);

public static final double FIVE_MINUTE_ALPHA = 1 - Math.exp(-5d / 60d / 5d);

public static final double FIFTEEN_MINUTE_ALPHA = 1 - Math.exp(-5d / 60d / 15d);

private long window;

private long alphaWindow;

private long last;

private double average;

private double alpha = -1D;

private boolean sliding = false;

public EWMA() {

}

public EWMA sliding(double count, Time time) {

return this.sliding((long) (time.getTime() * count));

}

public EWMA sliding(long window) {

this.sliding = true;

this.window = window;

return this;

}

public EWMA withAlpha(double alpha) {

if (!(alpha > 0.0D && alpha <= 1.0D)) {

throw new IllegalArgumentException("Alpha must be between 0.0 and 1.0");

}

this.alpha = alpha;

return this;

}

public EWMA withAlphaWindow(long alphaWindow) {

this.alpha = -1;

this.alphaWindow = alphaWindow;

return this;

}

public EWMA withAlphaWindow(double count, Time time) {

return this.withAlphaWindow((long) (time.getTime() * count));

}

//没有参数的话,当前时间来计算平均值

public void mark() {

mark(System.currentTimeMillis());

}

//用来更新移动平均值,没有参数的话,使用当前时间来计算平均值

public synchronized void mark(long time) {

if (this.sliding) {

if (time - this.last > this.window) {

this.last = 0;

}

}

if (this.last == 0) {

this.average = 0;

this.last = time;

}

long diff = time - this.last;

double alpha = this.alpha != -1.0 ? this.alpha : Math.exp(-1.0 * ((double) diff / this.alphaWindow));

this.average = (1.0 - alpha) * diff + alpha * this.average;

this.last = time;

}

//返回mark()方法多次调用的平均间隔时间,单位是微秒

public double getAverage() {

return this.average;

}

//按照特定的时间单位来返回平均值,单位详见Time枚举

public double getAverageIn(Time time) {

return this.average == 0.0 ? this.average : this.average / time.getTime();

}

//返回特定时间度量内调用mark()的频率

public double getAverageRatePer(Time time) {

return this.average == 0.0 ? this.average : time.getTime() / this.average;

}

}

按照如下方式调用:

//建立1分钟滑动窗口EWMA实例

EWMA ewma = new EWMA().sliding(1.0, EWMA.Time.MINUTES).withAlpha(EWMA.ONE_MINUTE_ALPHA);

以下内容为转载:

Exponentially Weighted Moving Average(EWMA)指数加权移动平均是一种常用的序列数据处理方式,如下:

在时间 t, 根据实际的观测值(或量测值)我们可以求取 EWMA(t)如下:

EWMA(t ) = λY(t)+ ( 1-λ) EWMA(t-1) for t = 1, 2, ..., n.

* EWMA(t):t时刻的估计值

* Y(t): t 时间之量测值﹐

* n is the number of observations to be monitored including EWMA0

* λ ( 0

从另一个角度看, λ 决定了EWM A估计器跟踪实际数据突然发生变化的能力,即时效性, 显然随着λ 增大, 估计器的时效性就越强,反之,越弱;另一方面,由于 λ 的存在,EWMA还表现出一定的吸收瞬时突发的能力,这种能力称为平稳性。显然随着 λ 减小, 估计器的平稳性增强,反之降低。

应用领域:

1. 金融和管理领域处理统计数据处理的一个常用工具

2. 在通信领域中,EWMA主要用于对网络的状态参数进行估计和平滑, 例如在TCP 拥塞控制中EWMA被 用来计算分组的往返时延( RTT ) ,在拥塞控制中的主动队列管理(AQM)技术中很多使用EWMA平滑估计拥塞指示参数( 如平均队长) 等参数

深入观察:

1. 从概率角度看,EWMA是一种理想的最大似然估计技术,它采用一个权重因子 λ 对数据进行估计,当前估计值由前一次估计值和当前的抽样值共同决定

2. 从信号处理角度看,EWMA可以看成是一个低通滤波器,通过控制 λ 值,剔除短期波动、保留长期发展趋势提供了信号的平滑形式

移动平均

移动平均,简称均线,是技术分析其中一种分析时间序列数据的工具。最常见的是利用股价、回报或交易量等变量计算出移动平均。

移动平均可抚平短期波动,将长线趋势或周期显现出来。数学上,移动平均可视为一种卷积。

简单移动平均

简单移动平均(Simple moving average, SMA)是之前n个数值的未作加权算术平均。例如,收市价的10日简单移动平均指之前10日收市价的平均数。设收市价为p1至pn,则方程式为:

8f79afe050d5bece9b84b7888219313e.png

当计算连续的数值,一个新的数值加入,同时一个旧数值剔出,所以无需每次都重新逐个数值加起来:

9c798e0a14b4c966eb8b4ad342d8c859.png

在技术分析中,有几个n的数值较为普遍,如10日、40日、200日,视乎分析时期长短而定。投资者冀从移动平均线的图表中分辨出支持位或阻力位。

加权移动平均

加权移动平均(Weighted moving average, WMA)指计算平均时个别数据乘以不同数值,在技术分析中,n日WMA的最近期一个数值乘以n、次近的乘以n-1,如此类推,一直到0:

c07b9002a4608c327cd2515dc76067c0.png

3df2e1dda9379341624ec3221eeb7b8e.png

WMA,N=15

由于WMAM + 1与WMAM的分子相差

8f575876bca26e5728d981c233bc2a71.png,假设

d03f8f806ab49d83630e8420e3f97203.png为总和M:

总和M+1 = 总和M + pM + 1 − pM − n + 1

分子M+1 = NM + 1 = 分子M + npM + 1 − 总和M

f6463c23d3577a6ab5dd4c01bafc38e5.png

留意分母为三角形数,方程式为

1b2cf0064d269d1313c9f22985e807e8.png

右图显示出加权是随日子远离而递减,直至递减至零。

指数移动平均

c34b797202472f9df5513f3dbd314212.png

EMA,N=15

指数移动平均(Exponential Moving Average, EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。右图是一例子。

加权的程度以常数α决定,α数值介乎0至1。α也可用N来代表:

2bab2a50330cd8720819208e8908f988.png,所以,N=19代表α=0.1。

设时间t的数值为Yt,而时间t的EMA则为St,计算时间t≥2是方程式为:

70deaf0e8fed3d260973449d99d235fd.png

设p=昨日(t0)价格,今日(t1)EMA的方程式为:

a53f7d29d9caabce522a0241c1b15101.png

将EMAt0分拆开来如下:

45885e9f8247649312a45f866c968318.png

理论上这是一个无穷级数,但由于1-α少于1,各项的数值会越来越细,可以被忽略。分母方面,若有足够多项,则其数值趋向 1/α。

假设k项及以后的项被忽略,即

04efd4582c9d1b66d347f5542cde770f.png,重写后可得

93fdc6e7e401e075238fccdf855bea2c.png,相当于

c61694f8321a632e60c025c1950d9003.png。所以,若要包含99.9%的加权,解方程

357dbcd7aee4e73d6776eb4f34d3a391.png即可得出k。由于当N不断增加,

e810ef9d7397034adf140143ad8f9e4c.png 将趋向

4a30f716cdd7376c1513f6924f8af77f.png,简化后k大约等于

4f78007e915ee7e682679e2e952f8f43.png

其他加权

有时计算移动平均时会加入其他变量,例如,交易量加权会加入交易量的因素。


http://chatgpt.dhexx.cn/article/ouwa7Fdw.shtml

相关文章

EWMA模型估计波动率

#tushare ID&#xff1a;474220 指数移动平均&#xff08;Exponential Moving Average, EMA或EWMA&#xff09;是以指数式递减加权的移动平均。各数值的加权而随时间而指数式递减&#xff0c;越近期的数据加权越重&#xff0c;但较旧的数据也给予一定的加权。加权的程度以常数λ…

史上最通俗易懂的EWMA(指数加权移动平均)的参数解释以及程序代码

文章目录 一、EWMA&#xff08;指数加权移动平均&#xff09;是什么&#xff1f;二、详细的参数解释3、使用Python pandas库中的ewm()函数实现指数加权移动平均&#xff08;EWMA&#xff09;的示例代码总结 一、EWMA&#xff08;指数加权移动平均&#xff09;是什么&#xff1f…

用计算器来进行计算10的几次方的问题

一、首先找到计算器&#xff0c;然后就是找到科学&#xff0c;如图&#xff1a; 二、比如说进行10的2次方&#xff0c;先进行CE清除&#xff0c;然后就是选中10&#xff0c;然后就是选中如下&#xff1a;10^x,如图&#xff1a; 选择10的平方为100&#xff0c;如图&#xff1a; …

十次方项目登陆问题 token令牌解析,claims获取不到userid,求大神帮忙看下代码解决问题

十次方项目登陆问题 token令牌解析&#xff0c;claims获取不到userid 这个是拦截器&#xff1a; 判断角色是用户还是管理员&#xff0c;如果是用户就存入(“claims_user”,token);到controller控制层 此时clims为空&#xff0c;所以下面取值为权限不足

C语言求次方代码

使用pow库函数求2的10次方 #include <stdio.h> #include <math.h>int main() {double a pow(2, 10);printf("%lf",a);return 0; }使用C编译器运行程序 只需更换pow函数中的参数即可求其他结果 _Check_return_ double __cdecl pow(_In_ double _X, …

十次方:区块链需要服务器吗?

随着区块链被正名&#xff0c;上升国家战略后&#xff0c;区块链“忽如一夜春风来&#xff0c;瞬间火遍了全国”。 什么是区块链? 区块链技术是指全民参与记账的一种方式。所有系统背后都有一个数据库&#xff0c;你可以把它看作是一个大账簿。目前是各自记各自的账。它最本…

十次方:服务器的1U、2U、U代表什么意思?

我们在租用或购买服务器的时候&#xff0c;其中有个需要考虑的因素是&#xff0c;我们的服务器需要选择多少U?有1U、2U、4U等服务器可以选择&#xff0c;那么这里的U代表是什么意思? 服务器中的 “U” 代表什么意思 ? 服务器里的“U”特指的是服务器机箱的高度&#xff0c…

五次方数(C语言)

解题思路&#xff1a; 本题的难点在于如何判断边界&#xff0c;我们先判断上边界&#xff1a;我们试着以每位数最大单位数9为边界&#xff0c;所以9^559049,有5位数&#xff0c;所以5*59049295245&#xff1b; 下边界&#xff1a;按题目要求&#xff0c;对一个数十进制表示时的…

科学计算机怎么用10次方,一个数怎么用计算器开10次方

2010-10-20 关于使用计算器&#xff1f;谢谢 那个x^y的按键就是x的y次方的意思 不知道您上高中没有&#xff0c;大概是上高中的时候学的&#xff0c;开根号的新的表示方法 比如说根号下3&#xff0c;也就是2次根号下3&#xff0c;就等于3的2分之1次方 再比如3次根号下16&#x…

window如何安装head插件

head插件是给Elasticsearch提供的图形化界面 1&#xff0c;下载地址 head插件下载地址 2&#xff0c;解压 3&#xff0c;安装node js&#xff0c;安装cnpm npm install ‐g cnpm ‐‐registryhttps://registry.npm.taobao.org4&#xff0c;将grunt安装为全局命令 。Grunt是…

用计算机怎么按四分之三次方等于多少,八十一分之十六的负四分之三次方怎么算,要具体过程,答案是多少?...

八十一分之十六的负四分之三次方怎么算&#xff0c;要具体过程&#xff0c;答案是多少&#xff1f;以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01; 八十一分之十六的负四分之三次方怎么算&a…

十次方:机架式服务器和塔式服务器有什么区别?

通过服务器外形的结构,可以把服务器分为塔式、机架式、刀片式服务器三种类型。而目前市场上比较常见的是塔式和机架式服务器两种,那么这两种服务器有什么区别呢? 外形上: 塔式服务器它的外形上跟我们普通电脑的主机差不多,是立的,可以随便放置,无需机柜。只不过个头更…

【十次方】Springboot中使用SpringCache做缓存

Spring全家桶分布式微服务&#xff08;十次方项目学习&#xff09; 十次方学习交流qq群&#xff1a;672373393 其实在sptringboot中本身提供了一个缓存SpringCache&#xff0c;相比redis更加的简单&#xff0c;但是相对的功能也没有redis强大。如果没有其它特别的需求&#xff…

10的几次方 用计算机计算公式,在excel中如何计算10的几次方呢

excel的运算功能我们都知道非常强大&#xff0c;但是在excel中如何计算10的几次方呢&#xff1f;今天小编就通过一个简单的例子来给大家介绍下在excel中10的几次方的输入和运算方法。 第一、excel 10的几次方运算结果。 在excel中如何得到 10的几次方的结果呢&#xff1f;提供两…

【十次方】Springboot中使用Redis做缓存

Spring全家桶分布式微服务&#xff08;十次方项目学习&#xff09; 十次方学习交流qq群&#xff1a;672373393 今天学习十次方项目&#xff0c;其中说到了如何在springboot框架中如何使用redis缓存&#xff0c;写篇博客记录一下。 为什么要用缓存&#xff1f; 在我们平时开发…

python开三次方_python 三次方

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符成员运算符 身份运算符 运算符优先级算术运算符 + — * % **…

十次方微服务全套课程介绍

连接资源地址 一&#xff1a;课程简介 《十次方社交系统》采用目前主流的微服务系统架构SpringBootSpringCloudSpringData进行开发&#xff0c;前端技术采用Vue.js。系统整体分为三大部分&#xff1a;微服务、网站前台、网站管理后台。功能模块包括文章、问答、招聘、活动、吐…

【JVM】jvm简介特点和jvm在整个计算机框架中的位置

本文目录 一、JVM概念二、JVM介绍三、JVM特点四、JVM的位置一、JVM概念 什么是JVM? JVM(Java Virtual Machine的缩写)一般指java虚拟机。 Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之…

JVM - 堆

# JVM - 堆 JDK版本&#xff1a;1.8 # 1、堆的核心概述 堆内存针对于JVM进程是唯一的&#xff0c;也就是一个进程只有一个JVM&#xff0c;一个进程下会存在多个线程&#xff0c;这些线程共享同一个堆空间&#xff0c;其中还可以被划分为线程私有的缓冲区(Thread Local Allocat…

Java虚拟机 - JVM是什么?

为什么要有JVM&#xff1f; JVM就是Java运行虚拟机&#xff0c;那么虚拟机又分为系统虚拟机和程序虚拟机&#xff0c;而JVM是属于程序虚拟机&#xff0c;所以不要看到是虚拟机就误认为JVM是系统虚拟机。 JVM是帮助Java程序开发者在开发过程中无需考虑无用的资源需要进行回收&a…