300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java 移动平均_EWMA之——EWMA指数加权移动平均模型的Java实现

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

时间:2020-12-11 07:28:04

相关推荐

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

具体代码如下:

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,则方程式为:

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

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

加权移动平均

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

WMA,N=15

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

,假设

为总和M:

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

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

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

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

指数移动平均

EMA,N=15

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

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

,所以,N=19代表α=0.1。

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

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

将EMAt0分拆开来如下:

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

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

,重写后可得

,相当于

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

即可得出k。由于当N不断增加,

将趋向

,简化后k大约等于

其他加权

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。