统计学分析公式 MA移动平均线

算术移动平均线

  所谓移动平均,首先是算术平均数,如1到10十个数字,其平均数便是5.5;而移动则意味着这十个数字的变动。假如第一组是1到10,第二组变动成2到11,第三组又变为3到12,那么,这三组平均数各不相同。而这些不同的平均数的集合,便统称为移动平均数
  举例说明:某股连续十个 交易 日收盘价分别为:(单位:元)
  8.15、 8.07、 8.84、 8.10、 8.40、 9.10、 9.20、 9.10、 8.95、 8.70
  以五天 短期均线 为例:
  第五天均值=(8.15+8.07+8.84+8.10+8.40)/5=8.31
  第六天均值=(8.07+8.84+8.10+8.40+9.10)/5=8.50
  第七天均值=(8.84+8.10+8.40+9.10+9.20)/5=8.73
  第八天均值=(8.10+8.40+9.10+9.20+9.10)/5=8.78
  第九天均值=(8.40+9.10+9.20+9.10+8.95)/5=8.95
  第十天均值=(9.10+9.20+9.10+8.95+8.70)/5=9.01

算法代码实

 //统计学分析公式,算数移动平均线
        public decimal[] shuanshupingjunxian(decimal[] dec, int day)
        {
            if (day <= dec.Length)
            {
                decimal[] zs = new decimal[dec.Length - day + 1];
                if (dec.Length > 0)
                {
                    int d = 0;
                    int js = 0;
                    while (d < dec.Length - 1)
                    {
                        decimal he = 0;
                        for (int i = 0; i < day; i++)
                        {
                            if ((i + d) <= dec.Length - 1)
                            {
                                he += dec[i + d];
                            }

                        }
                        try
                        {
                            zs[js] = (he / (decimal)day);
                        }
                        catch (Exception e)
                        {
                            string ssd = e.ToString();
                        }
                        ++d;
                        js += 1;
                    }
                }
                return zs;
            }
            else
            {
                return null;
            }
                

        }

加权移动平均线

  加权的原因是基于移动平均线中,最近一日的收盘价对未来价格波动的影响最大,因此赋予它较大的权值。加权方式分为四种:
  1.末日加权移动平均线:
  计算公式: MA(N)=(C1+C2+……+Cn×2)/(n+1)
  2.线性加权移动平均线:
  计算公式: MA=(C1×1+C2×2+……+Cn×n)/(1+2+...+n)
  3.梯型加权移动平均线:
  计算方法(以5日为例):
  [(第1日收盘价+第2日收盘价)×1+(第2日收盘价+第3日收盘价)×2+(第3日收盘价+第4日收盘价)×3+(第4日收盘价+第5日收盘价)×4]/(2×1+2×2+2×3+2×4)即为第五日的阶梯加权移动平均线
  4.平方系数加权移动平均线:
  公式(以5日为例):
  MA=[(第1日收盘价×1×1)+( 第2日收盘价×2×2)+( 第3日收盘价×3×3)+( 第4日收盘价×4×4)+( 第5日收盘价×5×5)]/(1×1+2×2+3×3+4×4+5×5)

算法实现

 //统计学分析公式,加权移动平均线之平方系数
        public decimal[] jiaquanyidongpingjunxian(decimal[] dec, int day)
        {
            if (day <= dec.Length)
            {
                decimal[] zs = new decimal[dec.Length - day + 1];
                if (dec.Length > 0)
                {
                    int d = 0;
                    int js = 0;
                    while (d < dec.Length - 1)
                    {
                        decimal he = 0;
                        decimal chu = 0;
                        for (int i = 0; i < day; i++)
                        {
                            if ((i + d) <= dec.Length - 1)
                            {
                                he += dec[i + d]*(decimal)(i+1)*(decimal)(i+1);
                                chu += (decimal)(i + 1) * (decimal)(i + 1);
                            }

                        }
                        try
                        {
                            zs[js] = (he / chu);
                        }
                        catch (Exception e)
                        {
                            string ssd = e.ToString();
                        }
                        ++d;
                        js += 1;
                    }
                }
                return zs;
            }
            else
            {
                return null;
            }
                
        }

指数平滑移动平均线

  当指数平滑移动平均线起算基期不同时,起算基期较晚的计算结果会与起基期较早的数字有所差异。比如从10月30日起算5日指数平滑移动平均线的人,他所计算出的11月5日的数字一般和9和10日起算的人所到的11月5日的指数平滑移动平均线有所不同。这一差异经过稍长一段时间的平滑运算以后会趋于一致,不会有 大的差异。因此,投资者在计算EMA时或运用EMA技巧的技术指标如RSI和KD线时,如计算与他人数字有出入,关非运算有错误。
  根据上述现象,投资者不见得需要用算术移动平均线来运算EMA的第一个值,事实上第二日即可算出5日EMA或10日EMA。
  从5日指数平滑移动平均线为例,计算方式是首先以算术移动平均线计算出第一移动平均线,第二个移动平均线为:(第6日收盘价×1/5)+(前一日移动平均线×4/5)
  公式EMA=C6*1/5+EMA5*4/5

算法实现

 //统计学分析公式,指数平滑移动平均线
        public decimal[] zhishupinghuayidongpingjunxian(decimal[] dec, int day)
        {
            if (day <= dec.Length)
            {
                decimal[] zs = new decimal[dec.Length ];
                if (dec.Length > 0)
                {
                    int d = 0;
                    int js = 0;
                    while (d < dec.Length )
                    {
                        decimal he = 0;
                        if (js == 0)
                        {
                            for (int i = 0; i < day; i++)
                            {
                                if ((i + d) <= dec.Length - 1)
                                {
                                    he += dec[i + d];
                                }

                            }
                            try
                            {
                                zs[js] = (he / (decimal)day);
                            }
                            catch (Exception e)
                            {
                                string ssd = e.ToString();
                            }
                        }
                        else
                        {
                            zs[js] = (dec[d] * 1.00M) / (decimal)day + (zs[js - 1] * ((decimal)day - 1)) / (decimal)day;
                        }
                        ++d;
                        js += 1;
                    }
                }
                return zs;
            }
            else
            {
                return null;
            }
        }


你可能感兴趣的:(c#)