移动平均线SMA, EMA, SMMA算法分析


移动平均线

   移动平均线指标显示某一个时间段平均工具性价格的数值。当我们计算移动平均线的时候,其实我们是在平均这段时间内工具性价格的数值。由于价格的变化,移动平均线指标要么增加要么减少。

 

   有四种不同类型的移动平均线: 简单移动平均线SMA,指数移动平均线EMA,通畅移动平均线SMMA,线形权数移动平均线LWMA。

简单移动平均线SMA

   算术移动平均线是简单而普遍的移动平均线。平均线是指算术平均数,计算方法为一组数字相加,除以该组数据的组成个数,其 中每一给定时限在计算平均值时的权重均相等

 

公式: MA=(C1+C2+C3+C4+C5+....+Cn)/n

或者: SMA = SUM(CLOSE, N)/N

C: 第一日收盘价

n: 移动平均数周期

 

完成代码:

class Array

    def sma

        self[0..self.size-1].sum.to_f / self.size

    end

    unless method_defined?(:sum)

        def sum

            self.inject(0){|s,n|s+=n}

        end

      end

  end

测试:

[1,2,3,4,5].sma #3.0

通畅移动平均线SMMA

SMMA得算法首先需要计算SMA,公式如下:

SMOOTH(1) = SUM(CLOSE, N) / N (SMA)

SMOOTH(N) = SMOOTH(N-1) + (Price(N) - SMOOTH(N-1)) / N

计算过程:

假设一个价格数组是[1,2,3,4,5],首先设置一个时间段N,则smma1根据SMA算法计算得到, 再根据SMMA得算法,依次计算得到smma2, smma3:

smma1: (1+2+3)/3 = 2

smma2: 2 + (4-2)/3 = 2.67

smma3: 2.67 + (5-2.67)/3 = 3.44

 

完整代码:

class Array

  def sma

     self[0..self.size-1].sum.to_f / self.size

   end

  unless method_defined?(:sum)

     def sum

         self.inject(0){|s,n|s+=n}

      end

   end

 

   def smma(n)

       return 0 if n > self.size

       smma1 = self[0..n-1].sma

       (n..self.size-1).to_a.each do |i|

           smma1 = smma1 + (self[i]-smma1) / n

        end

        smma1

     end

end

测试:

[1,2,3,4,5].smma(3) #3.44

上一期我们分享过指数移动平均线EMA得计算,这里再次回顾一下

class Array

    def weighted_moving_average(tail=nil)

        idx=self.length-1

         tail= tail || self.length

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

              (tail - tidx) * self[idx - tidx]

           }.sum

         d = (tail * (tail + 1)) / 2.0

         n / d

end

alias_method :wma, :weighted_moving_average

end

 

   有些订阅者反馈,我又不买股票,研究这些算法又什么用呢? 就算有用,什么金叉,死叉我都融汇贯通了。引用一位读者得话: “在中国股市里,然并卵....”,但是我想说,这些曲线未必就必须在股市里才起作用,如果你是做电商的,可以试试分析各种商品的价格走势,销售量的走势,只要运用合理,那些你看来没有什么用处的数据,通过科学的计算方式或者不科学的计算,只要你找到一条符合客观规律的算法,那么它就给会给你带来意想不到的惊喜。

   话说回来,我们通过实例来看看,这些算法的实际效果,接下来我们对比一下这三种平滑曲线,随机生成一组数据我们这里先后测试了10,30个元素的数组

 

2.2.1 :263 >

a

"[24, 47, 13, 56, 35, 50, 27, 72, 65, 99, 94, 98]"

 

2.2.1 :267 >

(0..a.size-1).to_a.map{|x|a[0..x].smma(4).round(2)}

"[0.0, 0.0, 0.0, 35.0, 35.0, 38.75, 35.81, 44.86, 49.89, 62.17, 70.13, 77.1]"

 

2.2.1 :268 >

(0..a.size-1).to_a.map{|x|a[0..x].sma.round(2)}

"[24.0, 35.5, 28.0, 35.0, 35.0, 37.5, 36.0, 40.5, 43.22, 48.8, 52.91, 56.67]"

 

2.2.1 :268 >

(0..a.size-1).to_a.map{|x|a[0..x].wma.round(2)}

"[24.0, 39.33, 26.17, 38.1, 37.07, 40.76, 37.32, 45.03, 49.02, 58.11, 64.09, 69.31]"

同理计算30个元素随机数的样本数据:

   可以看出,简单平均线是最平滑的,但是它的敏感度是最低的,原始价格的波动对它的影响最小,而通畅移动平均线是再平滑的基础上最接近原始数据,指数平均线EMA居中,各位可以根据自己的实际需要选择哪种方式,算法没有最好的,只有最合适的!

 

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