主要内容

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

混合整数二次計画法ポトフォリオ最適化問題:ソルバベス

この例では,混合整数線形計画法(milp)ソルバintlinprogを使用して,混合整数二次計画法(miqp)のポ,トフォリオ最適化問題の解法を示します。考え方としては,MIQP問題を局所的に近似する一連のMILP問題を反復的に求めるというものです。問題ベスのアプロチにいては,混合整数二次計画法ポ,トフォリオ最適化問題:問題ベ,スを参照してください。

問題の概要

马科维茨が示したように,多くのポートフォリオ最適化問題は二次計画問題として表されます(“投资组合选择,”j .金融卷7,问题1,第91 - 77页,1952年3月)。N件の項目から成る一連の資産があり,ポ,トフォリオを選ぶとします。ここで x は資産 における投資割合です。各資産の平均収益のベクトル r および収益の共分散行列 がわかっている場合,与えられた危険回避のレベル λ に対し,リスク調整後の期待収益を最大化します。

马克斯 x r T x - λ x T x

quadprogソルバ,を使用してこの二次計画問題を解きます。しかし,そのままの二次計画問題に加えて,ポートフォリオに次のようなさまざまな制限をかけることが必要な場合があります。

  • ポ,トフォリオに含まれる資産が個を超えないものとする。ここでM <= n

  • ポ,トフォリオが少なくとも個の資産を含むとする。ここで0 < m <= m

  • “半連続的な”制約があるものとする。これは, x 0 であるか, f n > 0 および f 一个 x f n のいくいて f n x f 一个 x であることを意味します。

quadprogにこれらの制約を含めることはできません。難しいのは,制約の離散的な性質です。さらに,混合整数線形計画法ソルバintlinprogは離散的な制約は処理できますが,二次の目的関数は扱いません。

この例では,制約を満たすと共に,しだいに二次の目的関数を近似するようになる一連のMILP問題を作成します。この手法はこの例にいては機能しますが,他の問題や制約のタプには当てはまらない場合があります。

まず制約をモデル化します。

離散的な制約のモデル化

x は資産配分の割合を表すベクトルであり,各 にいて 0 x 1 です。ポ,トフォリオに含まれる資産の個数をモデル化するため, x 0 の場合は v 0 x > 0 の場合は v 1 になるように指標変数 v を設定します。この制限を満たす変数を得るため,ベクトル v をバesc escナリ変数に設定し,線形制約を課します。

v f n x v f 一个 x

これらの不等式によって, x v はまったく同時にゼロになります。また, x > 0 の場合は常に, f n x f 一个 x になります。

また,ポ,トフォリオ内の資産数への制約を実現させるため,線形制約を課します。

v

目的関数および連続的線形近似

最初に定式化したように,目的関数を最大化しようと試みます。ところが、Optimization Toolbox™ のソルバーではすべて最小化されます。そこで、目的関数の負の値を最小化するように問題を定式化します。

最小值 x λ x T x - r T x

この目的関数は非線形です。intlinprogMilpソルバ,には線形目的関数が必要です。この問題を線形目的関数と非線形な制約をも問題に再度定式化する標準の手法があります。二次の項を表すためにスラック変数 z を導入します。

最小值 x z λ z - r T x 这样 x T x - z 0 z 0

MILP近似を反復的に解く際,新規の線形制約を組み込み,各制約によって,現在の点の近くにある非線形な制約を局所的に近似します。具体的には, x 0 が定数ベクトル, δ が変数ベクトルである x x 0 + δ に。

x T x - z x 0 T x 0 + 2 x 0 T δ - z + O | δ | 2

δ x - x 0 で置き換えると,次のようになります。

x T x - z - x 0 T x 0 + 2 x 0 T x - z + O | x - x 0 | 2

各中間解 x k にいて,上式の線形部分として x z に新しい線形制約を導入します。

- x k T x k + 2 x k T x - z 0

これは 一个 x b という形式になります。ここで, 一个 2 x k T z 項の乗数は - 1 b x k T x k です。

問題に新規の線形制約を追加するこの方法は,切除平面法と呼ばれます.詳細にいては,j。小凯利求解凸程序的切平面法j . Soc.Indust.Appl.Math.Vol。8,第4期,第703-712页,1960年12月を参照してください。

Matlab®での問題の定式化

intlinprogソルバ,向けに問題を表すためには以下を行う必要があります。

  • 変数が表す内容の決定

  • これらの変数の下限と上限の明示

  • 線形の等式および不等式行列の指定

最初の N 個の変数は x ベクトルを表し,次の N 個の変数は2値の v ベクトルを表し,最後の変数はスラック変数 z を表します。問題には 2 N + 1 個の変数が含まれています。

問題のデ,タを読み込みます。このデ,タには,ベクトルrに含まれる225個の期待される収益と,225行225列の行列に含まれる収益の共分散があります。デ,タは,“ポ,トフォリオ最適化問題に対する二次計画法の使用”の例と同じです。

