主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ポートフォリオ最適化に対する二次計画法,問題ベース

この例では,問題ベースアプローチを使用してポートフォリオ最適化問題を解く方法を示します。ソルバーベースのアプローチについては,ポートフォリオ最適化問題に対する二次計画法,ソルバーベースを参照してください。

二次モデル

ポートフォリオにn美元種類の資産が含まれるとします。資産我美元の収益率は,期待値がm_i美元の確率変数です。問題は,指定された最小期待収益率を条件として,リスクを最小限にするには,どの割合x_i美元で各資産我美元に投資するかを求めることです。

美元加元は資産収益率の共分散行列を示すとします。

従来の平均分散モデルは,以下の測定でポートフォリオリスクを最小化し,

$ $ \压裂{1}{2}x ^ T C x $ $

これは一連の制約に従います。

期待される収益は,投資家が望むポートフォリオの最小期待収益率r美元を下回ってはなりません。

$ $ \ sum_ {i = 1} ^ n m_i \;通用电气x_i \ r, $ $

投資割合x_i美元の合計は1にならなければなりません。

$ sum_{i=1}^n x_i =1,$$

そして,割合(またはパーセント)は,0と1の間の数でなければなりません。

$$0 \le x_i \le 1, \;\;I = 1 \ldots n.$

ポートフォリオリスクを最小限に抑えるという目的関数は二次で制約は線形であるため,最適化問題は最終的に二次計画,つまりQPとなります。

225 資産問題

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] からの引用です。

データセットを読み込み,問題ベースのアプローチ用に制約を設定します。このデータセットでは,収益率m_i美元は-0.008489 ~ 0.003971の範囲にあります。その中から望ましい収益r美元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;

225年資産問題の解法

いくつかのオプションを設定し,ソルバーを呼び出します。

反復表示をオンにするオプションと,最適性に関する終了許容誤差を小さくするオプションを設定します。

选择= 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)

225年グループ制約付き資産問題

資産1 ~ 75、76 ~ 150151 ~ 225のそれぞれに投資金額の30%を投資することを要求する制約をモデルグループに追加します。これらの資産グループのそれぞれは,たとえば技術,自動車,医薬品など産業が異なることもあります。この新しい要件を含む制約は,以下のとおりです。

$ $ \ sum_ {i = 1} ^ {75} x_i \通用电气0.3 \ qquad $ $ & # xA; $ $ \ sum_{我= 76}^ {150}x_i \通用电气0.3 \ qquad $ $ & # xA; $ $ \ sum_{我= 151}^ {225}x_i \通用电气0.3,$ $

既存の等式にグループ制約を追加します。

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資産問題

より大きい問題でソルバーがどのような動作を行うかを示すため,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;

1000年資産問題の解法

ソルバーを呼び出し,時計時間を測定します。

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秒。

まとめ

この例では,ポートフォリオ最適化問題に対して問題ベースのアプローチを使用する方法を説明し,さまざまなサイズの二次問題におけるアルゴリズム実行時間を示します。

特に金融工具箱™でのポートフォリオ最適化用に設計された機能を使用すると,より詳細な分析が可能です。

関連するトピック