R:解释NA的波动率函数

时间:2015-05-22 20:09:00

标签: r dataframe time-series na

我正在寻找帮助获得波动率函数来处理我的数据帧。在下面的函数中,我只是试图获得每个安全性的每日日志回报(我的数据中的每一列是不同证券的价格随时间变化),然后计算年度累积量。

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

然后我用下面的函数运行它,但它返回一个只有NAs的1 * ncol数值向量。

testlag=apply(dataexample,2,volcalc)

我的数据帧有非常多的(它包括整个时间段内的所有资产,即使它们当时不存在),一个明显的问题是我的功能是忽略了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或通过重写功能以不同的方式解决这个问题?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

另一种方法是保留您的数据,并通过在动物园包中运行'na.locf'功能(最后一次观察结果)替换所有NA的最近的非NA值,然后再应用'volcalc' - 功能。在任何情况下都必须更改原始函数,因为使用'lag'函数会引入Akrun提到的至少一个NA(滞后为1)。

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比例以及您认为的“真实”波动率,因为返回的值会有所不同。

答案 1 :(得分:0)

我们可以删除&#39; NA&#39;使用!is.na(x)的元素,但lag(x)将返回NA作为第一个元素,可以使用na.rm=TRUE

中的sd删除
  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