このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,問題ベースのアプローチを使用して,固定の年数T.
にわたって确定的なリターンがある投资の问题を解く方法を说明します。この问题は利用可能な投资に资金を割り当てて最终资产额を最大化するものです。ソルバーベースのアプローチについては,線形計画法を使用した長期投資の運用最大化:ソルバーベースを参照してください。
N
個のゼロクーポン債にT.
年の期間にわたって投資するための初期資金Capital_0
があるとします。各債券の固定金利は年単位の複利で,満期時に元本と複利が支払われます。目的はT.
年後の総資産額を最大化することです。
00
このこの例で,まず小规模なケースでのを示し,次に一般的なケースにににしにししし。
こので,输出额をモデルよう,最最适策定ますな,最适问题し。
まず,小规模な例から始めます。
初投资额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.
の満期
ををます。
ベクトル成熟years.
のエントリK.
は,債券K.
を売却可なな年の终わりを表します。
ベクトル有余处
のエントリ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 + + yemyRates / 100;PlotInforcementments(n,购买日期,成熟,有趣的)
ベクトルX
によって決定変数を表します。ここで,x (k)
は,債券K.
(k = 1,…,9
)へのドル建て投资额です。満期时の投资x (k)
に対する支払いは次のようになります。
を定義し,
を债券K.
のトータルリターンとして定义ますます。
x = Optimvar('X'nPtotal,下界的,0);%总回报率r = rt。^成熟;
目标は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);leatsprob.constraints.investconstr = InvestConstr;
各投资金额が正の値でなければならない,解ベクトル の各エントリは正の値でなければなりません。解ベクトル に下限を設定して,この制約を含めます。解ベクトルには明示的な上限はありません。
x.lowerbound = 0;
債券に投資できる金額に制約を付けずにこの問題を解きます。このような線形計画問題を解くには,内点法アルゴリズムを使用できます。
选择= optimoptions ('linprog'那“算法”那“内点”);[溶胶,fval exitflag] =解决(interestprob,“选项”选项)
使用linprog解决问题。在解决过程中找到的解决方案。
索尔=结构与字段:x (9 x1双):
fval = 1.2625 e + 03
exitflag = OptimalSolution
终了フラグは,ソルバーによって最适解が见つかっことことを示しています返されるれるれるれるれるfval.
は,最终最终资额しします。投资额の最终的な合计とのに合并た投资投资しししししししし确认确认し
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
5年后,最初1000美元的回报率是1262.48美元
PlotInforcements(n,购买日期,成熟,有趣,sol.x)
投资を分类するために,1つの债券に投资する金额,その年のの资本(その时钟ででににてて债券のリターンを含むている债券のを含む含むのいるPmax
にの连立不锈钢できよう得得られられられられられられられられられられられられ制制制
投资任何债券的最大百分比Pmax = 0.6;constrlimit = optimconstr (nPtotal, 1);constrlimit(1) = x(1) <= Pmax*Capital_0;constrlimit (2) = x (2) < = Pmax * (rt (1) * x (1) + rt (6) * x (6));constrlimit (3) = x (3) < = Pmax * (rt (2) * x (2) + rt (6) ^ 2 * x (6) + rt (8) * * (8) + rt (9) * x (9));constrlimit (4) = x (4) < = Pmax * (rt (3) * x (3) + rt (6) ^ 3 * x (6) + rt (8) ^ 2 * x (8) + rt (9) ^ 2 * x (9));constrlimit (5) = x (5) < = Pmax * (rt (4) * x (4) + rt (6) ^ 4 * x (6) + rt (8) ^ 3 * x (8) + rt (9) ^ 3 * x (9));constrlimit(6) = x(6) <= Pmax*Capital_0;constrlimit (7) = x (7) < = Pmax * (rt (4) * x (4) + rt (6) ^ 4 * x (6) + rt (8) ^ 3 * x (8) + rt (9) ^ 3 * x (9));constrlimit (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] =解决(兴趣分子,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
5年后,最初的1000美元的回报是1207.78美元
PlotInforcements(n,购买日期,成熟,有趣,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;%为每个债券产生随机的年利率有趣的= randi(6,Nptotal,1);%债券1的利率为0(未投资)有趣(1:T)= 0;一年后的%回报RT = 1 + + yemyRates / 100;%计算每个债券的到期时间结束时的返回:r = rt。^成熟;%为每个选项生成随机购买年份购买=零(Nptotal,1);每年都可以购买% Bond 1PurchaseYears (1: T) = 1: T;为了我= 1:n%在结束之前生成键的随机年份% 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 = false(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)。* Double(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);
問題を解きます。
Tic [Sol,FVAL,EXITFLAG] =解决(兴趣分子,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
经过时间为0.232785秒。
投资の成果はどうでしょか。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
30年后,最初的1000美元的回报是5167.58美元
各資産への投資の割合を制限する制約を作成するには,各時点でアクティブな債券を追跡する行列を設定します。各投資額が合計値のPmax
倍未満でなければならないという制約を表すには,各時点でのそれぞれの投資の値を追跡する行列を設定します。このより大きな問題では,保持できる最大の割合を0.4に設定します。
pmax = 0.4;
債券を保持できる時点に対応する行列积极的
およびアクティブな債券ごとの累積期間を保持する行列cactivent.
当时T.
での债券j
の値はx (j) * (rt ^ cactive)
ににます。
Active = double(buyindex | sellindex);为了II = 1:T Active(:,II)=双((ii> =购买日期)&(II <=成熟年));结尾cactive = cumsum(活跃,2);cactive = cactive。*活跃;
エントリ(j,p)がのjの値を行作作作作者用)
债券value = repmat(x,1,t)。*有效。*(rt. ^(cactivent));
制限がある保有債券に制約を課すことができるように各期間の投資の合計値を求めます。mvalue.
は各期間の終わりにおいてすべての債券に投資されている金額で,诺特拉特
当T.
列の行为です.moneyavailableは,その晚期のにおいて投资さている金属の债券に対する合金,つまり,各时代のフォリオフォリオ価値です。
constrlimit = optimconstr (nPtotal T);constrlimit(:,1) = xBuy(:,1) <= Pmax*Capital_0;constrlimit (:, 2: T) = xBuy (:, 2: T) < = repmat (Pmax *总和(bondValue (:, 1: T - 1), 1), nPtotal, 1)。*双(buyindex (:, 2: T));interestprob.Constraints.constrlimit = constrlimit;
无所谓を解きます。
Tic [Sol,FVAL,EXITFLAG] =解决(兴趣分子,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
运行时间为1.460226秒。
fprintf(' %d年后,最初$%g的收益为$%g \n'那...T Capital_0 fval);
30年后,最初1000美元的回报率是5095.26美元
ソルバーソルバーのスピードをををためためにににためためにみてみみみててみみててみみみためためみ
选择= optimoptions ('linprog'那“算法”那对偶单纯形的);Tic [Sol,FVAL,EXITFLAG] =解决(兴趣分子,“选项”、选择);
使用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% '...你可以从投资一种债券中获得的收益...“您的最终财富对应于%D年度的%%利率%...'时期。\ n',鼠,fmax, rsol, T)
收集的金额是最高金额为5743.49美元,您将从投资中获得一个债券。您的最终财富对应于30年的利率5.5771%。
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x,假)