繁体   English   中英

R:解释NA的波动率函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM