根据非恒定百分比变化推断时间序列

时间:2015-05-22 20:29:48

标签: r time-series xts

我正在尝试执行以下变体:计算时间序列的每个时间段的百分比变化,然后将这些百分比变化应用于单独的时间序列。

这就像将AAPL的每日价格变化应用于某些特定股票的当前价格并显示它的外观。

我有一个时间序列,其中包含适当的百分比变化:

            index        change price
2007-07-01 136.47            NA 136.3
2007-08-01 136.44 -0.0002198285   0.0
2007-09-01 135.55 -0.0065230138   0.0
2007-10-01 133.86 -0.0124677241   0.0
2007-11-01 131.34 -0.0188256387   0.0
2007-12-01 129.61 -0.0131719202   0.0

我可以使用mapply和lag来计算每个未来的价格值:

ts$price[-1,] <- mapply(function(x, y) x + (x*y), lag(ts$price, 1)[-1,], ts$change[-1,])

但是它一次只计算一行,它不会递归地工作。我看了rollapply并且遇到了同样的问题:一次只有一条记录得到更新:

ts[-1,]$price <- rollapply(as.zoo(ts), 2,
   function(x) x[1, "price"] + (x[2, "change"] * x[1, "price"]), by.column = F)

计算是正确的,我可以让它与循环一起工作,但我想了解我做错了什么。必须有办法让它以递归方式工作。

或者我可能比这更困难了?

1 个答案:

答案 0 :(得分:0)

这是一个我希望有帮助的解决方案。

以下几行只是数据

data<-matrix(data=c(2007-07-01, 136.47,NA, 136.3,2007-08-01, 136.44, -0.0002198285,0.0,2007-09-01, 135.55,-0.0065230138,0.0,2007-10-01, 133.86,-0.0124677241,0.0,2007-11-01,131.34,-0.0188256387,0.0,2007-12-01,129.61, -0.0131719202,0.0), nrow=6, ncol=4,byrow=TRUE)
data<-data[,-1]
ts<-ts(ts,frequency=12,start=c(2007,7))
colnames(ts)<-c("index", "change", "price")

您可以应用它来获得所需的输出:

for(i in 2:nrow(ts)){
  ts[i,3]<-ts[1,3]*(1+ts[i,2])
}

输出如下:

> ts
          index        change    price
Jul 2007 136.47            NA 136.3000
Aug 2007 136.44 -0.0002198285 136.2700
Sep 2007 135.55 -0.0065230138 135.4109
Oct 2007 133.86 -0.0124677241 134.6006
Nov 2007 131.34 -0.0188256387 133.7341
Dec 2007 129.61 -0.0131719202 134.5047