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