这个例子展示了如何使用基于问题的方法来解决一个投资问题,在固定的年限内获得确定性的回报T
。问题是将您的资金分配到可用的投资上,以使您的最终财富最大化。有关基于解决方案的方法,请参阅使用线性规划实现长期投资最大化:基于解算器.
假设你有一笔初始金额的钱首都
在一段时间内投资T
年N
零息债券。每种债券都支付固定利率,每年对投资进行复利,并在到期时支付本金加复利。目标是最大限度地增加交易后的资金总额T
年。
您可以包含一个约束条件,即在进行投资时,单个投资不得超过总资本的某一部分。
本例首先展示了小案例的问题设置,然后阐述了一般案例。
您可以将其建模为线性规划问题。因此,要优化您的财富,请使用优化问题方法来制定问题。
从一个小例子开始:
投资的起始金额首都
是1000美元。
时间段T
是5年。
债券数量N
是4。
要对未投资资金进行建模,请每年提供一个到期日为1年、利率为0%的选项B0。
债券1由B1表示,可在第1年购买,期限为4年,利率为2%。
债券2由B2表示,可在第5年购买,到期日为1年,利率为4%。
债券3由B3表示,可在第2年购买,到期期限为4年,利率为6%。
债券4由B4表示,可在第2年购买,到期期限为3年,利率为6%。
通过将第一个选项B0拆分为5张到期期限为1年且利率为0%的债券,可以等效地将该问题建模为总共有9张可用债券,例如k=1..9
入口k
向量购买年份
表示该债券的年初k
可供购买。
入口k
向量成熟度
表示到期日
债券k
.
入口k
向量到期年
表示该债券的年末k
可供出售。
入口k
向量利率
表示百分比利率
债券k
.
通过表示每个债券的可用购买时间和持续时间的水平条来可视化此问题。
%时间段(年)T=5;%债券数量N=4;%初始金额资本0=1000;%购买机会总数nPtotal=N+T;%购买时间购买年份=[1;2;3;4;5;1;5;2;2];%债券期限到期日=[1;1;1;1;4;1;4;3];%债券出售时间到期年数=购买年数+到期日-1;%百分比利率利率=[0;0;0;0;0;2;4;6;6];%利息一年后返还rt=1+酯/100;plotInvestments(N、购买年限、到期日、利率)
用向量表示决策变量x
,在哪里x(k)
债券投资的美元金额是多少k
,为k=1,…,9
.到期时,支付给投资的款项x(k)
是
定义
定义
作为债券的总收益k
:
x=optimvar(“x”,nPtotal,“LowerBound”,0);%总回报r=到期日;
我们的目标是选择投资,以最大限度地提高年底的收入T
. 从图中可以看出,投资是在不同的中间年份收集并再投资的。年底T
,从投资5、7和8中获得的资金可以收回,并代表您的最终财富:
创建一个最大化的优化问题,并包含目标函数。
interestprob=优化问题(“客观感觉”,“最大化”); 兴趣调查目标=x(5)*r(5)+x(7)*r(7)+x(8)*r(8);
每年,你都有一定数量的钱可以用来购买债券。从第一年开始,您可以将初始资本投资于购买期权 和 ,因此:
然后,在接下来的几年中,你从到期债券中获得收益,并将其再投资于新的可用债券,以获得方程组:
投资控制=最优控制(T,1);投资控制(1)=x(1)+x(6)=资本;投资控制(2)=x(2)+x(8)+x(9)=r(1)*x(1);投资控制(3)=x(3)=r(2)*x(2);投资控制(4)=x(4)=r(3)*x(3);投资控制(5)=x(5)+x(7)=r(4)*x(4)+x(4)+6)+r(9)*投资控制;
因为每个投资额必须为正,所以解决方案向量中的每个条目 必须是积极的。通过在解向量上设置下限来包含此约束 . 解向量上没有明确的上界。
x、 LowerBound=0;
解决这个问题时,对你可以投资债券的金额没有任何限制。内点算法可以用来解决这类线性规划问题。
选项=最佳选项(“linprog”,“算法”,“内点”); [sol,fval,exitflag]=solve(interestprob,“选项”,选项)
使用linprog解决问题。预溶解期间发现的溶液。
溶胶=带字段的结构:x:[9x1双精度]
fval=1.2625e+03
exitflag=最优解
退出标志表示解算器找到了最佳解决方案。值未来值
,作为第二个输出参数返回,对应于最终财富。请查看最终投资总额以及随时间的投资分配。
fprintf('在%d年后,初始$%g的回报为$%g\n',...T、 资本(以公允价值计量),;
5年后,最初1000美元的回报是1262.48美元
plotInvestments(N、购买年限、到期日、利率、sol.x)
为了使投资多样化,你可以选择将投资于任何一种债券的金额限制在一定的百分比最大功率
占当年总资本的比例(包括当前处于到期期的债券的收益)。得到以下不等式组:
%投资任何债券的最大百分比Pmax=0.6;constrlimit=optimconstr(nPtotal,1);施工限额(1)=x(1)<=Pmax*Capital\u 0;收缩极限(2)=x(2)<=Pmax*(rt(1)*x(1)+rt(6)*x(6));构造极限(3)=x(3)<=Pmax*(rt(2)*x(2)+rt(6)^2*x(6)+rt(8)*x(8)+rt(9)*x(9));构造极限(4)=x(4)<=Pmax*(rt(3)*x(3)+rt(6)^3*x(6)+rt(8)^2*x(8)+rt(9)^2*x(9));构造极限(5)=x(5)<=Pmax*(rt(4)*x(4)+rt(6)^4*x(6)+rt(8)^3*x(8)+rt(9)^3*x(9));施工限额(6)=x(6)<=Pmax*Capital\u 0;构造极限(7)=x(7)<=Pmax*(rt(4)*x(4)+rt(6)^4*x(6)+rt(8)^3*x(8)+rt(9)^3*x(9));构造极限(8)=x(8)<=Pmax*(rt(1)*x(1)+rt(6)*x(6));构造极限(9)=x(9)<=Pmax*(rt(1)*x(1)+rt(6)*x(6));interestprob.Constraints.constrlimit=constrlimit;
通过在任何一项资产上投资不超过60%来解决问题。绘制购买结果。请注意,您的最终财富少于没有此限制的投资。
[sol,fval]=solve(interestprob,“选项”,选项);
使用linprog解决问题。找到满足约束条件的最小值。优化完成,因为目标函数在可行方向上不递减,在功能公差的选定值范围内,并且约束满足在约束公差的选定值范围内。
fprintf('在%d年后,初始$%g的回报为$%g\n',...T、 资本(以公允价值计量),;
5年后,最初1000美元的回报是1207.78美元
plotInvestments(N、购买年限、到期日、利率、sol.x)
为问题的一般版本创建一个模型。使用T
=30年期和400张随机生成的债券,利率为1%至6%。这种设置导致了一个包含430个决策变量的线性规划问题。
%为了再现性rng违约%初始金额资本0=1000;%时间段(年)T=30;%债券数量N=400;%购买机会总数nPtotal=N+T;%生成随机到期期限到期日=兰迪([1 T-1],nPtotal,1);%债券1的到期日为1年到期日(1:T)=1;%为每种债券生成随机年利率利率=兰迪(6,nPtotal,1);%债券1的利率为0(未投资)利率(1:T)=0;%利息一年后返还rt=1+酯/100;%计算每种债券到期时的回报率:r=到期日;%为每个选项生成随机购买年份购买年份=零(nPtotal,1);%债券1每年可供购买购买年限(1:T)=1:T;对于i=1:N%生成一个随机年份,以便债券在年底前到期%T年期购买年限(i+T)=兰迪([1 T-到期日(i+T)+1]);结束%计算每种债券在年底到期的年份到期年数=购买年数+到期日-1;
计算债券可以买卖的时间。这个买入指数
矩阵包含潜在的购买时间,以及卖出指数
矩阵保存每种债券的潜在销售时间。
buyindex=false(nPtotal,T);%按T矩阵分配NPT总量对于ii=1:T购买指数(:,ii)=购买年限==ii;结束sellindex=假(nPtotal,T);对于ii=1:T卖出指数(:,ii)=到期年数==ii;结束
设置与债券对应的优化变量。
x=optimvar(“x”,nPtotal,1,“LowerBound”,0);
创建优化问题和目标函数。
interestprob=优化问题(“客观感觉”,“最大化”);interestprob.Objective=sum(x(sellindex(:,T)).*r(sellindex(:,T));
为了方便起见,创建一个临时数组xBuy,其列表示我们在每个时间段可以购买的债券。
xBuy=repmat(x,1,T).*双倍(买入指数);
类似地,创建一个临时数组xSell,其列表示我们可以在每个时间段出售的债券。
xSell=repmat(x,1,T).*double(sellindex);
出售这些边界产生的回报是
xReturnFromSell=xSell.*repmat(r,1,T);
创建一个约束条件,即您在每个时间段内投资的金额是您在上一个时间段内售出的金额。
interestprob.Constraints.InitialInvest=sum(xBuy(:,1))==Capital\u 0;interestprob.Constraints.InvestConstraint=sum(xBuy(:,2:T),1)==sum(xReturnFromSell(:,1:T-1),1);
解决问题。
tic[sol,fval,exitflag]=solve(interestprob,“选项”,选项);
使用linprog解决问题。找到满足约束条件的最小值。优化完成,因为目标函数在可行方向上不递减,在功能公差的选定值范围内,并且约束满足在约束公差的选定值范围内。
toc
运行时间为0.256259秒。
这些投资做得怎么样?
fprintf('在%d年后,初始$%g的回报为$%g\n',...T、 资本(以公允价值计量),;
30年后,最初1000美元的回报是5167.58美元
要创建限制每项资产投资比例的约束条件,请设置一个矩阵,用于跟踪每次的活跃债券。要表示每项投资必须小于最大功率
乘以总价值,建立一个矩阵,跟踪每次投资的价值。对于这个更大的问题,将可保持的最大分数设置为0.4。
Pmax=0.4;
创建一个积极的
对应于可持有债券时间的矩阵,以及计算的
保存每个活跃债券的累计持续时间的矩阵。因此债券的价值j
当时t
是x(j)*(即时计算)
.
活跃=双指数(买入指数|卖出指数);对于ii=1:T有效(:,ii)=双((ii>=购买年)和(ii<=到期年);结束cactive=cumsum(活动,2);cactive=cactive.*活动;
创建矩阵,其条目(j,p)表示时间段p的债券j值:
bondValue=repmat(x,1,T)。*激活。*(rt.^(cactive));
在每个时间间隔确定投资的总价值,以便您可以对有限的持股施加约束。价值
是否在每个时间段结束时投资于所有债券的资金nPtotal
-借-T
matrix.moneyavailable是在时间段开始时投资的资金在债券上的总和,表示每次投资组合的价值。
constrlimit=optimconstr(nPtotal,T);施工限额(:,1)=xBuy(:,1)<=Pmax*Capital\u 0;constrlimit(:,2:T)=xBuy(:,2:T)<=repmat(Pmax*sum(bondValue(:,1:T-1),1),nPtotal,1).*double(buyindex(:,2:T));interestprob.Constraints.constrlimit=constrlimit;
用有限的持股来解决问题。
tic[sol,fval,exitflag]=solve(interestprob,“选项”,选项);
使用linprog解决问题。找到满足约束条件的最小值。优化完成,因为目标函数在可行方向上不递减,在功能公差的选定值范围内,并且约束满足在约束公差的选定值范围内。
toc
运行时间为1.197712秒。
fprintf('在%d年后,初始$%g的回报为$%g\n',...T、 资本(以公允价值计量),;
30年后,最初1000美元的回报是5095.26美元
要加快解算器的速度,请尝试双单纯形算法。
选项=最佳选项(“linprog”,“算法”,“对偶单纯形”);tic[sol,fval,exitflag]=solve(interestprob,“选项”,选项);
使用linprog解决问题。找到了最优解。
toc
运行时间为0.514705秒。
fprintf('在%d年后,初始$%g的回报为$%g\n',...T、 资本(以公允价值计量),;
30年后,最初1000美元的回报是5095.26美元
在这种情况下,对偶单纯形算法用更少的时间获得相同的解。
要了解解决方案,请将其与数量进行比较fmax
如果你能将你所有的起始资金以6%的利率(最高利率)在整个30年期间投资于一种债券,你会得到这个结果。你也可以计算与你最终财富相对应的等价利率。
%最高金额fmax=资本0*(1+6/100)^T;%比率(百分比)大鼠=fval/fmax*100;%等值利率(百分比)rsol=(fval/资本额0)^(1/T)-1)*100;fprintf(['收取的金额为最大金额$%g%%g'...'您将从投资一种债券中获得的信息。\n'...“您的最终财富对应于%d年的%g%%利率”...'期间。\n'],大鼠,fmax,rsol,T)
所收取的金额为您投资一种债券可获得的最高金额5743.49美元的88.7137%。您的最终财富相当于30年期间5.57771%的利率。
plotInvestments(N、购买年限、到期日、利率、sol.x、假)