ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ポートフォリオ最適化問題に対する二次計画法の使用

この例では、quadprog の内点二次計画法アルゴリズムを使用して、ポートフォリオ最適化の問題を解く方法を示します。関数 quadprog は、Optimization Toolbox™ に含まれています。

この例の問題を定義する行列は高密度ですが、quadprog の内点法アルゴリズムでは、問題の行列にあるスパースを活用して速度を上げることもできます。スパースの例は、Optimization Toolbox のドキュメンテーションの「例」の節を参照してください。

2 次モデル

$n$ 種類の資産があるとします。資産 $i$ の収益率は、期待値 $m_i$ をもつ確率変数です。問題は、指定した最小期待収益率に従って、リスクを最小限に抑えるためにそれぞれの資産 $i$ で投資する割合 $x_i$ を求めることです。

$C$ が資産収益率の共分散行列を示すようにします。

従来の平均分散モデルは、一連の制約に従って、以下の測定でポートフォリオ リスクを最小化します。

$$\textstyle\frac{1}{2}x^T C x$$

期待される収益は、投資家が望むポートフォリオの最小期待収益率 $r$ 以上でなければなりません。

$$\sum_{i=1}^n m_i \; x_i \ge r,$$

投資割合 $x_i$ の合計は加算され、以下の 1 つの合計にならなければなりません。

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

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

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

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

225 資産問題

ここで、225 資産をもつ QP を解いてみます。データセットは、OR ライブラリ [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] からの引用です。

データセットを読み込み、制約を quadprog で期待する形式に設定します。このデータセットでは、収益率 $m_i$ は -0.008489 から 0.003971 の範囲で、その範囲内の最適な収益 $r$、たとえば 0.002 (0.2%) を選択します。

