[英]R: Volatility function that interprets NAs
我正在寻找有关使波动率函数与数据框一起使用的帮助。 在下面的函数中,我只是想获取每个证券的每日价格日志回报(数据中的每一列都是一段时间内不同证券的价格),然后计算年化卷。
volcalc= function (x) {
returns=log(x)-log(lag(x))
vol=sd(returns)*sqrt(252)
return(vol)
}
然后,我使用下面的函数运行它,但它返回的是仅包含NA的1 * ncol数值向量。
testlag=apply(dataexample,2,volcalc)
我的数据框具有大量的NA资产(即使整个时间段内都没有资产,它包括整个时间段内的所有资产),一个明显的问题是我的职能是忽略了NA。 但是,当我尝试向函数中添加各种na.rm = TRUE时,它根本不起作用。
下面是一个示例数据集,其中x和y列是不同的证券,每行代表一天。
structure(list(x = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
NA, NA), y = c(3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, NA, NA, NA, NA
)), .Names = c("x", "y"), row.names = c(NA, 12L), class = "data.frame")
我的问题是:如何将NA合并到函数中,或者通过重写函数以其他方式解决此问题? 谢谢您的帮助!
一种替代方法是在应用'volcalc'-函数之前,通过运行Zoo程序包中的'na.locf'函数(结转最近的观测值),保留数据并将所有NA替换为最近的非NA值。 在任何情况下,都必须更改原始功能,因为使用“滞后”功能会引入至少一个NA(滞后为1),如Akrun所述。
df.noNA <- na.locf(df) # df: original df with NAs
apply(df.noNA, 2, volcalc) # using Akrun’s corrected volcalc function
# x y
#3.155899 1.592084
您更喜欢哪种选择很大程度上取决于数据中NA的比例以及您认为“真实”的波动性,因为返回的值将有所不同。
我们可以用!is.na(x)
删除'NA'元素,但是lag(x)
将返回NA
作为第一个元素,可以通过在sd
使用na.rm=TRUE
删除它
volcalc= function (x) {
x <- x[!is.na(x)]
returns=log(x)-log(lag(x))
vol=sd(returns, na.rm=TRUE)*sqrt(252)
return(vol)
}
apply(dataexample, 2, volcalc)
# x y
#3.012588 1.030484
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.