我遇到了一个优化问题。我需要优化投资组合以衡量回报 Omega。我发现建议可以通过 DEoptim 使用差分进化来完成(Yollin 在R 工具中用于投资组合优化的非常好的幻灯片。可以在那里找到原始代码)。
我试图使这种方法适应我的问题(因为我只更改了数字,我希望没有犯任何错误。这里的作者完全归功于这个想法):
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)
欧米茄的计算公式为 mean(pmax(retu-L,0))/mean(pmax(L-retu,0))
当资产数量非常小(例如 5)时,我得到的结果让我非常满意:资产权重加起来为 0.999???? 它非常接近 1,并且此类投资组合的 Omega 大于任何单一资产的 Omega(否则,为什么不将所有东西都投资于该单一资产)。这可以通过 100 次迭代来实现。但是当我将资产数量增加到 30 时,结果并不令人满意。权重之和为 3 或更多,并且欧米茄低于某些单一资产的权重。我认为这可能是由于迭代次数少(我使用了 1000 次),所以我尝试了 10 000 次,这非常慢。但结果几乎相同:重量加起来超过 1,而 Omega 似乎不是最佳的。使用 10 个资产的算法似乎可以找到接近 1 的权重,但 Omega 低于单个资产的权重。
我的电脑很旧,它有 Intel Core Duo 2 GHZ。但是,这种 1000 次迭代运行约 40 分钟的优化是否正常?
这里可能有什么问题?迭代次数是否太少,或者我对提供的算法的解释是完全错误的。谢谢您的帮助!