主要内容

利用线性规划最大化长期投资:基于问题的

这个例子展示了如何使用基于问题的方法来解决一个在固定年限内具有确定性回报的投资问题T.问题是要把你的钱分配到可用的投资上,以最大化你的最终财富。关于基于求解器的方法,请参见使用线性编程最大化长期投资:基于求解器

问题公式化

假设您有初始金额Capital_0.在一段时间内投资T多年来N零息债券。每个债券支付固定利率,每年对投资进行复利,在到期时支付本金和复利。目标是最大化之后的总金额T年。

您可以包含一个约束条件,即在进行投资时,单个投资不能超过总资本的某个部分。

这个例子首先给出了小情况下的问题设置,然后给出了一般情况。

你可以将其建模为线性规划问题。因此,为了优化你的财富,用优化问题的方法来制定问题。

介绍性示例

从一个小例子开始:

  • 投资的起始金额Capital_0.是1000美元。

  • 的时间段T是5年。

  • 化学键的数量N是4。

  • 为了模拟未投资的资金,每年有一个选项B0,它的到期日为1年,利率为0%。

  • 由B1表示的债券1可以在1年级购买,其成熟期为4年,利率为2%。

  • 债券2,用B2表示,可以在第5年购买,期限为1年,利率为4%。

  • 债券3,用B3表示,可以在第二年购买,期限为4年,利率为6%。

  • 债券4,用B4表示,可以在第二年购买,期限为3年,利率为6%。

通过将第一个选项B0分成5个债券,成熟期为1年和0%的利率,这个问题可以等效地建模为共有9个可用债券,这样k = 1 . . 9

  • 条目k的向量PurchaseYears代表着年初的那份债券k可供购买。

  • 条目k的向量成熟表示成熟期 k 的债券k

  • 条目k的向量MaturityYears代表债券的年底k可供出售。

  • 条目k的向量银行利率表示利率百分比 ρ k 的债券k

通过表示每个债券的可用购买时间和期限的水平条来形象化这个问题。

%以年为单位的时间段T = 5;%债券数量N = 4;%初始金额Capital_0 = 1000;购买Oportunities的%总数nPtotal = N + T;%购买时间购买= [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 + + y + / 100;PlotInforcements(n,购买日期,成熟,下午)

决策变量

代表矢量的决策变量x,在那里x(k)投资债券的金额是多少k,因为k = 1,......,9.到期时,投资所得x(k)

x k 1 + ρ k / 1 0 0 k

定义 β k 1 + ρ k / 1 0 0 并定义 r k 作为债券的总回报k

r k 1 + ρ k / 1 0 0 k β k k

x = optimvar (“x”nPtotal,下界的,0);%总回报率r = rt。^成熟;

目标职能

目标是选择投资,以最大限度地提高年底收集的金额T.从情节来看,您可以看到在各种中间年份收集投资并再投资。年底T,从投资5、7和8中收回的钱可以收集起来,代表你的最终财富:

最大限度 x x 5 r 5 + x 7 r 7 + x 8 r 8

创建一个最大化的优化问题,并包含目标函数。

interestprob = optimproblem ('Objectivesense'“最大化”);interestprob。目标= x(5)*r(5) + x(7)*r(7) + x(8)*r(8);

线性约束:投资不超过你的

每年,你都有一定数量的钱来购买债券。从第一年开始,你可以把初始资金投资在购买期权上 x 1 x 6 ,所以:

x 1 + x 6 C 一个 p t 一个 l 0

然后在接下来的几年里,你从到期债券中收集收益,并将它们再投资于新的可用债券,从而得到方程组:

x 2 + x 8 + x 9 r 1 x 1 x 3. r 2 x 2 x 4 r 3. x 3. x 5 + x 7 r 4 x 4 + r 6 x 6 + r 9 x 9

investconstr = optimconstr (T, 1);investconstr(1) = x(1) + x(6) == Capital_0;investconstr (2) = x (2) + (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) = (5) + x (7) = = r (4) * x (4) + r (6) * x (6) + r (9) * x (9);interestprob.Constraints.investconstr = investconstr;

约束约束:无借款

因为投资的每种金额必须是正的,所以解决方案载体中的每个条目 x 必须是积极的。通过在解决方案向量上设置下限来包括此约束 x .解决方案矢量没有明确的上限。

x.lowerbound = 0;

解决这个问题

解决这个问题,不要限制你可以投资债券的金额。内点算法可用于求解这类线性规划问题。

选择= optimoptions (“linprog”“算法”“内点”);[Sol,Fval,ExitFlag] =解决(兴趣重量,“选项”,选项)
使用linprog解决问题。在预定期间发现的解决方案。
索尔=结构与字段:X:[9x1双]
fval = 1.2625 e + 03
exitflag = OptimalSolution

可视化解决方案

退出标志表明求解器找到了最优解。的值fval,作为第二个输出参数返回,对应于最终的财富。看看最终的投资总额,以及随着时间推移的投资分配情况。

流(' %d年后,最初$%g的收益为$%g \n'......T Capital_0 fval);
5年后,初期1000美元的回报是1262.48美元
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x)

