0

資産のポートフォリオの効率的なフロンティアを解決する次のコードがあります。

lb=Bounds(:,1);
ub=Bounds(:,2);

P = Portfolio('AssetList', AssetList,'LowerBound', lb, 'UpperBound', ub, 'Budget', 1);
P = P.estimateAssetMoments(AssetReturns)
[Passetmean, Passetcovar] = P.getAssetMoments

pwgt = P.estimateFrontier(20);
[prsk, pret] = P.estimatePortMoments(pwgt);

制約をある程度無視するという事実を除けば、うまく機能します(結果は以下)。制約をハード制約に設定するにはどうすればよいですか。つまり、ゼロの上限を無視しないようにするにはどうすればよいですか? たとえば、上限と下限をゼロに設定した場合 (つまり、特定の資産をポートフォリオに含めたくない場合)、その資産の計算されたポートフォリオの重みの値は、非常に小さいものの、次のようになります。最適化されたポートフォリオの一部。下限 (lb)、上限 (ub)、およびポートフォリオの重み (pwgt) の 1 つを以下に示します。

lb                  ub                     pwgt(:,1)
0                   0                   1.06685493772574e-16
0                   0                   4.17200995972422e-16
0                   0                   0
0                   0                   2.76688394418301e-16
0                   0                   3.39138439553466e-16
0.192222222222222   0.252222222222222   0.192222222222222
0.0811111111111111  0.141111111111111   0.105624956477606
0.0912121212121212  0.151212121212121   0.0912121212121212
0.0912121212121212  0.151212121212121   0.0912121212121212
0.0306060606060606  0.0906060606060606  0.0306060606060606
0.0306060606060606  0.0906060606060606  0.0306060606060606
0.121515151515152   0.181515151515152   0.181515151515152
0.0508080808080808  0.110808080808081   0.110808080808081
0.00367003367003366 0.0636700336700337  0.0388531580005063
0.00367003367003366 0.0636700336700337  0.0636700336700338
0.00367003367003366 0.0636700336700337  0.0636700336700337
0                   0                   0
0                   0                   0
0                   0                   1.29236898960272e-16

次のようなものを使用できます: pwgt=floor(pwgt*1000)/1000;、しかし、これよりもエレガントなソリューションはありませんか?

4

2 に答える 2

0

私はラミネート/エンジニアリング プロパティ コードでこのような問題を抱えていました。持っていたすべての値を取得し、それらを double から sym に体系的に変換して修正したところ、突然 1e-16 の値が実際のゼロになりましたeval(val)。これは役立つかもしれませんが、実行している .m ファイル内に移動して、.m で数値を sym に変換する必要がある場合がありますval = sym(val)

確かなことは思い出せませんが、Matlab 関数は、独自の内部処理のためにデータを受け取ると、sym を double に変更する可能性があると思います。

于 2015-04-23T20:09:56.560 に答える