2

我遇到了一个优化问题。我需要优化投资组合以衡量回报 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 分钟的优化是否正常?

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

4

1 回答 1

0

control如果我在你的调用中注释掉这个论点DEoptim,我会得到更好的结果:权重的总和更接近 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 ) )
于 2013-04-26T14:31:30.023 回答