ES calculation produces unreliable result (inverse risk) for column: 1

对着背影说爱祢 提交于 2019-12-10 19:27:29

问题


I keep getting this error: ES calculation produces unreliable result (inverse risk) for column: 1 message when using DEoptim. Maybe I am overlooking something so I need some help figuring this out. I have searched across the web but cant seem to find the answer.

I have a xts object called RETS containing 127 rows and 4 columns which have log returns:

library("quantmod")
library("PerformanceAnalytics")
library("DEoptim")

e <- new.env()
getSymbols("SPY;QCOR;CLNT;SRNE", from="2007-06-30", to="2007-12-31", env=e)
# combine the adjusted close values in one xts object
dataset1 <- do.call(merge, eapply(e, Ad))
# calculate returns
RETS <- na.omit(CalculateReturns(dataset1, method="log"))
# objective function
optRR.gt3 <- function(x, ret) {
  retu <- ret %*% x
  obj <- -CVaR(as.ts(-retu))/CVaR(as.ts(retu))
  obj <- ifelse(obj>0,-obj,obj)
  weight.penalty <- 100*(1-sum(x))^2 
  small.weight.penalty <- 100*sum(x[x<0.03])
  return(obj + weight.penalty + small.weight.penalty)
}
# I am Trying to optimize the function: optRR.gt3, which minimizes CVaR
ctrl <- list(itermax=250, F=0.2, CR=0.8)
set.seed(21)
res <- DEoptim(optRR.gt3, lower=rep(0,ncol(RETS)), upper=rep(1,ncol(RETS)), control=ctrl, ret=RETS)
#ES calculation produces unreliable result (risk over 100%) for column: 1 : 3.01340769101382
#ES calculation produces unreliable result (inverse risk) for column: 1 : -0.239785868862194
#ES calculation produces unreliable result (inverse risk) for column: 1 : -0.11639331543788
#ES calculation produces unreliable result (risk over 100%) for column: 1 : 1.06315102355445
#ES calculation produces unreliable result (risk over 100%) for column: 1 : 1.05285415441624
#ES calculation produces unreliable result (risk over 100%) for column: 1 : 2.19356415811659
#ES calculation produces unreliable result (inverse risk) for column: 1 : -0.0384963731133424
#Error in DEoptim(optRR.gt3, lower = rep(0, ncol(RETS)), upper = rep(1,  : 
#  NaN value of objective function! 
#Perhaps adjust the bounds.

I have run this code with other series of log returns and it works, but I sometimes run it against a series and get the error such as this one.


回答1:


This is because one of the returns in column 1 is > 100%, which causes CVaR to return NA (because you have no tail risk... or your tail "risk" is a positive return). Remove that observation and the optimization will run.

R> rets <- RETS[RETS[,1]<1]
R> ctrl <- list(itermax=5, F=0.2, CR=0.8)
R> set.seed(21)
R> res <- DEoptim(optRR.gt3, lower=rep(0,ncol(rets)), upper=rep(1,ncol(rets)), control=ctrl, ret=rets)
Iteration: 1 bestvalit: -3.931392 bestmemit:    0.499045    0.233446    0.099941    0.056293
Iteration: 2 bestvalit: -3.931392 bestmemit:    0.499045    0.233446    0.099941    0.056293
Iteration: 3 bestvalit: -3.931392 bestmemit:    0.499045    0.233446    0.099941    0.056293
Iteration: 4 bestvalit: -3.931392 bestmemit:    0.499045    0.233446    0.099941    0.056293
Iteration: 5 bestvalit: -4.079845 bestmemit:    0.481677    0.208534    0.141505    0.061751


来源:https://stackoverflow.com/questions/24466655/es-calculation-produces-unreliable-result-inverse-risk-for-column-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!