混合整数二次計画法ポートフォリオ最適化問題: 問題ベース
この例では、問題ベース アプローチを使用して、混合整数二次計画法 (MIQP) のポートフォリオ最適化問題の解法を示します。考え方としては、MIQP 問題を局所的に近似する一連の混合整数線形計画法 (MILP) の解を反復的に求めるというものです。ソルバーベースのアプローチについては、混合整数二次計画法ポートフォリオ最適化問題: ソルバーベースを参照してください。
問題の概要
Markowitzがたよう,多くののポートフォリオ问题问题は二次计画计画问题として表さ表されれ(“ Portfolio Selection”,J。Finance第7卷,第7期,第1期,第77-91页,1952年3月,第77-91页)。n
件の項目から成る一連の資産があり、ポートフォリオを選ぶとします。ここで
は资产
における投资です各资产平均收益のベクトル
および收益共分散分散
がわかっいる,与えた危険回避のレベル
に対し、リスク調整後の期待収益を最大化します。
quadprog
ソルバーを使用してこの二次計画問題を解きます。しかし、そのままの二次計画問題に加えて、ポートフォリオに次のようなさまざまな制限をかけることが必要な場合があります。
ポートフォリオ含まれる资产が
m
个をないものする。ここでm <= n
。ポートフォリオが少なくとも
m
个のを含むする。ここで0
。 “半连続”制约制约ものとするこれ,, であるか, および のいくつの固定割合について であることを意味します。
quadprog
これらの含めるはできません。难しいのはのの离散离散的的ななな性质性质ですさらにさらに,,混合混合整整数线形线形计画法法ソルバーソルバーソルバーソルバー离散的的的的制约制约制约ははははは
例でをととにににしだいに二次の关数关数ををを近似近似近似するするするするようようなるなる一连一连一连一连のののののののの问题问题问题问题问题问题を作成ししますますますます。。にははまらないがあります。
まず制约モデル化し。。
离散的制约のモデル化
は资产のを表すベクトルであり各各 について です。フォリオれる资产の个数モデル化するため, の场合は , の场合は になるように指標変数 を设定ますこのを満たす変数得るため,ベクトル をバイナリにし,制约を课します。
これらの不等によって, と はまったく同時にゼロになります。また、 の场合は, になります。
またポート内资产数の制约実现さため,线形制约ををます。。。
目的关数连続的线形似似
最初に定式化したように、目的関数を最大化しようと試みます。ところが、Optimization Toolbox™ のソルバーではすべて最小化されます。そこで、目的関数の負の値を最小化するように問題を定式化します。
。关数ですですですですソルバーソルバーは目的关数必要ですです。。このこの问题问题を线形目的关数关数と非线形非线形な制约制约ををもつ问题问题问题にににする化化する标准标准标准标准スラック変数 を導入します。
milp近似をに解く,新规线形制约组み込み,によってによって,现在现在现在のの点の近くににある非线形な制约をを局所局所的 が定数ベクトル、 が変数ベクトルである について,のの次テイラーは次ようになり。。
を で置き換えると、次のようになります。
各中间解 について,の线形部分てて と に新しい制约を导入。。
これは という形式なります。,, , 項の乗数は , です。
問題に新規の線形制約を追加するこの方法は、切除平面法と呼ばれます。詳細については、J. E. Kelley, Jr. "The Cutting-Plane Method for Solving Convex Programs." J. Soc.Indust.Appl.Math.Vol. 8, No. 4, pp. 703-712, December, 1960 を参照してください。
matlab®でのの化化化
最適化問題を表すには、次を行います。
変数が表す内容の決定
これらのの下限と明示明示
线形のおよび不等式指定指定
问题のをます。データには,ベクトルr
225个の期待さされる收益收益225行225列列行列行列行列问
に含まのの分散分散あります,「ポートフォリオ最适化问题に対するに対する二次计画法法の使用」」ののの
加载端口5r = mean_return;q =相关。 *(stddev_return * stddev_return');
資産の数をn
に設定します。
n=length(r);
問題の変数、制約および目的の作成
資産配分の割合を表す連続変数xvars
,関連付けられたxvars
がゼロに正どちらであるか示す変数変数変数VVARS
,およびのスカラーである変数
を表すZVAR
を作成し。
xvars=optimvar(“xvars”,n,1,'LowerBound',,,,0,,,,“上行”,1);vvars = optimvar('vvars',n,1,'Type',,,,'integer',,,,'LowerBound',,,,0,,,,“上行”,1);zvar = optimvar('zvar',,,,1,,,,'LowerBound',0);
問題において2n+1
個のすべての変数の下限はゼロです。変数xvars
およびYvars
の上限ははででZVAR
には上限はありません。
100〜ををのの数をにし。制约を次の形式形式で问题にます。。
2つの制约记述するなりなり。
m=150; m = 100; qpprob = optimproblem(“目标义”,,,,'maximize');qpprob.constraints.mconstr = sum(vvars)<= m;qpprob.constraints.mconstr2 = sum(vvars)> = m;
半连続なをます。の资产について,ゼロの最小の资产资产割合ををを0.001
に、また、最大の割合を0.05
にします。
fmin = 0.001;fmax = 0.05;
不等式 および を含めます。
qpprob.Constraints.fmaxconstr = xvars <= fmax*vvars; qpprob.Constraints.fminconstr = fmin*vvars <= xvars;
ポートフォリオは 100% 運用であるという制約を含めます。これは、 を意味し。
qpprob.Constraints.allin = sum(xvars) == 1;
危険回避係数
を100
に設定します。
lambda = 100;
目的关数 を定义,问题に。。
qpprob.Objective = r'*xvars -lambda*zvar;
问题を解く
問題を反復的に解くために,現在の制約をもつ問題を解くことから始めます。現在の制約については、いかなる線形化も実施していません。
options = optimoptions(@intlinprog,'Display',,,,'off');% Suppress iterative display[xlinint,fval,exitflagint,输出] = solve(qpprob,'options',选项);
反復の停止条件を決めます。スラック変数 が真二ののののののの以内なっときとき反复を止めますます
thediff = 1e-4;iter = 1;%迭代计数器资产= xlinint.xvars;truequadratic =资产'*q*资产;zslack = xlinint.zvar;
プロットする二の真値とスラック计算履歴保存しします。。反复反复がが正しい正しいににするするするようようようににに
历史= [truequadratic,zslack];选项= optimoptions(选项,“ lpoptimalityTolerance',,,,1e-10,“相对观念”,1E-8,...“约束耐受”,1E-9,“ integertolerance',1E-6);
二次および変数の値を。それらが异なる场合は,,别の线形线形制约を追加追加ししして
新しい各线形制约 は次の線形近似から得られます。
新规解求まっ,元解と新规解の中间线形线形制约制约をを使用使用使用しします。线形线形制约制约をを含ん含んででいるいるこのこのヒューリスティックヒューリスティックなななな方法のが,,,,あります中间のヒューリスティックな方法の代わり解をを场合场合,下记下记下记下记のののののののののののののののののののののののののののののののの
尽管ABS((Zslack- truequadratic)/true Quadratic)> Thediff% relative errorconder = 2*资产'*q*xvars -zvar <=资产'*q*资产;newname = ['迭代',num2str(iter)];qpprob.constraints。(newName)= constr;% Solve the problem with the new constraints[xlinint,fval,exitflagint,输出] = solve(qpprob,'options',选项);资产=(资产+xlinint.xvars)/2;% Midway from the previous to the current%资产= xlinint(xvars);%使用上一行或该行truequadratic = xLinInt.xvars'*Q*xLinInt.xvars; zslack = xLinInt.zvar; history = [history;truequadratic,zslack]; iter = iter + 1;结尾
解と収束率の検証
スラック変数关数二次部分计算履歴プロットしてどのように收束收束するかかししし
情节(历史)传奇(历史)(“二次”,,,,'Slack')xlabel('Iteration number')title(“二次和线性近似(松弛)”)
milpの解どのなでしょう。。输出
构造体そのが含まれますにおけるで计算计算れれた目的目的关数の限界値値间のののギャップギャップ
disp(output.absolutegap)
0
ギャップのはゼロでありでありでありのの正确であるを示してい。
最适配分をします。位置の更新を使用すると,一个ssets
は制約を満たさない可能性があるため、一个ssets
ではなく,XLinInt.xvars
を使用します。
bar(xlinint.xvars)网格上Xlabel('Asset index')ylabel(“投资比例”)title(“最佳资产分配”)
非ゼロの資産配分のすべてが半連続的な範囲 と の间あるが简単确认できます。
非ゼロがいくつあるうか。制约,,ゼロゼロのの资产资产ののののの数数数数数数数数
sum(xlinint.vvars)
一个ns = 100
この资产期待さ收益そしてリスクされ收益値はどれどれほどでしょでしょ。。。
fprintf('预期收益是%g,风险调整后的收益为%g。\ n',,,,...r'*xLinInt.xvars,fval)
the expected return is 0.000595107, and the risk-adjusted return is -0.0360382.
特にポートフォリオ用に设计さをををををを机能机能机能たたででででででと,,よりよりより详细详细分析分析が可能可能ですです。。ポートフォリオフォリオクラスををを使用使用使用使用て半连続半连続および浓度浓度浓度浓度浓度浓度浓度浓度浓度浓度投资组合优化具有半连续和基数约束((Financial Toolbox)を参照してください。