【问题标题】:Portfolio optimization with Differential evolution具有差异化演化的投资组合优化
【发布时间】:2013-04-20 08:06:46
【问题描述】:

我遇到了一个优化问题。我需要优化投资组合以衡量回报 Omega。我发现建议可以通过 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 的计算公式为 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 分钟的优化是否正常?

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

【问题讨论】:

  • 除了权重总和不为 1 的惩罚之外,尝试重新调整它们:penalty &lt;- (1-sum(x))^2; x &lt;- x/sum(x)
  • 好吧,我虽然可以在优化后完成类似的事情,以获得 sum(x)=1。现在我已经尝试把这个放到优化函数中,但是好像不行,Omega还是不能接受。事实上,在函数中使用这种条件,优化返回的 Omega 会更差。

标签: r optimization portfolio differential-evolution


【解决方案1】:

如果我在您对DEoptim 的调用中注释掉control 参数,我会得到更好的结果: 权重之和更接近 1(它是 3),并且目标比 1 资产组合更好(更糟)。

# 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 ) )

【讨论】:

  • 我不能说权重缩放给我带来了很好的结果。权重之和等于 1,但欧米茄似乎不够大。但是,您关于注释掉控制参数的评论非常有价值。问题似乎与#control DEoptim 使用默认设置有关,这会导致较低的 NP 并提供更快的优化。所以我让 NP 成为默认值,并使用其他设置来播放原始脚本的效果非常好。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2016-07-07
  • 2017-11-14
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多