有限控股的最优投资

为了使您的投资多样化,您可以选择将任何一个债券投资的金额限制为一定比例Pmax(包括当前到期债券的回报)。你得到下面的不等式系统:

x 1 ≤. P 一个 x × C 一个 p t 一个 l 0 x 2 ≤. P 一个 x × β 1 x 1 + β 6 x 6 x 3. ≤. P 一个 x × β 2 x 2 + β 6 2 x 6 + β 8 x 8 + β 9 x 9 x 4 ≤. P 一个 x × β 3. x 3. + β 6 3. x 6 + β 8 2 x 8 + β 9 2 x 9 x 5 ≤. P 一个 x × β 4 x 4 + β 6 4 x 4 + β 8 3. x 8 + β 9 3. x 9 x 6 ≤. P 一个 x × C 一个 p t 一个 l 0 x 7 ≤. P 一个 x × β 4 x 4 + β 6 4 x 4 + β 8 3. x 8 + β 9 3. x 9 x 8 ≤. P 一个 x × β 1 x 1 + β 6 x 6 x 9 ≤. P 一个 x × β 1 x 1 + β 6 x 6

投资任何债券的最大百分比pmax = 0.6;constrlimit = OptimConstr(NPTotal,1);constrlimit(1)= x(1)<= pmax * liginal_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));Translimit(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] =解决(兴趣重量,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
流(' %d年后,最初$%g的收益为$%g \n'......T Capital_0 fval);
5年后,最初1000美元的回报率是1207.78美元
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x)

任意尺寸模型

为常规版本创建模型。使用。说明它T= 30年期和400张随机生成的债券,利率从1到6%不等。这个设置导致了一个有430个决策变量的线性规划问题。

%的再现性rng.默认%初始金额Capital_0 = 1000;%以年为单位的时间段t = 30;%债券数量N = 400;购买Oportunities的%总数nPtotal = N + T;%产生随机成熟度持续时间成熟度= randi([1 T-1],nPtotal,1);%债券1的到期期为1年成熟(1:T)= 1;%为每个债券产生随机的年利率利率=兰迪(6 nPtotal 1);%债券1的利率为0(未投资)利率(1:T) = 0;一年后的%回报RT = 1 + + y + / 100;%计算每个债券的到期时间结束时的返回:r = rt。^成熟;%为每个选项生成随机购买年PurchaseYears = 0 (nPtotal, 1);%BOND 1每年都可以购买PurchaseYears (1: T) = 1: T;i = 1: N%在结束前生成键的随机年份% T年期间购买年份(i+T) = randi([1 T- maturity (i+T)+1]);结束计算每只债券在年底到期的年份到期日=购买年期+到期日- 1;

计算或销售债券时计算时间。这buyindex矩阵包含了潜在的购买时间,以及sellindex矩阵包含每个债券的潜在销售时间。

