このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,問題ベースアプローチを使用してポートフォリオ最適化問題を解く方法を示します。ソルバーベースのアプローチについては,ポートフォリオ最適化問題に対する二次計画法,ソルバーベースを参照してください。
ポートフォリオに種類の資産が含まれるとします。資産の収益率は,期待値がの確率変数です。問題は,指定された最小期待収益率を条件として,リスクを最小限にするには,どの割合で各資産に投資するかを求めることです。
は資産収益率の共分散行列を示すとします。
従来の平均分散モデルは,以下の測定でポートフォリオリスクを最小化し,
これは一連の制約に従います。
期待される収益は,投資家が望むポートフォリオの最小期待収益率を下回ってはなりません。
投資割合の合計は1にならなければなりません。
そして,割合(またはパーセント)は,0と1の間の数でなければなりません。
ポートフォリオリスクを最小限に抑えるという目的関数は二次で制約は線形であるため,最適化問題は最終的に二次計画,つまりQPとなります。
225年ここで資産をもつQPを解いてみます。データセットは或ライブラリ(Chang T.-J。,Meade, N., Beasley, J.E. and Sharaiha, Y.M., "Heuristics for cardinality constrained portfolio optimisation" Computers & Operations Research 27 (2000) 1271-1302] からの引用です。
データセットを読み込み,問題ベースのアプローチ用に制約を設定します。このデータセットでは,収益率は-0.008489 ~ 0.003971の範囲にあります。その中から望ましい収益0.002(0.2%),たとえばを選択します。
垫ファイルに保存されているデータセットを読み込みます。
负载(“port5.mat”,“相关”,“stdDev_return”,“mean_return”)
相関行列から共分散行列を計算します。
Covariance = Correlation .* (stdDev_return * stdDev_return');nAssets =元素个数(mean_return);r = 0.002;资产数目及期望回报率
最小化する最適化問題を作成します。
portprob = optimproblem;
nAssets
個の要素がある最適化ベクトル変数“x”
を作成します。この変数は各資産に投資した資産額の割合を表すので,0と1の間になければなりません。
x = optimvar (“x”nAssets,下界的0,“UpperBound”1);
目的関数は协方差1/2 * x ' * * x
です。この目的関数を問題に含めます。
协方差目标= 1/2 * x ' * * x;portprob。目标=目标;
変数の合計は1であり,ポートフォリオ全体が投資されたことを意味します。これを制約として表し,問題に含めます。
Sumcons = sum(x) == 1;portprob.Constraints.sumcons = sumcons;
平均利益はr
より大きくなければなりません。これを制約として表し,問題に含めます。
平均返回= dot(mean_return,x) >= r;portprob.Constraints.averagereturn = averagereturn;
いくつかのオプションを設定し,ソルバーを呼び出します。
反復表示をオンにするオプションと,最適性に関する終了許容誤差を小さくするオプションを設定します。
选择= optimoptions (“quadprog”,“显示”,“通路”,“TolFun”1平台以及);
ソルバーを呼び出し,時計時間を測定します。
Tic [x1,fval1] = solve(portprobb,“选项”、选择);toc
Iter Fval Primal Infeas Dual Infeas complement 0 7.212813e+00 1.227500e+02 1.195948e+00 2.217295e-03 1 8.160874e-04 3.615084e-01 3.522160e-03 2.250524e-05 2 7.220766e-04 3.592574e-01 3.500229e-03 3.378157e-05 3 4.309434e-04 9.991108e-02 9.734292e-04 2.790551e-05 4 4.734300e-04 5.551115e-16 7.77156e -163.109608e -09 10 2.042487e-04 1.221245e-15 1.08420e -18 6.423267e-09 11 1.961775e-04 1.1102223e -16 9.757820e-194.440892e-16 9.215718e-19 4.279951e-12发现满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。运行时间为0.292806秒。
結果をプロットします。
plotPortfDemoStandardModel (x1.x)
資産1 ~ 75、76 ~ 150151 ~ 225のそれぞれに投資金額の30%を投資することを要求する制約をモデルグループに追加します。これらの資産グループのそれぞれは,たとえば技術,自動車,医薬品など産業が異なることもあります。この新しい要件を含む制約は,以下のとおりです。
既存の等式にグループ制約を追加します。
Grp1 = sum(x(1:30)) >= 0.3;Grp2 = sum(x(76:150)) >= 0.3;Grp3 = sum(x(151:225)) >= 0.3;portprob.Constraints。grp1 = grp1;portprob.Constraints。grp2 = grp2;portprob.Constraints。grp3 = grp3;
ソルバーを呼び出し,時計時間を測定します。
Tic [x2,fval2] = solve(portprob,“选项”、选择);toc
Iter Fval Primal infas Dual infas innas互补0 7.212813e+00 1.227500e+02 3.539920e-01 5.253824e-03 1 7.004556e-03 2.901399e+00 8.367185e-03 2.207460e-03 2 9.181962e-04 4.095630e-01 1.181116e-03 3.749424e-04 3 7.515047e-04 3.567918e-01 1.028932e-03 3.486333e-04 4 4.238346e-04 9.005778e-02 2.597127e-04 1.607718e-04 5 3.695008e-04 1.909891e-045.4747e -09 9 2.195767e-04 8.122574e-10 2.342425e-12 2.814320e-08 10 2.102910e-04 2.839773e-10 8.189470e-13 1.037476e-08 11 2.060985e- 13 6.713696e-11 1.936133e-132.876950e-09 12 2.015107e-04 0.000000e+00 8.131516e-19 1.522226e-10 13 2.009670e-04 4.440892e-16 8.673617e-19 5.264375e-13发现满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。运行时间为0.162406秒。
結果を前の問題の結果に重ねてプロットします。
plotPortfDemoGroupModel (x1.x x2.x);
2番目の棒グラフを見ると,このポートフォリオは,グループ制約を追加したことにより,最初のポートフォリオと比べて3つの資産グループへの分配がより均一であることがわかります。また,この多様性により,目的関数(両実行の反復表示で最後の反復に“f (x)”が付いている列を参照)で測定したところ,リスクがわずかに増加する結果となりました。
より大きい問題でソルバーがどのような動作を行うかを示すため,1000資産のランダムに生成されたデータセットを使用します。MATLAB®で関数画廊
を使用して,ランダム相関行列(対称,半正定値,対角要素が1)を生成します。
再現性が必要な場合は,乱数ストリームをリセットします。
rng (0,“旋风”);nAssets = 1000;期望资产数%
-0.1 ~ 0.4の収益の平均を生成します。
一个= -0.1;b = 0.4;return = a + (b-a).*rand(nAssets,1);r = 0.15;%想要回报
0.08 ~ 0.6の収益の標準偏差を生成します。
一个= 0.08;b = 0.6;stdDev_return = a + (b-a).*rand(nAssets,1);
相关=画廊(randcorr, nAssets)
を使用して生成した相関行列を読み込みます(このサイズの相関行列を生成するには時間がかかるので,事前に生成したものを代わりに読み込みます)。
负载(“correlationMatrixDemo.mat”,“相关”);
相関行列から共分散行列を計算します。
Covariance = Correlation .* (stdDev_return * stdDev_return');
最小化する最適化問題を作成します。
portprob2 = optimproblem;
nAssets
個の要素がある最適化ベクトル変数“x”
を作成します。
x = optimvar (“x”nAssets,下界的0,“UpperBound”1);
目的関数を問題に含めます。
协方差目标= 1/2 * x ' * * x;portprob2。目标=目标;
変数の合計が1になるという制約と,平均利益がr
より大きいという制約を含めます。
Sumcons = sum(x) == 1;portprob2.Constraints。sumcons = sumcons;平均返回= dot(mean_return,x) >= r;portprob2.Constraints。averagereturn = averagereturn;
ソルバーを呼び出し,時計時間を測定します。
Tic x3 = solve(portprob2,“选项”、选择);toc
Iter Fval Primal infas Dual infas innas互补0 2.142849e+01 5.490000e+02 3.031839e+00 5.210929e-03 1 9.378552e-03 6.439102e+00 3.555978e-02 6.331676e-04 2 1.128129e-04 3.705915e-03 2.046582e-05 1.802721e-05 3 1.118804e-04 1.852958e-06 1.023291e-08 1.170562e-07 4 8.490176e-05 7.650016e-08 7.048637e-09 5 3.364597e-05 4.440892e-163.062871e-18 1.037370e-09 6 1.980189e-05 2.220446e-16 8.876905e-19 8.465558e-11发现满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。运行时间为0.913357秒。
この例では,ポートフォリオ最適化問題に対して問題ベースのアプローチを使用する方法を説明し,さまざまなサイズの二次問題におけるアルゴリズム実行時間を示します。
特に金融工具箱™でのポートフォリオ最適化用に設計された機能を使用すると,より詳細な分析が可能です。