![2024-08-14T00:59:31.png]
[1]## 原理 ##
指数移动平均是一种用于平滑时间序列数据的技术,它给更近的观测值更高的权重,从而在不显著滞后的情况下平滑噪声。

公式

2024-08-14T00:53:37.png
α 是平滑因子,取值范围在0到1之间,α 越大,当前数据点的权重越大。

应用

EMA常用于金融市场的数据分析和信号处理,适用于平滑噪声较大的数据而不丢失趋势信息。

以下是指数移动平均 (EMA) 的代码实现示例,分别使用 Java、Python、Node.js 和 C#。


public class EMA {

private double alpha;
private Double ema;

public EMA(double alpha) {
    this.alpha = alpha;
    this.ema = null;
}

public double update(double value) {
    if (ema == null) {
        ema = value; // 初始值
    } else {
        ema = alpha * value + (1 - alpha) * ema;
    }
    return ema;
}

public static void main(String[] args) {
    EMA ema = new EMA(0.1); // 设置 alpha = 0.1
    double[] values = {1, 2, 3, 4, 5};

    for (double value : values) {
        double result = ema.update(value);
        System.out.println("EMA: " + result);
    }
}

}


class EMA:

def __init__(self, alpha):
    self.alpha = alpha
    self.ema = None

def update(self, value):
    if self.ema is None:
        self.ema = value  # 初始值
    else:
        self.ema = self.alpha * value + (1 - self.alpha) * self.ema
    return self.ema

ema = EMA(0.1) # 设置 alpha = 0.1
values = [1, 2, 3, 4, 5]

for value in values:

result = ema.update(value)
print("EMA:", result)


class EMA {

constructor(alpha) {
    this.alpha = alpha;
    this.ema = null;
}

update(value) {
    if (this.ema === null) {
        this.ema = value; // 初始值
    } else {
        this.ema = this.alpha * value + (1 - this.alpha) * this.ema;
    }
    return this.ema;
}

}

const ema = new EMA(0.1); // 设置 alpha = 0.1
const values = [1, 2, 3, 4, 5];

for (const value of values) {

const result = ema.update(value);
console.log("EMA:", result);

}


using System;

public class EMA {

private double alpha;
private double? ema;

public EMA(double alpha) {
    this.alpha = alpha;
    this.ema = null;
}

public double Update(double value) {
    if (ema == null) {
        ema = value; // 初始值
    } else {
        ema = alpha * value + (1 - alpha) * ema;
    }
    return ema.Value;
}

public static void Main(string[] args) {
    EMA ema = new EMA(0.1); // 设置 alpha = 0.1
    double[] values = { 1, 2, 3, 4, 5 };

    foreach (double value in values) {
        double result = ema.Update(value);
        Console.WriteLine("EMA: " + result);
    }
}

}

说明

alpha 是平滑因子,通常在0到1之间。较大的 alpha 值会让 EMA 对最近的数据变化更加敏感。
初始值:在第一次调用 update 方法时,EMA 的初始值被设置为第一个输入值。
这些示例代码展示了如何计算简单的一维时间序列数据的 EMA。在实际应用中,你可以根据需要调整 alpha 值以适应不同的数据特性。

最后修改:2024 年 08 月 14 日
如果觉得我的文章对你有用,请随意赞赏