R 基于差分进化的投资组合优化

R 基于差分进化的投资组合优化,r,optimization,portfolio,differential-evolution,R,Optimization,Portfolio,Differential Evolution,我面临一个优化问题。我需要优化投资组合的回报欧米茄衡量。我发现可以通过DEoptim使用差分进化来实现这一点(Yollin非常好的幻灯片,原始代码可以在那里找到) 我尝试将此方法应用于我的问题(因为我只更改了数字,我希望没有犯任何错误。作者的想法得到了充分肯定): optemga如果我在调用DEoptim时注释掉control参数,我会得到更好的结果: 权重之和接近于1(为3),且目标优于单资产投资组合(更差) #示例数据 图书馆(xts) n除了权重总和不等于1的惩罚外,尝试重新缩放它们:惩罚

我面临一个优化问题。我需要优化投资组合的回报欧米茄衡量。我发现可以通过DEoptim使用差分进化来实现这一点(Yollin非常好的幻灯片,原始代码可以在那里找到)

我尝试将此方法应用于我的问题(因为我只更改了数字,我希望没有犯任何错误。作者的想法得到了充分肯定):


optemga如果我在调用
DEoptim
时注释掉
control
参数,我会得到更好的结果: 权重之和接近于1(为3),且目标优于单资产投资组合(更差)

#示例数据
图书馆(xts)

n除了权重总和不等于1的惩罚外,尝试重新缩放它们:
惩罚我认为在优化后可以这样做,得到总和(x)=1。现在我试着把它放到优化函数中,但它似乎不起作用,欧米茄仍然是不可接受的。事实上,在函数中有了这个条件,优化会返回更糟糕的欧米茄。我不能说权重的缩放会给我带来好的结果。重量之和等于1,但欧米茄似乎不够大。然而,你关于评论失控论点的评论是非常有价值的。问题似乎在于#control DEoptim使用默认设置,这会降低NP,并提供更快的优化。因此,我将NP设为默认值,并使用其他设置进行播放,从而在原始脚本中获得相当好的效果。谢谢你的帮助!
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)
# 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 ) )