Вы можете использовать функцию rollapply()
из пакета zoo
, если вы работаете с серией зоопарка:
TimeSeries <- cumsum(rnorm(1000))
ZooSeries <- as.zoo(TimeSeries)
BollLines <- rollapply(ZooSeries,9,function(x){
M <- mean(x)
SD <- sd(x)
c(M,M+SD*2,M-SD*2)
})
Теперь вы должны помнить, что rollapply
использует центрированный фрейм, что означает, что он принимает значения слева и справа от текущего дня. Это также более удобно и более верно для определения полосы Боллинджера, чем ваше предложение принять x предыдущих значений.
Если вы не хотите конвертировать в зоопарк, вы также можете использовать векторы и написать свою собственную функцию. Я добавил функцию построения графиков на основе S3, которая также позволяет легко строить расчеты. С помощью этих функций вы можете сделать что-то вроде:
TimeSeries <- cumsum(rnorm(1000))
X <- BollingerBands(TimeSeries,80)
plot(X,TimeSeries,type="l",main="An Example")
чтобы получить:
Коды функций:
BollingerBands <- function(x,width){
Start <- width +1
Stop <- length(x)
Trail <- rep(NA,ceiling(width/2))
Tail <- rep(NA,floor(width/2))
Lines <- sapply(Start:Stop,function(i){
M <- mean(x[(i-width):i])
SD <- sd(x[(i-width):i])
c(M,M+2*SD,M-2*SD)
})
Lines <- apply(Lines,1,function(i)c(Trail,i,Tail))
Out <- data.frame(Lines)
names(Out) <- c("Mean","Upper","Lower")
class(Out) <- c("BollingerBands",class(Out))
Out
}
plot.BollingerBands <- function(x,data,lcol=c("red","blue","blue"),...){
plot(data,...)
for(i in 1:3){
lines(x[,i],col=lcol[i])
}
}