我正在寻找帮助获得波动率函数来处理我的数据帧。在下面的函数中,我只是试图获得每个安全性的每日日志回报(我的数据中的每一列是不同证券的价格随时间变化),然后计算年度累积量。
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或通过重写功能以不同的方式解决这个问题?谢谢你的帮助!
答案 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