このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,問題ベースのアプローチを使用して,固定の年数T.
にわたって确定的なリターンがある投资の问题を解く方法を说明します。この问题は利用可能な投资に资金を割り当てて最终资产额を最大化するものです。ソルバーベースのアプローチについては,線形計画法を使用した長期投資の運用最大化:ソルバーベースを参照してください。
N
個のゼロクーポン債にT.
年の期間にわたって投資するための初期資金Capital_0
があるとします。各債券の固定金利は年単位の複利で,満期時に元本と複利が支払われます。目的はT.
年後の総資産額を最大化することです。
投资をする时点で,単一の投资が総资本の特定の割合を超えないようにする制约を含めることができます。
この例では,まず小规模なケースで问题の设定を示し,次に一般的なケースに定式化します。
この问题は,线形计画问题としてモデル化できます。そこで,资产额を最适化するような,最适化问题アプローチを使用した问题を策定します。
まず,小规模な例から始めます。
初期投资额Capital_0
は$ 1000个です。
期間T.
は5年です。
债券数N
は4です。
未投資資金をモデル化するために,満期が1年,利率が0%で毎年利用可能な1つのオプションB0を設定します。
債券1はB1で表され,1年目に購入でき,満期は4年,利率は2%です。
債券2はB2で表され,5年目に購入でき,満期は1年,利率は4%です。
債券3はB3で表され,2年目に購入でき,満期は4年,利率は6%です。
債券4はB4で表され,2年目に購入でき,満期は3年,利率は6%です。
最初のオプションB0を満期が1年で利率が0%の5つの債券に分割することによって,利用可能な債券合計数が9であるとしてこの問題を等価的にモデル化できます。つまり,k = 1 . . 9
に対して,次のとおりとします。
ベクトルPurchaseYears
のエントリK.
は,債券K.
を购入可能な年の始まりを表します。
ベクトル到期
のエントリK.
は,債券K.
の満期
を表します。
ベクトルMaturityYears
のエントリK.
は,債券K.
を売却可能な年の终わりを表します。
ベクトルInterestRates
のエントリK.
は,債券K.
の利率
を表します。
各债券の购入可能回数と期间を水平のバーで表すことによって,この问题を视覚化します。
%的年时间段T = 5;债券数量%N = 4;%初始金额Capital_0 = 1000;购买oportunities%的总数nPtotal = N + T;%购买时间PurchaseYears =[1; 2; 3; 4、5、1;5;2;2);%债券期限成熟= [1;1;1;1;1;4;1;4,3];%债券发售时间到期日=购买年期+到期日- 1;利率,以%表示利率= (0,0,0,0,0;2,4,6,6];感兴趣一年后返回%RT = 1 + InterestRates / 100;plotInvestments(N,PurchaseYears,成熟度,InterestRates)
ベクトルX
によって決定変数を表します。ここで,x(k)
は,債券K.
(k = 1,…,9
)へのドル建て投资额です。満期时の投资x(k)
に対する支払いは次のようになります。
を定義し,
を债券K.
のトータルリターンとして定义します。
X = optimvar('X'nPtotal,下界的,0);%的总回报率R =室温^成熟度。
目标はT.
年目の終わりに回収される金額を最大化する投資を選択することです。プロットから,投資は中間のさまざまな年に回収され,再投資されることがわかります。T.
年目の終わりに投資5,7日および8からリターンを回収でき,最終資産額は次のように表されます。
最大化を目的とする最適化問題を作成し,目的関数を含めます。
interestprob = optimproblem (“ObjectiveSense”那“最大化”);interestprob。目标= x(5)*r(5) + x(7)*r(7) + x(8)*r(8);
毎年,一定金額を債券の購入に利用できます。まず1年目には,初期資本を購入オプション および に投资できるため,次のようになります。
その後の年では,満期になった債券からリターンを回収し,利用可能な新しい債券に再投資するため,次の方程式系が得られます。
investconstr = optimconstr(T,1);investconstr(1)= X(1)+ X(6)== Capital_0;investconstr(2)= X(2)+ X(8)+ X(9)== R(1)* X(1);investconstr(3)= X(3)== R(2)* X(2);investconstr(4)= X(4)== R(3)* X(3);investconstr(5)= X(5)+ X(7)== R(4)* X(4)+ R(6)* X(6)+ R(9)* x(9);interestprob.Constraints.investconstr = investconstr;
各投资金额が正の値でなければならないため,解ベクトル の各エントリは正の値でなければなりません。解ベクトル に下限を設定して,この制約を含めます。解ベクトルには明示的な上限はありません。
x.LowerBound = 0;
債券に投資できる金額に制約を付けずにこの問題を解きます。このような線形計画問題を解くには,内点法アルゴリズムを使用できます。
选择= optimoptions ('linprog'那“算法”那“内点”);[溶胶,fval exitflag] =解决(interestprob,“选项”选项)
使用linprog解决问题。在解决过程中找到的解决方案。
索尔=同场的结构:x (9 x1双):
fval = 1.2625 e + 03
exitflag = OptimalSolution
终了フラグは,ソルバーによって最适解が见つかったことを示しています0.2番目の出力引数として返される値FVAL
は,最终资产额に相当します。投资额の最终的な合计と时间の経过に合わせた投资配分を确认します。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
5年后,最初1000美元的回报率是1262.48美元
plotInvestments(N,PurchaseYears,成熟度,InterestRates,sol.x)
投资を分散するために,1つの债券に投资する金额を,その年の総资本(その时点で満期になっている债券のリターンを含む)の特定の割合Pmax
に制限するよう选択することもできます。次の连立不等式が得られます。
投资任何债券的最大百分比pmax = 0.6;constrlimit = OptimConstr(NPTotal,1);constrlimit(1)= x(1)<= pmax * capital_0;Translimit(2)= x(2)<= pmax *(Rt(1)* x(1)+ RT(6)* x(6));Translimit(3)= x(3)<= pmax *(Rt(2)* x(2)+ RT(6)^ 2 * x(6)+ RT(8)* x(8)+ RT(9)* x(9));Translimit(4)= x(4)<= pmax *(RT(3)* x(3)+ RT(6)^ 3 * x(6)+ RT(8)^ 2 * x(8)+ RT(9)^ 2 * x(9));CONSTRIMIT(5)= x(5)<= PMAX *(RT(4)* x(4)+ RT(6)^ 4 * x(6)+ RT(8)^ 3 * x(8)+ RT(9)^ 3 * x(9));Translimit(6)= x(6)<= pmax * capital_0;Translimit(7)= x(7)<= pmax *(RT(4)* x(4)+ RT(6)^ 4 * x(6)+ RT(8)^ 3 * x(8)+ RT(9)^ 3 * x(9));Translimit(8)= x(8)<= pmax *(RT(1)* x(1)+ RT(6)* x(6)); constrlimit(9) = x(9) <= Pmax*(rt(1)*x(1) + rt(6)*x(6)); interestprob.Constraints.constrlimit = constrlimit;
どの資産への投資も60%を超えないようにして問題を解きます。結果として得られる購入額をプロットします。この制約なしに投資する場合より最終資産額が少なくなることがわかります。
[溶胶,FVAL] =解决(interestprob,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
5年后,在最初的$ 1000的回报为$ 1207.78
plotInvestments(N,PurchaseYears,成熟度,InterestRates,sol.x)
一般的な问题のモデルを作成します。T.
= 30年,利率が1〜6%でランダムに生成された400个の债券を使用してこのモデルを说明します。この设定の场合,决定変数が430个ある线形计画问题になります。
%的再现性RNG.默认的%初始金额Capital_0 = 1000;%的年时间段T = 30;债券数量%N = 400;购买oportunities%的总数nPtotal = N + T;%随机生成成熟的持续时间成熟度= randi([1 T-1],nPtotal,1);%债券1具有1年,成熟期到期日(1:T)= 1;%生成每个随机债券,年利率InterestRates =兰迪(6,nPtotal,1);%的键1具有0的利率(未投入)InterestRates(1:T)= 0;感兴趣一年后返回%RT = 1 + InterestRates / 100;%计算返回在成熟期对每个键的末端:R =室温^成熟度。%为每个选项生成随机购买年份PurchaseYears =零(nPtotal,1);每年都可以购买% Bond 1PurchaseYears (1: T) = 1: T;为了我= 1:n%生成随机一年的债券在2002年底之前到期% T年期间购买年份(i+T) = randi([1 T- maturity (i+T)+1]);结尾%计算年,在那里每个债券在今年年底达到成熟到期日=购买年期+到期日- 1;
債券を購入または売却できる時点を計算します。行列BuyIndex.
には购物可以な时钟が保持され,行程sellindex
には各债券の売却可能な时点が保持されます。
buyindex = false (nPtotal T);%分配nPtotal-by-T矩阵为了ii = 1:T buyindex(:,ii) = PurchaseYears == ii;结尾sellindex =假(nPtotal,T);为了ii = 1:T sellindex(:,ii) =到期日;结尾
债券に対応する最适化変数を设定します。
X = optimvar('X'nPtotal 1下界的,0);
最适化问题と目的关数を作成します。
interestprob = optimproblem (“ObjectiveSense”那“最大化”);interestprob。目标=总和(x (sellindex (:, T))。* r (sellindex (:, T)));
便宜上,一时配列xBuyを作成します。この配列の列は,各期间で购入可能な债券を表しています。
xBuy = repmat (x 1 T)。*双(buyindex);
同様に,一时配列xSellを作成します。この配列の列は,各期间で売却可能な债券を表しています。
xSell = repmat(X,1,T)*双(sellindex)。
これらの債券の売却によって生じる収益は次のとおりです。
。xReturnFromSell = xSell * repmat(R,1,T);
各期間の投資額を直前の期間に売却した金額とする制約を作成します。
interestpro . constraints . initialinvest = sum(xBuy(:,1)) == Capital_0;interestpro . constraints . investconstraint = sum(xBuy(:,2:T),1) = sum(xReturnFromSell(:,1:T-1),1);
问题を解きます。
抽动[溶胶,FVAL,exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
经过时间是0.232785秒。
投资の成果はどうでしょうか。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
30年后,在最初的$ 1000的回报为$ 5167.58
各資産への投資の割合を制限する制約を作成するには,各時点でアクティブな債券を追跡する行列を設定します。各投資額が合計値のPmax
倍未満でなければならないという制約を表すには,各時点でのそれぞれの投資の値を追跡する行列を設定します。このより大きな問題では,保持できる最大の割合を0.4に設定します。
PMAX = 0.4;
債券を保持できる時点に対応する行列积极的
およびアクティブな債券ごとの累積期間を保持する行列了CActive
を作成します。时间T.
での债券j
の値はx (j) * (rt ^ cactive)
になります。
Active = double(buyindex | sellindex);为了II = 1:T活性(:,II)=双((二> = PurchaseYears)(ⅱ<= MaturityYears));结尾cactive = cumsum(活跃,2);cactive = cactive。*活跃;
エントリ(J,P)が期间pの债券Ĵの値を表す行列を作成します。
bondValue = repmat(X,1,T)*活性*(RT ^(CActive类))。。
无限があるあるにに制约を课すことができるに各间间のののの値を求め求め求めをを求め求めmvalue
は各期間の終わりにおいてすべての債券に投資されている金額で,nPtotal
当T.
列の行列です.moneyavailableは,その期间の始まりにおいて投资されている金额の债券全体に対する合计,つまり,各时点のポートフォリオの価値です。
constrlimit = OptimConstr(NPTotal,T);constrlimit(:,1)= xbuy(:,1)<= pmax * capital_0;Translimit(:,2:t)= xbuy(:,2:t)<= repmat(pmax * sum(powdvalue(:,1:t-1),nptotal,1)。* double(buyindex(:,2:t));leatsprob.constraints.constrlimit = constrlimit;
保有债券に制限がある问题を解きます。
抽动[溶胶,FVAL,exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
运行时间为1.460226秒。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
30年后,最初1000美元的回报率是5095.26美元
ソルバーのスピードを向上させるために,双対シンプレックス法アルゴリズムを使用してみます。
选择= optimoptions ('linprog'那“算法”那对偶单纯形的);抽动[溶胶,FVAL,exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。找到最优解。
TOC.
运行时间为0.687545秒。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
30年后,最初1000美元的回报率是5095.26美元
このケースでは,双対シンプレックス法アルゴリズムは同じ解を得るまでの时间を短缩しました。
解の特价を确认するため,この解を,初率资金の全额利率6%(最大利率)の1つの债券に30年间にわたって投资したたたににられる得得得得得られるられる得金额fmax
と比较します。最终资产额に対応する同等の利率を计算することもできます。
%最大量fmax = Capital_0 * (1 + 6/100) ^ T;百分比(以百分比表示)老鼠= fval / fmax * 100;%相当于利率(百分比)RSOL =((FVAL / Capital_0)^(1 / T)-1)* 100;fprintf(['收集的金额是最大金额$%g的%g% '...你可以从投资一种债券中获得的收益...“你的最终财富相当于一个%G %%利率在%d年”...'时段。\ N',鼠,fmax, rsol, T)
收集的量,你会从一个债券投资获得的最大金额$ 5743.49的88.7137%。您最终的财富相当于5.57771%的利率超过30年的时间。
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x,假)