最適化の問題に直面しました。リターン オメガ メジャーのポートフォリオを最適化する必要があります。これは、DEoptim (ポートフォリオ最適化のための R ツールに関する Yollin の非常に優れたスライド。元のコードはそこにあります) を使用して差分進化を使用することで実行できるという提案を見つけました。
私はこの方法を私の問題に適応させようとしました(数字を変更しただけで、間違いを犯さなかったことを願っています。アイデアについては、著者の完全な功績です):
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 にかなり近く、そのようなポートフォリオのオメガは、どの単一資産のオメガよりも大きくなります (そうでなければ、その単一資産にすべてを投資してみませんか)。これは 100 回の繰り返しで達成できます。しかし、アセット数を 30 まで増やすと、満足のいく結果が得られません。重みの合計が 3 以上になり、いくつかの単一資産よりもオメガが低くなります。これは反復回数が少ない (1000 回を使用した) ためではないかと考えたので、10,000 回を試してみましたが、これは非常に遅いです。しかし、結果はほぼ同じです。重みの合計は 1 をはるかに超えており、Omega は最適ではないようです。10 アセットのアルゴリズムでは 1 に近い重みが検出されるように見えますが、Omega は 1 つのアセットよりも低くなります。
私の PC はかなり古く、Intel Core Duo 2 GHZ を搭載しています。とはいえ、1000回の反復でこのような最適化を約40分実行するのは正常ですか?
ここで何が問題になる可能性がありますか?反復回数が少なすぎるか、提供されたアルゴリズムの解釈が完全に間違っています。ご協力ありがとうございました!