我正在尝试做类似我要求的here,不幸的是我无法解决这个问题。
这是我的数据框(数据),价格的时间序列:
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,
在我的另一篇文章中,我能够使用此函数计算持续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行开始而不是第一行。你知道我怎么能改变它吗?
答案 0 :(得分:2)
在by.column = FALSE
中使用rollapply
。为了使用发布的数据,我们将第一行中的音量除以第三行中的价格,以此类推,以便重现插图:
library(zoo)
Lines <- "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"
# read in and use aggregate to remove all but last point in each day.
# In reality we would replace textConnection(Lines) with something
# like "myfile.dat"
z <- read.zoo(textConnection(Lines), header = TRUE,
aggregate = function(x) tail(x, 1))
# divide Volume by the Price of the point 2 rows ahead using by.column = FALSE
# Note use of align = "left" to align with the volume.
# If we used align = "right" it would align with the price.
rollapply(z, 3, function(x) x[1, "Vol"] / x[3, "Price"], by.column = FALSE,
align = "left")
# and this is the same as rollapply with align = "left" as above
z$Vol / lag(z$Price, 2)
# this is the same as using rollapply with align = "right"
lag(z$Vol, -2) / z$Price
顺便提一下,请注意zoo
对lag
的符号使用与R
相同的约定,但xts
使用相反的约定,因此如果转换上述内容到xts
你必须否定滞后。
答案 1 :(得分:1)
实际上比这更容易。就这样做:
data.xts <- xts(data[, -1], data[, 1])
hold <- 20
returns.xts = data.xts[,2] / lag(data.xts[,1], hold)
实际上,使用动物园代替xts也可以这样做:
data.zoo<- zoo(data[, -1], data[, 1])
hold <- 20
returns.zoo = data.zoo[,2] / lag(data.zoo[,1], -hold)
只有改变的是滞后的标志(动物园惯例不同于xts)
答案 2 :(得分:0)
你只需要使用
data.xts$quo <- data.xts[,2] / lag( data.xts[,1], -hold)