% Load dataset stored in a MAT-file.
load('port5.mat','Correlation','stdDev_return','mean_return')
% Calculate covariance matrix from correlation matrix.
Covariance = Correlation .* (stdDev_return * stdDev_return');
nAssets = numel(mean_return); r = 0.002;     % number of assets and desired return
Aeq = ones(1,nAssets); beq = 1;              % equality Aeq*x = beq
Aineq = -mean_return'; bineq = -r;           % inequality Aineq*x <= bineq
lb = zeros(nAssets,1); ub = ones(nAssets,1); % bounds lb <= x <= ub
c = zeros(nAssets,1);                        % objective has no linear term; set it to zero

quadprog の内点法アルゴリズムの選択

内点法アルゴリズムを使用して QP を解くには、オプションのアルゴリズムを「内点法凸」に設定します。

options = optimoptions('quadprog','Algorithm','interior-point-convex');

225 資産問題の解法

ここでは、いくつかの追加オプションを設定し、ソルバー quadprog を呼び出します。

% Set additional options: turn on iterative display, and set a tighter optimality termination tolerance.
options = optimoptions(options,'Display','iter','TolFun',1e-10);

% Call solver and measure wall-clock time.
tic
[x1,fval1] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc

% Plot results.
plotPortfDemoStandardModel(x1)
                                    First-order	 Total relative
 Iter         f(x)     Feasibility   optimality	     error
    0    7.212813e+00    1.227e+02    1.196e+00    6.769e+02   
    1    8.160874e-04    3.615e-01    3.522e-03    4.321e+00   
    2    7.220766e-04    3.593e-01    3.500e-03    3.247e+00   
    3    4.309434e-04    9.991e-02    9.734e-04    1.660e+00   
    4    4.734300e-04    2.220e-16    4.242e-06    3.823e-01   
    5    4.719034e-04    4.441e-16    8.003e-07    5.754e-03   
    6    3.587475e-04    4.441e-16    3.677e-07    3.650e-03   
    7    3.131814e-04    2.220e-16    9.587e-08    1.197e-03   
    8    2.760174e-04    4.441e-16    1.521e-08    2.652e-04   
    9    2.345751e-04    2.220e-16    4.110e-09    1.161e-04   
   10    2.042487e-04    2.220e-16    6.423e-09    2.748e-05   
   11    1.961775e-04    2.220e-16    6.068e-10    3.121e-06   
   12    1.949281e-04    4.441e-16    4.280e-12    2.705e-08   

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the selected value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.



Elapsed time is 0.259245 seconds.

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

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

$$\sum_{i=1}^{75}    x_i \ge 0.3, \qquad$$&#xA;$$\sum_{i=76}^{150}  x_i \ge 0.3, \qquad$$&#xA;$$\sum_{i=151}^{225} x_i \ge 0.3.$$

% Add group constraints to existing equalities.
Groups = blkdiag(ones(1,nAssets/3),ones(1,nAssets/3),ones(1,nAssets/3));
Aineq = [Aineq; -Groups];         % convert to <= constraint
bineq = [bineq; -0.3*ones(3,1)];  % by changing signs

% Call solver and measure wall-clock time.
tic
[x2,fval2] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc

% Plot results, superimposed to results from previous problem.
plotPortfDemoGroupModel(x1,x2);
                                    First-order	 Total relative
 Iter         f(x)     Feasibility   optimality	     error
    0    7.212813e+00    1.227e+02    3.540e-01    6.737e+02   
    1    7.004556e-03    2.901e+00    8.367e-03    1.814e+01   
    2    9.181962e-04    4.096e-01    1.181e-03    4.220e+00   
    3    7.515047e-04    3.568e-01    1.029e-03    5.242e+00   
    4    4.238346e-04    9.006e-02    2.597e-04    1.510e+00   
    5    3.695008e-04    1.910e-04    1.342e-05    3.024e-01   
    6    3.691407e-04    6.146e-07    6.817e-08    9.741e-04   
    7    3.010636e-04    7.692e-08    1.837e-08    4.322e-04   
    8    2.669065e-04    1.088e-08    5.475e-09    2.007e-04   
    9    2.195767e-04    8.123e-10    2.814e-08    8.957e-05   
   10    2.102910e-04    2.840e-10    1.037e-08    3.391e-05   
   11    2.060985e-04    6.714e-11    2.877e-09    1.518e-05   
   12    2.015107e-04    2.220e-16    1.522e-10    1.389e-06   
   13    2.009670e-04    6.661e-16    5.264e-13    4.771e-09   

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the selected value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.



Elapsed time is 0.248330 seconds.

これまでの結果の概要

2 番目の棒グラフを見ると、このポートフォリオは、グループ制約を追加したことにより、最初のポートフォリオと比べて 3 つの資産グループへの分配がより均一であることがわかります。また、この多様性により、目的関数 (両実行の反復表示で最後の反復に "f(x)" が付いている列を参照) で測定したところ、リスクがわずかに増加する結果となりました。

乱数データを使用した 1000 資産問題

quadprog の内点法アルゴリズムがより大きな問題でどのような動作を行うかを示すため、1000 資産のランダムに生成されたデータセットを使用します。MATLAB で関数 gallery を使用して、ランダム相関行列 (対称、半正定値、対角要素が 1) を生成します。

% Reset random stream for reproducibility.
rng(0,'twister');

nAssets = 1000; % desired number of assets
% Generate means of returns between -0.1 and 0.4.
a = -0.1; b = 0.4;
mean_return = a + (b-a).*rand(nAssets,1);
% Generate standard deviations of returns between 0.08 and 0.6.
a = 0.08; b = 0.6;
stdDev_return = a + (b-a).*rand(nAssets,1);
% Correlation matrix, generated using Correlation = gallery('randcorr',nAssets).
% (Generating a correlation matrix of this size takes a while, so we load
% a pre-generated one instead.)
load('correlationMatrixDemo.mat','Correlation');
% Calculate covariance matrix from correlation matrix.
Covariance = Correlation .* (stdDev_return * stdDev_return');

ランダムに作成された 1000 資産問題の定義と解法

それでは、標準的な QP 問題 (ここではグループ制約なし) を定義し、解いてみます。

r = 0.15;                                     % desired return
Aeq = ones(1,nAssets); beq = 1;               % equality Aeq*x = beq
Aineq = -mean_return'; bineq = -r;            % inequality Aineq*x <= bineq
lb = zeros(nAssets,1); ub = ones(nAssets,1);  % bounds lb <= x <= ub
c = zeros(nAssets,1);                         % objective has no linear term; set it to zero

% Call solver and measure wall-clock time.
tic
x3 = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);
toc
                                    First-order	 Total relative
 Iter         f(x)     Feasibility   optimality	     error
    0    2.142849e+01    5.490e+02    3.032e+00    1.102e+04   
    1    9.378552e-03    6.439e+00    3.556e-02    3.143e+02   
    2    1.128129e-04    3.706e-03    2.047e-05    9.457e+00   
    3    1.118804e-04    1.853e-06    1.171e-07    5.260e-03   
    4    8.490176e-05    7.650e-08    7.049e-09    3.387e-04   
    5    3.364597e-05    2.220e-16    1.037e-09    1.641e-04   
    6    1.980189e-05    2.220e-16    8.466e-11    3.748e-05   

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the selected value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.



Elapsed time is 1.813593 seconds.

まとめ

この例では、ポートフォリオ最適化問題に対して quadprog の内点法アルゴリズムを使用する方法を説明し、さまざまなサイズの 2 次問題におけるアルゴリズム実行時間を示します。アルゴリズムは、12 ギガバイト メモリを搭載し、Linux オペレーティング システムが動作する 64 ビット 8 コア 3 GHz の Intel Xeon CPU 上で実行しました。

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

この情報は役に立ちましたか?