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