负载port5R = mean_return;Q =相关性。* (stdDev_return * stdDev_return');

資産の数をNに設定します。

N =长度(r);

変数の@ @ンデックスを設定します

xvars = 1:N;vvars = N+1:2*N;zvar = 2*N+1;

問題において2 n + 1個のすべての変数の下限はゼロです。最初の2 n個の変数の上限は1で,最後の変数には上限はありません。

lb = 0 (2*N+1,1);ub = ones(2*N+1,1);ub(zvar) = Inf;

解における資産の数を100 ~ 150に設定します。この制約を次の形式で問題に組み込みます。

v

形式 一个 x b の2の線形制約を記述すると,次のようになります。

v

- v -

M = 150;M = 100;A = 0 (1,2*N+1);分配一个矩阵A(vars) = 1;% A*x表示v(i)A = [A; -a];B = 0 (2,1);分配b向量b(1) = M;B (2) = -m;

半連続的な制約を含めます。それぞれの資産タ▪▪プに▪▪いて,非ゼロの最小の資産の割合を0.001に,また,最大の割合を0.05にします。

Fmin = 0.001;Fmax = 0.05;

線形不等式として,不等式 x f 一个 x v および f n v x を含めます。

Atemp =眼睛(N);Amax = horzcat(Atemp,-Atemp*fmax, 0 (N,1));A = [A;Amax];b = [b; 0 (N,1)];Amin = horzcat(-Atemp,Atemp*fmin, 0 (N,1));A = [A;阿明];b = [b; 0 (N,1)];

ポトフォリオは100%運用であるという制約を含めます。これは, x 1 を意味します。

Aeq = 0 (1,2*N+1);分配Aeq矩阵Aeq(xvars) = 1;Beq = 1;

危険回避係数 λ One hundred.に設定します。

Lambda = 100;

目的関数 λ z - r T x をベクトルとして定義します。変数 v の乗数にはゼロを含めます。

f = [-r; 0 (N,1);lambda];

問題を解く

問題を反復的に解くために,現在の制約をも問題を解くことから始めます。現在の制約にいては,いかなる線形化も実施していません。vvarsベクトルは整数制約をもます。

选项= optimoptions(@intlinprog,“显示”“关闭”);抑制迭代显示[xLinInt,fval,exitFlagInt,output] = intlinprog(f,vvars,A,b,Aeq,beq,lb,ub,options);

反復の停止条件を決めます。スラック変数 z が真の二次値の0.01%以内になったときに反復を止めます。制約が累積されても問題が厳密に実行可能であることを確保するために,許容誤差を既定より小さく設定します。

Thediff = 1e-4;Iter = 1;%迭代计数器assets = xLinInt(xvars);% x变量truequadatic =资产的*Q*资产;zslack = xLinInt(zvar);松弛变量值选项= optimoptions(选项,“LPOptimalityTolerance”1平台以及“RelativeGapTolerance”1 e-8...“ConstraintTolerance”1 e-9“IntegerTolerance”1 e-6);

プロットするために二次の真値とスラック変数の計算履歴を保存します。

History = [truequadratic,zslack];

二次の値およびスラック変数の値を計算します。それらが異なる場合は,別の線形制約を追加して再度解を求めます。

ツールボックスの構文にある,それぞれの新規の線形制約 一个 x b は次の線形近似から得られます。

- x k T x k + 2 x k T x - z 0

一个 2 x k T の新しい行, b x k T x k の新しい要素,および 一个 の-1係数で表される z 項があるのがわかります。

新規の解が求まったら,元の解と新規解の中間にある線形制約を使用します。線形制約を含んでいるこのヒューリスティックな方法のほうが,単純に新規解を用いるよりも高速になる場合があります。この中間のヒューリスティックな方法の代わりに解を使う場合は,下記の中途“の行にコメントし,その次の行のコメントを解除します。

Abs ((zslack - truequadatic)/ truequadatic) > thediff%相对误差newArow = horzcat(2*资产'*Q,零(1,N),-1);线性化约束rhs =资产的*Q*资产;%线性化约束的右边A = [A;newArow];B = [B;rhs];用新的约束条件解决问题。[xLinInt,fval,exitFlagInt,output] = intlinprog(f,vvars,A,b,Aeq,beq,lb,ub,options);assets = (assets+xLinInt(xvars))/2;从以前到现在的中途% assets = xLinInt(xvars);使用前一行或这一行truequadratic = xLinInt(xvars)'*Q* xLinInt(xvars);zslack = xLinInt(zvar);历史=[历史;truequadratic,zslack];Iter = Iter + 1;结束

解と収束率の検証

スラック変数と目的関数の二次の部分の計算履歴をプロットしてどのように収束するかを確認します。

情节(历史)传说(“二次”“松弛”)包含(的迭代次数)标题(二次和线性逼近(松弛)

图中包含一个轴。标题为二次和线性近似(松弛)的轴包含2个类型为line的对象。这些对象代表了二次元、Slack。

米尔普の解はどのような品質でしょうか。输出構造体に,その情報が含まれます。解における,内部で計算された目的関数の限界値間のギャップの絶対値を検証します。

disp (output.absolutegap)
0

ギャップの絶対値はゼロであり,milpの解は正確であることを示しています。

最適な資産配分をプロットします。中間位置での更新を使用すると,资产は制約を満たさない可能性があるため,资产ではなく,xLinInt (xvars)を使用します。

栏(xLinInt (xvars))网格包含(“资产指数”) ylabel (“投资比例”)标题(“最优资产配置”

图中包含一个轴。标题为Optimal Asset Allocation的轴包含一个类型为bar的对象。

非ゼロの資産配分のすべてが半連続的な範囲 f n 0 0 0 1 f 一个 x 0 0 5 の間にあることが簡単に確認できます。

非ゼロの資産がいくあるでしょうか。制約は,非ゼロの資産の数が100 ~ 150です。

sum (xLinInt (vvars))
Ans = 100

この資産配分により期待される収益,そしてリスク調整された収益値はどれほどでしょうか。

流(“预期收益为%g,风险调整收益为%g。\n”...r * xLinInt (xvars)、-fval)
预期收益为0.000595107,风险调整收益为-0.0360382。

特に金融工具箱™でのポートフォリオ最適化用に設計された機能を使用すると,より詳細な分析が可能です。ポトフォリオクラスを使用して半連続および濃度の制約を直接処理する方法を示す例にいては,基于半连续和基数约束的投资组合优化(金融工具箱)を参照してください。

関連するトピック