簡體   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