具有不同内核的指数移动平均线

时间:2014-07-31 23:52:15

标签: c# python math statistics smoothing

我正在尝试复制一些公式但是在将数学转换为代码时遇到问题。

这是简单的指数移动平均线 Exponential Moving Average

在c#中:

out[1] = values[1];
for (i in 2:N(X)) {
  tmp = (times[i] - times[i-1]) / tau;
  w = exp(-tmp);
  w2 = (1 - w) / tmp;
  out[i] = out[i-1] * w + values[i] * (1 - w2) + values[i-1] * (w2 - w);
}

在Python中:

mu = numpy.exp ((ts[1] - ts[0]) / self.tau)
nu = 1.0 - mu
return numpy.array ([
mu * el + nu * arr[0] for el, arr in zip (last, arrays)
])

我希望能够指定不同的内核,并且不确定如何处理它,如下所述: EMA kernel MA 这一切都完成了,所以我最终可以重新创建这里给出的移动差异: enter image description here

感谢您给予的任何帮助

1 个答案:

答案 0 :(得分:1)

这里可能的一种方法是使用一个返回内核的方法。

从我能够看到的情况来看,此方法的输入为kerneltypeiotherInputs

一个简单的方法是:

for(int i = 1; i < values.length(); i++)
{
    tmp = (times[i] - times[i-1]) / tau;
    //w = exp(-tmp);
    //w2 = (1 - w) / tmp;
    List<Object> kernelInputsInital = new List<Object>();
    kernelInputsInitial.Add(tmp);  //takes in the first argument
    kernelInputsInitial.Add(true); //expected to calculate the first
    w = GetKernel(KernelType.Exponential, i, kernelInputsInitial);

    List<Object> kernelInputsSecondTerm = new List<Object>();
    kernelInputsSecondTerm.Add(w);  //takes in the first argument
    kernelInputsSecondTerm.Add(false); //expected to calculate the first
    w2 = GetKernel(KernelType.Exponential, i, kernelInputsInitial);

    out[i] = out[i-1] * w + values[i] * (1 - w2) + values[i-1] * (w2 - w);
    ....
}

这当然非常糟糕,非常粗糙,并且可以进行改进很多,但它只是为了解决这个问题。

我会使用一个接口来表示内核,并为每个内核派生类。根据我的经验,这产生了足够可读和可维护的代码,但总有改进的余地。