具体代码如下:

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);

java判断均线_EWMA:EWMA指数加权移动平均模型的Java实现相关推荐

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

    具体代码如下: package com.lyz.storm.ewma; import java.io.Serializable; /** * 实现指数移动平均值计算 * 实现中使用了流式风格的buil ...

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

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79141435 具体代码如下: package com.lyz.storm.ewma ...

  3. EWMA 指数加权移动平均 模型

    Exponentially Weighted Moving Average(EWMA)指数加权移动平均是一种常用的序列数据处理方式,如下: 在时间 t, 根据实际的观测值(或量测值)我们可以求取 EW ...

  4. EWMA 指数加权移动平均

    EWMA(Exponentially Weighted Moving Average)指数加权移动平均,是一种常用的序列数据处理方式. 在t时刻,根据实际的观测值可以求取EWMA(t):EWMA(t) ...

  5. Python 金融量化 均线系统交易策略专题(简单移动平均,加权移动平均,指数加权移动平均,异同移动平均MACD等解读与绘图)

    捕捉趋势最普遍的方法为移动平均线,根据求平均的方式不同,移动平均数又可分为简单移动平均数(Simple Moving Average, SMA),加权移动平均数(Weighted Moving Ave ...

  6. EWMA(Exponentially Weighted Moving Average)指数加权移动平均

    原博:http://blog.csdn.net/sony_zhang/article/details/7256646 EWMA(Exponentially Weighted Moving Averag ...

  7. 神经网络基础--指数加权移动平均ewma

    因为神经网络中的常用优化算法都会涉及到指数加权移动平均(exponential weighted moving average, ewma:也可称为exponential moving average ...

  8. java检查两个字符串是否包含,java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含...

    java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含 要检查一个字符串是否包含另外一个字符串需要使用indexOf()方法,如果indexOf方法返回大于等于0的值 ...

  9. java判断读到末尾_Flink实战:自定义KafkaDeserializationSchema(Java/Scala)

    微信公众号: 大数据开发运维架构 关注可了解更多大数据相关的资讯.问题或建议,请公众号留言; 如果您觉得"大数据开发运维架构"对你有帮助,欢迎转发朋友圈 kafka中的数据通常是键 ...

最新文章

  1. SDOI2015 约数个数和(莫比乌斯反演经典、双上限整除分块)超详细笔记
  2. 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇
  3. 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns
  4. springmvc 重定向传递参数
  5. 深入理解 python 中的赋值、引用、拷贝、作用域
  6. [scikit-learn 机器学习] 7. 朴素贝叶斯
  7. 郑杰 | 如何拿回我们自己的医疗数据?
  8. Spring Cloud 之 Feign 使用HTTP请求远程服务
  9. 现代软件工程 第一章 四则运算的实现--栈实现
  10. koa 接口返回数据_node和koa实现数据mock接口
  11. 合数阶群与素数阶群的双线性映射
  12. 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门
  13. Sentinel-2(哨兵2号)数据下载及预处理
  14. python打印数字每行自增1个数
  15. [RK3588 Android12]修改开机logo和播放开机视频
  16. Houdini实现AO效果
  17. cad转dxf格式文件太大,怎样操作将多张CAD图纸文件转换成高版本的DXF格式?
  18. 11年北漂老码农转行!黯然离场...
  19. 在 Windows 10 中更改默认浏览器
  20. 记单词05-od,-hod(路)

热门文章

  1. Linux服务器远程管理
  2. APP-10-文字识别-票据识别
  3. 服务器下传Android端,本地Tomcat服务器接收android端上传的数据
  4. 域名续费需要注意什么?
  5. 时钟初始化flash设置
  6. 头歌(educoder)第 3 章 Java入门之数组 Java入门 - 数组进阶
  7. STM32+W5500实现以太网通信
  8. 在VMware Workstation 16安装windows 2008 R2系统虚机后,VMware tool工具无法时报错——安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1
  9. 使用Ping/Nslookup/Dig排查DNS问题
  10. linux 软连接生成器,软件包生成工具 Spack 3.1 发布