4

学习 R 语言 - 我知道如何做移动平均线,但我需要做更多 - 但我不是统计学家 - 不幸的是,所有文档似乎都是为统计学家编写的。

我经常在excel中这样做,它对于分析运营活动非常方便。

以下是用于制作布林带的每行字段:

值可以是来电次数、投诉率等任何内容

时间戳 | 价值 | 移动平均线 | 移动 STDEVP | 下控制 | 上层控制

简而言之,移动 avg 和 stdevP 指向序列中的前 8 个左右的值。给定时间点的下限控制 = 移动平均 - 2* 移动 stdevP 上限控制 = 移动平均 + 2* 移动 stdevP

这可以很容易地在 excel 中为单个文件完成,但如果我能找到一种让 R 工作的方法,R 会更好地满足我的需求。希望自动化时也更快,更可靠。

链接或提示将不胜感激。

4

2 回答 2

3

您可以使用包中的功能rollapply(),前提是您使用zoozoo 系列:

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 先验值的建议更方便、更符合布林带的定义。

如果您不想转换为 zoo,您也可以使用向量并编写自己的函数。我添加了一个基于 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])
    }
}
于 2011-03-30T14:29:53.983 回答
1

R Graph Gallery (65)中有一个插图,给出了计算波段和绘制股价的代码。

2005 年的代码在 6 年后似乎仍然有效,并将给出 IBM 目前的股价并回溯数月

IBM 布林带

最明显的错误是带宽和交易量较低图表的宽度已经变窄;在涵盖的天数内可能还有另一个。

于 2011-04-03T23:51:09.663 回答