2

我需要计算股票收益的滚动 VaR。从这篇文章:使用 rollapply 函数使用 R 进行 VaR 计算,我了解到具有完全缺失案例的列会出错。但由于各个公司股票收益的起止日期不同,当数据从长格式转换为宽格式时会产生缺失值。可以仅使用没有缺失值的行进行估计,但这会导致数据严重丢失。因此,有没有办法对具有完整缺失值的列执行计算,对于缺失的列,得到输出“NA”。这就是我所做的:

library(PerformanceAnalytics)
data(managers)
VaR(managers, p=.95, method="modified")

它执行所需的计算,但是当我尝试使用前 60 行完全缺失“HAM6”列时

managers2<-managers[1:60,]
VaR(managers2, p=.95, method="modified")

我收到以下错误:

Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) :
'dimnames' applied to non-array

我知道错误是由于缺少“HAM6”列,但有没有办法保留缺少的列并为“HAM6”获取输出“NA”而不是删除“HAM6”列?我已经尝试了大多数可用于处理缺失值的方法,但找不到任何合适的解决方案。任何帮助深表感谢。

4

2 回答 2

1

使用apply(managers,2,...)with 检查整列是否NA如下:

apply(managers2,2,function(x){
  if(!all(is.na(x))){
    return(as.numeric(VaR(x, p=.95, method="modified")))
  } else {
    return(NA)
  }
})

结果:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00354267287759942
       HAM1        HAM2        HAM3        HAM4        HAM5        HAM6 EDHEC LS EQ    SP500 TR   US 10Y TR    US 3m TR 
-0.03212244 -0.03698665 -0.04403660 -0.08093557 -0.12635656          NA -0.02275816 -0.06886077 -0.02510378          NA

警告指的是US 3m TR。这就是有一个NA

于 2014-08-03T23:20:46.790 回答
0

除了@Floo0 的解决方案,作为该问题的解决方法,缺失值可以通过相应时期的平均回报来估算。有关更多信息,请参阅(http://www.r-bloggers.com/missing-data-imputation/ )

require(PerformanceAnalytics)
data(managers)

managers.df=as.data.frame(managers)

dateidx = as.Date(index(managers))


#Compute mean Return for each period
MeanReturn_PerPeriod=rowMeans(managers.df,na.rm=TRUE)

#Create copy of dataset for new values
managers.df.new=managers.df

#Impute NA Values by average return for rest of the data
for(x in 1:ncol(managers.df.new)) {
 managers.df.new[,x][is.na(managers.df.new[,x])]=MeanReturn_PerPeriod[is.na(managers.df.new[,x])]
}

managers_imputed=xts(managers.df.new,order.by=dateidx)

#Test VaR calculation

managers2<-managers_imputed[1:60,]
VaR(managers2, p=.95, method="modified")
#VaR calculation produces unreliable result (inverse risk) for column: 10 : -0.00354267287759942
#           HAM1        HAM2       HAM3        HAM4        HAM5        HAM6 EDHEC LS EQ    SP500 TR   US 10Y TR
#VaR -0.03212244 -0.03491864 -0.0440366 -0.08093557 -0.02880137 -0.02696782 -0.02130781 -0.06886077 -0.02510378
#    US 3m TR
#VaR       NA
于 2014-08-03T23:37:42.270 回答