R:解释 NA 的波动率函数

R: Volatility function that interprets NAs

我正在寻求有关获取波动率函数以处理我的数据框的帮助。在下面的函数中,我只是试图获取每种证券的每日价格日志 returns(我数据中的每一列都是不同证券随时间变化的价格),然后计算年化成交量。

volcalc= function (x) {
  returns=log(x)-log(lag(x))
  vol=sd(returns)*sqrt(252)
  return(vol)
}

然后我 运行 使用下面的函数,但它 returns 一个只有 NAs 的 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 合并到函数中或通过重写函数以不同的方式解决这个问题?感谢您的帮助!

我们可以用!is.na(x)删除'NA'元素,但是lag(x)将returnNA作为第一个元素,可以删除在 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 

另一种方法是保留您的数据,并通过 运行 zoo-package 中的“na.locf”函数(最后一次观察结转)将所有 NA 替换为最接近的先前非 NA 值在应用“volcalc”功能之前。在任何情况下都必须更改原始函数,因为使用“滞后”函数会引入至少一个 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 的比例以及您认为的“真实”波动率,因为返回的值会有所不同。