具有差异进化的组合优化

时间:2013-04-26 08:03:02

标签: r optimization portfolio differential-evolution

我遇到了一个优化问题。我需要优化投资组合以获得回报欧米茄。我发现这可以通过DEoptim使用差分进化来完成(Yollin在R tools for portfolio optimization上的非常好的幻灯片。可以在那里找到原始代码)。

我试图让这个方法适应我的问题(因为我只改变了数字,我希望不会犯任何错误。作者在这里完全赞同这个想法):

optOmega <-function(x,ret,L){                     #function I want to optimize and 
retu = ret %*% x                                  # x is vector of asset weights
obj = -Omega(retu,L=L,method="simple")            #Omega from PerformanceAnalytics
weight.penalty = 100*(1-sum(x))^2
return( obj + weight.penalty )
}
L=0                                               #Parameter which defines loss 
                                                  #in Omega calculation
lower = rep(0,30)                                 #I want weight to be in bounds 
upper = rep(1,30)                                 # 0<=x<=1
res = DEoptim(optOmega,lower,upper,               #I have 30 assets in StockReturn
control=list(NP=2000,itermax=100,F=0.2,CR=0.8),
ret=coredata(StockReturn),L=L)

Omega计算为平均值(pmax(retu-L,0))/ mean(pmax(L-retu,0))

当资产数量非常小(例如5)时,我得到的结果几乎让我满意:资产权重加起来为0.999 ????这是一个非常接近一个,这种投资组合的欧米茄大于任何单一资产的欧米茄(否则,为什么不投资该单一资产)。这可以通过100次迭代达到。 但是当我将资产数量增加到30时,结果并不令人满意。权重之和为3或更高,Omega低于某些单一资产。我认为这可能是由于迭代次数较少(我使用了1000次),所以我尝试了10 000次,这很慢。但结果几乎相同:重量加起来超过1,欧米茄似乎不是最佳选择。使用10资产算法似乎发现权重接近1,但欧米茄低于单一资产。

我的电脑很老,它有Intel Core Duo 2 GHZ。虽然,这种优化1000次迭代运行~40分钟是否正常?

这可能是什么问题?迭代次数太小,或者我对提供的算法的解释是完全错误的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果我在致电control时注释掉DEoptim参数,我会得到更好的结果: 权重之和接近于1(它是3),对于单一资产组合而言,目标更好(更糟糕)。

# Sample data
library(xts)
n <- 600
k <- 26
StockReturn <- matrix( rnorm(n*k), nc=k )
colnames(StockReturn) <- LETTERS[1:k]
StockReturn <- xts( StockReturn, seq.Date(Sys.Date(), length=n, by=1) )

# Objective
library(PerformanceAnalytics)
optOmega <- function(x, ret = coredata(StockReturn), L=0) {
  penalty <- (1-sum(x))^2
  x <- x/sum(x)
  objective <- -Omega( ret %*% x, L=L, method="simple" ) 
  objective + penalty
}

# Optimization
library(DEoptim)
lower <- rep(0,k)
upper <- rep(1,k)
res <- DEoptim(
  optOmega, lower, upper,
#  control = list(NP=2000, itermax=100, F=0.2, CR=0.8),
  ret = coredata(StockReturn), L = L
)

# Check the results
w <- res$optim$bestmem
sum(w)       # Close to 1
w <- w / sum(w)
optOmega(w)  # Better (lower) that for the 1-asset portfolios
min( apply( diag(k), 2, optOmega ) )