我正在尝试做一些我在这里要求的类似事情,不幸的是我无法解决。
这是我的数据框(数据),价格的时间序列:
Date Price Vol
1998-01-01 200 0.3
1998-01-02 400 0.4
1998-01-03 600 -0.2
1998-01-04 100 0.1
...
1998-01-20 100 0.1
1998-01-21 200 -0.4
1998-01-21 500 0.06
....
1998-02-01 100 0.2
1998-02-02 200 0.4
1998-02-03 500 0.3
1998-02-04 100 0.1
etc.
我想告诉 R,
- 取“Vol”的第 1 个值除以“Price”的第 20 个值,然后
- 取“Vol”的第 2 个值,然后除以“Price”的第 21 个值。
- 取“Vol”的第 3 个值除以“Price”的第 22 个值,然后
- 等等
在我的另一篇文章中,我能够使用此函数计算 20 天持有期的回报:
> data.xts <- xts(data[, -1], data[, 1])
> hold <- 20
> f <- function(x) log(tail(x, 1)) - log(head(x, 1))
> data.xts$returns.xts <- rollapply(data.xts$Price, FUN=f,
width=hold+1, align="left", na.pad=T)
有没有办法为上述问题做一些非常相似的事情?所以像
f1 <- function(x,y) head(x, 1) / tail(y,1)
其中 x 是“Vol”,y 是“Price”,然后应用“rollapply”?
非常感谢你
更新:@G 博士:感谢您的建议。稍作改动,它就做到了我想要的!
data.xts <- xts(data[, -1], data[, 1])
hold <- 20
data.xts$quo <- lag(data.xts[,2], hold) / data.xts[,1]
现在我的问题是,生成的数据框如下所示:
Date Price Vol quo
1 1998-01-01 200 0.3 NA
2 1998-01-02 400 0.4 NA
3 1998-01-03 600 -0.2 NA
4 1998-01-04 100 0.1 NA
...
21 1998-01-20 180 0.2 0.003
我知道必须有 NA 作为结果,但仅限于最后 20 次观察,而不是前 20 次观察。上述公式计算了正确的值,但是将它们从第 21 行而不是第一行开始。你知道我怎么能改变它吗?