科学炒股-指数平均数指标EMA算法RUBY实现

​EMA(Exponential Moving Average),指数平均数指标。也叫EXPMA指标,也称一次指数平滑法,它也是一种趋向类指标,指数平均数指标是以指数式递减加权的移动平均。

公式:

EMAtoday=α * Pricetoday + ( 1 - α ) * EMAyesterday;

其中,α为平滑指数,一般取作2/(N+1)。在计算MACD指标时,EMA计算中的N一般选取12和26天,因此α相应为2/13和2/27。

当公式不断递归,直至EMA1出现,EMA1是没有定义的。EMA1 的取值有几种不同的方法,通常情况下取EMA1为Price1另外有的技术是将EMA1取值为开头4到5个数值的均值。

在计算机递推计算时,可以写作:

EMAtoday=α * ( Pricetoday - EMAyesterday ) + EMAyesterday;

将EMAyesterday按照类似方法递推展开,可以得到:

其中,p1表示今天价格,p2表示昨天价格,以此类推。

将平滑系数α 展开,由于

,可以得到:

来自moving_average的算法:

def exponential_moving_average(idx=nil, tail=nil)

    alpha = 2.0 / (tail + 1)

    n = (1..tail).to_a.map{|tidx| 

      (1 - alpha) ** (tidx - 1) * self[idx - tidx + 1]

    }.sum

    d = (1..tail).to_a.map{|tidx| 

      (1 - alpha) ** (tidx - 1)

    }.sum

    n / d

  end

其中tail为数组的size, idx为为索引(size-1),分解计算过程:

EMA值相对MA有两个优点:

1.它赋予最后一个交易日更大的权重,因为越接近的变化越重要.
2.EMA不像MA一样迅速淘汰过期的数据,而是慢慢消退.

 

你可能感兴趣的:(WMA,sma,ema)