您是否需要所有历史值来计算 EMA?

Do you need all the historic previous values to calculate EMA?

我正在使用 PHP.

计算某些价格系列的 EMA

Moving Averages in wikipedia
WHAT IS EMA?

假设您有一个包含 5000 个元素的数组,并且您想要计算 EMA 10。

与SMA相比,在SMA中您只需要获取最后10个值并计算平均值,而在EMA中您需要之前的EMA值才能进行新的计算。第一个 EMA 值是所需元素的 SMA 数量。

我的问题是,您是否需要处理 EMA 的前 5000 个值?

正如我所说,它使用以前的值进行下一次计算,理论上你必须这样做,但是当你有例如 500 万个寄存器时,这可能是个问题。

还是只需要获取从 $n-20 到 $n-11 的项目,计算 SMA,然后对最后 10 个值应用 EMA?

此外,旧值 EMA 的弃用速度更快,因为它为此使用了 Alpha。我创建了下一个函数来计算 EMA:

function EMA($v,$lastvalue,$num=200)
{

    if($num>(count($v)-1))
        return FALSE;        
    $MA=0;    
    $initMA=count($v)-2*$num;
    if($initMA<0)
        $initMA=0;
    for($i=0,$j=$initMA;$i<$num;$i++,$j++)
        $MA+=$v[$j];
    $EMA=$MA/$num;
    $a = 2/ ($num + 1);
    for($i=$j;$i<count($v)-1;$i++)
        $EMA = $a * $v[$i+1]+ (1-$a) * $EMA;
    $EMA = $a * $lastvalue+ (1-$a) * $EMA;
    return $EMA;
}

提前致谢。

我已经用 EMA20 测试了一长串具有已知 ema20 结果的数字,并将值与我的算法进行比较,是的,您需要从一开始就需要所有值。

在像 EMA200 这样有很多数字的 EMA 中,这并不重要,因为旧值的权重非常小,但在高波动性的小 EMA 中,使用历史值中的所有值计算 ema 很重要。

所以一个高效的算法需要将所有那些以前的 ema 存储在一个文件或数据库中,因为计算当前的 ema 会产生很多计算,如果你已经计算了它们,那只是一个简单的操作。