题
我正在尝试做类似的事情 这里 不幸的是,我无法解决。
这是我的数据框架(数据),一个时间序列:
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”的第一值除以“价格”的第20值,然后将其除以
- 然后将“ Vol”的第2个值除以“价格”的21个值。
- 以“ vol”的第三值除以“价格”的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是“价格”,然后应用“滚动”?
非常感谢
更新: @ DR 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行而不是第一行开始。你知道我怎么能改变吗?
解决方案
实际上比这更容易。只要这样做:
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不同)
其他提示
利用 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
您将不得不否定滞后。
您只需要使用
data.xts$quo <- data.xts[,2] / lag( data.xts[,1], -hold)
不隶属于 StackOverflow