【问题标题】:VaR calculation with complete missing column完整缺失列的 VaR 计算
【发布时间】:2014-09-26 09:28:55
【问题描述】:

我需要计算股票收益的滚动 VaR。从这篇文章:Using rollapply function for VaR calculation using R,我了解到具有完全缺失案例的列会出错。但由于各个公司股票收益的起止日期不同,当数据从长格式转换为宽格式时会产生缺失值。可以仅使用没有缺失值的行进行估计,但这会导致数据严重丢失。因此,有没有办法对具有完整缺失值的列执行计算,对于缺失的列,得到输出“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”列?我已经尝试了大多数可用于处理缺失值的方法,但找不到任何合适的解决方案。非常感谢任何帮助。

【问题讨论】:

    标签: r zoo missing-data performanceanalytics rollapply


    【解决方案1】:

    使用apply(managers,2,...) 检查整​​列是否为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的原因

    【讨论】:

    • 非常感谢 Floo0,我会尝试使用 60 天的“rollapply”功能,如果有任何问题,我会回复。
    • 我尝试使用 20 天滚动窗口估计如下: rollapply(managers2,width=20,function(x){ if(!all(is.na(x))){ return(as. numeric(VaR(x, p=.95, method="modified"))) } else { return(NA) } },by.column=T) ......但我是收到以下错误: if (eval(tmp
    • 在这篇文章中查看 G. Grothendieck 的答案:stackoverflow.com/questions/25547152/…;它解决了这个问题。
    【解决方案2】:

    除了@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
    

    【讨论】:

    • 非常感谢您提供另一种观点。
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多