【问题标题】:EMA computation using filter function in R在 R 中使用过滤器函数计算 EMA
【发布时间】:2012-07-11 20:11:28
【问题描述】:

我想用矢量化符号重​​现这段代码

getEMA2<-function(x,win){
k<-2/(win+1)
v<-vector()
for (i in 1:length(x)){
    if (i==1){
        v[i]<-x[i]
    }
    else{
        v[i]<-k*x[i]+(1-k)*v[i-1]
    }
}
return (v)
}
testOutput<-getEMA2(rnorm(100,0,1),5)

我尝试过使用过滤器功能,但似乎递归/卷积方法无法实现这一点

感谢您的回复,

【问题讨论】:

    标签: r vector filtering


    【解决方案1】:

    由于filter 计算

    y[n] = x[n] + alpha * y[n-1]
    

    您需要重新调整结果。

    f <- function(x,win) {
      alpha <- 2/(win+1)
      filter(x, 1-alpha, method="recursive", side=1, init=x[1]/alpha)*alpha
    }
    x <- 1:10
    k <- 3
    getEMA2(x,k)
    f(x,k) # identical
    

    大部分过滤器已经在TTR 包中定义。

    【讨论】:

    • +1,尤其是在几分钟内击败我。 :) 顺便说一下,sides 参数仅适用于卷积过滤器。
    • @JoshuaUlrich Joshua,我注意到您已经编写了 TTR 库。为什么 EMA(1:10,2) 产生的输出与我上面发布的 getEMA2 函数不同? TTR 包中的 EMA 似乎表现得像 SMA。我决定首先发布这个帖子,因为 TTR EMA 对我来说行为不端。
    • @AdityaSihag: TTR::EMA 使用第一个 n 观测值的平均值为指数滤波器播种,并将第一个 n-1 观测值设置为 NA。你可以复制它:filter(x[-(1:win)]*alpha, 1-alpha, method="recursive", init=mean(x[1:win]))
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多