BuyIndex = False(NPTotal,T);%分配NPTotal-y矩阵ii = 1:T buyindex(:,ii) = PurchaseYears == ii;结束sellindex = false (nPtotal T);II = 1:T SELLINDEX(:,II)=成熟years == II;结束

设置与键相对应的优化变量。

x = optimvar (“x”nPtotal 1下界的,0);

建立优化问题和目标函数。

interestprob = optimproblem ('Objectivesense'“最大化”);leatsprob.objective = sum(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] = solve(兴趣问题,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
经过时间为0.402834秒。

投资有多好?

流(' %d年后,最初$%g的收益为$%g \n'......T Capital_0 fval);
30年后,最初1000美元的回报率是5167.58美元

有限公司解决方案

要创建限制每个资产中投资分数的约束,请设置每次跟踪活动绑定的矩阵。表达每个投资必须低于的约束Pmax总价值的时间,设置矩阵,以跟踪每次每次投资的值。对于这个较大的问题,将最大分数设置为0.4。

pmax = 0.4;

创建一个活跃的矩阵对应于可以保持键的时间,以及一个cactive持有每一活跃债券的累积期限的矩阵。债券的价值j当时tx (j) * (rt ^ cactive)

Active = Double(BuyIndex | SellIndex);II = 1:T Active(:,ii)= double((ii> =购买日期)&(ii <=成熟年份));结束cactive = cumsum(活跃,2);cactive = cactive。*活跃;

创建矩阵,其条目(j,p)表示债券j在时间段p的值:

bondValue = repmat (x 1 T)。*活跃。* (rt ^ (cactive));

确定每个时间间隔的投资总额,这样您就可以对有限的持股施加约束。mvalue.在每个时间段结束时,钱是否投资于所有债券nPtotal——- - - - - -T矩阵。米oneyavailable is the sum over the bonds of the money invested at the beginning of the time period, meaning the value of the portfolio at each time.

constrlimit = OptimConstr(NPTotal,T);constrlimit(:,1)= xbuy(:,1)<= pmax * capital_0;Translimit(:,2:t)= xbuy(:,2:t)<= repmat(pmax * sum(poldvalue(:,1:t-1),nptotal,1)。* Double(BuyIndex(:,2:t));leatsprob.constraints.constrlimit = constrlimit;

用有限的持股解决问题。

Tic [sol,fval,exitflag] = solve(兴趣问题,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到函数公差的选择值内,约束条件满足到约束公差的选择值内。
TOC.
运行时间为1.141118秒。
流(' %d年后,最初$%g的收益为$%g \n'......T Capital_0 fval);
30年后,最初1000美元的回报率是5095.26美元

要加快求解器,请尝试双单简单算法。

选择= optimoptions (“linprog”“算法”对偶单纯形的);Tic [sol,fval,exitflag] = solve(兴趣问题,“选项”、选择);
使用linprog解决问题。找到最优解。
TOC.
经过时间为0.800074秒。
流(' %d年后,最初$%g的收益为$%g \n'......T Capital_0 fval);
30年后,最初1000美元的回报率是5095.26美元

在这种情况下,双单纯形算法得到相同的解花费的时间更少。

定性结果分析

要获得解决方案,将其与金额进行比较fmax如果您可以在整个30年期间以6%的利率(最高利率)投资一份债券中的所有起始资金。您还可以计算与您的最终财富对应的等效利率。

%最大数量fmax = Capital_0 * (1 + 6/100) ^ T;百分比(以百分比表示)鼠= fval / fmax * 100;%等值利率(以百分比为单位)rsol = ((fval / Capital_0) ^ (1 / T) 1) * 100;流(['收集的金额是最大金额$%g的%g% '......你可以从投资一种债券中获得的收益......“您的最终财富对应于%D年的%%%利率”......“。\ n”,鼠,fmax, rsol, T)
已收回的金额是你投资于一个债券可获得的最高金额5743.49美元的88.7137%。你的最终财富相当于30年期间5.57771%的利率。
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x,假)

相关话题