移动平均线
移动平均线指标显示某一个时间段平均工具性价格的数值。当我们计算移动平均线的时候,其实我们是在平均这段时间内工具性价格的数值。由于价格的变化,移动平均线指标要么增加要么减少。
有四种不同类型的移动平均线: 简单移动平均线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居中,各位可以根据自己的实际需要选择哪种方式,算法没有最好的,只有最合适的!