Для временных рядов смотрите функцию rollmean
в пакете зоопарка.
Вы на самом деле рассчитываете не скользящее среднее, а какое-то взвешенное кумулятивное среднее. (Взвешенная) скользящая средняя будет выглядеть примерно так:
price <- runif(100,10,1000)
alpha <- rbeta(100,1,0.5)
tp <- embed(price,2)
ta <- embed(alpha,2)
MA1 <- apply(cbind(tp,ta),1,function(x){
weighted.mean(x[1:2],w=2*x[3:4]/sum(x))
})
Убедитесь, что вы перемасштабировали веса, чтобы они суммировались с количеством наблюдений.
Для собственного расчета вы можете попробовать что-то вроде:
MAt <- price*alpha
ma.MAt <- matrix(rep(MAt,each=n),nrow=n)
ma.MAt[upper.tri(ma.MAt)] <- 0
tt1 <- sapply(1:n,function(x){
tmp <- rev(c(rep(0,n-x),1,cumprod(rev(alpha[1:(x-1)])))[1:n])
sum(ma.MAt[i,]*tmp)
})
Это вычисляет средние значения в виде линейных комбинаций MAt с весами, определяемыми совокупным произведением альфа.
Обозначение: я предположил, что индекс лежит где-то между 0 и 1.