长期投资最大化使用线性规划:Solver-Based
这个例子展示了如何使用linprog
解算器的优化工具箱®来解决投资问题与确定性收益固定数量的年T
。问题是分配你的钱可以投资期末财富最大化。下面的例子使用了solver-based方法。
问题公式化
假设您有一个初始数量的钱Capital_0
投资的时间T
年N
零息债券。每个债券支付的利率每年化合物,并支付本金+复合利息的成熟时期。目标是最大化后资金的总额T
年。
可以包括一个约束,没有单一的投资超过一定比例的资本总额。
这个例子展示了问题设置一个小案例首先,然后制定一般情况下。
你可以把这作为一个线性规划问题模型。因此,为了优化你的财富,制定问题的解决方案linprog
解算器。
介绍性的例子
从一个小例子:
开始投资
Capital_0
是1000美元。的时间段
T
是5年。债券的数量
N
是4。模型闲置资金,每年有一个选择权B0的期限为1年,利率为0%。
键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
的向量PurchaseYears
表示,债券k
可供购买。条目
k
的向量成熟
代表了成熟时期 的债券k
。条目
k
的向量银行利率
代表了利率 的债券k
。
想象这个问题,单杠表示可用的购买时间和持续时间为每个键。
%的时间了T = 5;%的债券N = 4;%初始数量的钱Capital_0 = 1000;%的购买机会nPtotal = N + T;%购买时间PurchaseYears = [1; 2; 3; 4、5、1; 5; 2; 2);%债券期限成熟= [1;1;1;1;1;4;1;4,3];%的利率利率= (0,0,0,0,0;2,4,6,6];plotInvestments (N, PurchaseYears,成熟,利率)
决策变量
代表你的决策变量的向量x
,在那里x (k)
债券投资的金额k
,因为k = 1 . . 9
。在成熟,投资支出x (k)
是
定义
总回报的债券k
:
%总回报率finalReturns =(1 +利率/ 100)。^成熟;
目标函数
最大化的目标是选择投资的钱收集的T
。的阴谋,你会发现投资收集在不同的中间,再投资。在一年的结束T
返回的钱投资5 7和8可以收集和代表你的最后的财富:
将这个问题放在表单linprog
解决,将这种最大化问题转化为一个最小化问题使用负的系数x (j)
:
与
f = 0 (nPtotal, 1);f ((5、7、8)) = (-finalReturns (5), -finalReturns (7), -finalReturns (8)];
线性约束:投资不超过你
每年都有一定数量的钱用于购买债券。从第一年开始,你可以购买期权的初始资本投资 和 ,所以:
然后接下来的几年里,你收集到期债券的收益,并再投资于新债券来获得可用方程组:
写这些方程形式 的每一行 矩阵对应的平等需要满足:
Aeq = spalloc (N + 1 nPtotal 15);Aeq (1, (1,6)) = 1;Aeq (2 (1、2、8、9)) = (1, 1, 1, 1);Aeq ([2、3]) = [1];Aeq (4 (3、4)) = [1];Aeq (5 9 [4:7] = [-finalReturns (4), 1, -finalReturns (6), 1, -finalReturns (9)];说真的= 0 (T, 1);说真的(1)= Capital_0;
绑定约束:不借
因为每个投资额必须积极解决方案中的每个条目向量
必须是积极的。包括这个约束通过设定一个下限磅
在解向量
。没有明确的上限解向量。因此,设置上限乌兰巴托
空的。
磅= 0(大小(f));乌兰巴托= [];
解决这个问题
解决这个问题没有限制你可以投资于债券。内点算法可以用来解决这种类型的线性规划问题。
选择= optimoptions (“linprog”,“算法”,“内点”);[xsol, fval exitflag] = linprog (f [] [], Aeq,说真的,磅,乌兰巴托,选项);
presolve中发现的解决方案。
可视化解决方案
出口标志为1,表明解决者找到了一个解决方案。的值-fval
,作为第二个返回linprog
输出参数,对应于最后的财富。随着时间的推移图你的投资。
流(% d年后,换取最初的$ % g是$ % g \ n ',…T Capital_0 -fval);
5年之后,换取最初的1000美元是1262.48美元
plotInvestments (N, PurchaseYears、成熟度、利率、xsol)
最优投资控股有限
分散你的投资,你可以选择限制在任何一个投资债券一定比例Pmax
那年的总资本(包括回报债券目前成熟的时期)。不平等的你获得以下系统:
将这些矩阵形式的不平等Ax < = b
。
建立系统的不平等,首先产生一个矩阵yearlyReturns
包含换取债券被我在年行我和列j。j代表该系统作为一个稀疏矩阵。
%最大比例投资于债券Pmax = 0.6;%建立每个债券的回报作为稀疏的成熟时期%的矩阵cumMaturity = [0; cumsum(成熟度)];xr = 0 (cumMaturity (end-1), 1);年= 0 (cumMaturity (end-1), 1);cr = 0 (cumMaturity (end-1), 1);为i = 1: nPtotal mi =成熟度(i);%我到期的债券π= PurchaseYears(我);%我购买的债券idx = cumMaturity(我)+ 1:cumMaturity (i + 1);%索引xr,年和crxr (idx) =我;%债券指数年(idx) =π+ 1:π+ mi;%年到期cr (idx) =(1 +利率(我)/ 100)。^ (1:mi);%返回成熟时期结束yearlyReturns =稀疏(xr,年,cr nPtotal T + 1);%建立不等式约束的系统= -Pmax * yearlyReturns (:, PurchaseYears) + speye (nPtotal);%左手边b = 0 (nPtotal, 1);b (PurchaseYears = = 1) = Pmax * Capital_0;
解决这个问题通过投资在任何一个资产不超过60%。情节产生的购买。注意到你最后的财富小于投资没有这个限制。
[xsol, fval exitflag] = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项);
最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
流(% d年后,换取最初的$ % g是$ % g \ n ',…T Capital_0 -fval);
5年之后,换取最初的1000美元是1207.78美元
plotInvestments (N, PurchaseYears、成熟度、利率、xsol)
任意大小的模型
创建一个模型为一个通用版本的问题。说明使用T
= 30年和400随机生成的债券利率从1到6%。这个设置会导致430决策变量的线性规划问题。等式约束的系统是由一个稀疏矩阵表示Aeq
的维度30 - - 430和不平等的系统是由一个稀疏矩阵表示一个
尺寸430 -的- 430。
%的再现性rng默认的%初始数量的钱Capital_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;%计算返回的每个债券的期限为:finalReturns =(1 +利率/ 100)。^成熟;%为每个选项生成随机购买年PurchaseYears = 0 (nPtotal, 1);% 1是债券每年可供购买PurchaseYears (1: T) = 1: T;为i = 1: N%生成一个随机的债券在年底前到期% T年PurchaseYears (i + T) =兰迪([1 T-Maturity (i + T) + 1]);结束%计算年每个债券达到成熟SaleYears = PurchaseYears +成熟;%初始化f为0f = 0 (nPtotal, 1);%指数今年年底的销售机会的TSalesTidx = SaleYears = = T + 1;%的预期回报,而销售机会在今年年底TReturnsT = finalReturns (SalesTidx);%目标函数f (SalesTidx) = -ReturnsT;%生成等式约束的系统。%为每一个购买选项,把相应的系数为1的行%的年购买选项和相对应的列%指数的购买机会xeq1 = PurchaseYears;yeq1 = (1: nPtotal) ';ceq1 = 1 (nPtotal, 1);%为每个销售选项,把——\ rho_k \ rho_k的利率%相关债券出售,在相对应的行%的销售选择和相对应的列购买%机会xeq2 = SaleYears (~ SalesTidx);yeq2 =找到(~ SalesTidx);ceq2 = -finalReturns (~ SalesTidx);%生成矩阵稀疏的平等Aeq =稀疏([xeq1;xeq2]、[yeq1;yeq2]、[ceq1;ceq2), T, nPtotal);%生成右边说真的= 0 (T, 1);说真的(1)= Capital_0;%建立不等式约束的系统%最大比例投资于债券Pmax = 0.4;%建立每个债券的回报在成熟时期cumMaturity = [0; cumsum(成熟度)];xr = 0 (cumMaturity (end-1), 1);年= 0 (cumMaturity (end-1), 1);cr = 0 (cumMaturity (end-1), 1);为i = 1: nPtotal mi =成熟度(i);%我到期的债券π= PurchaseYears(我);%我购买的债券idx = cumMaturity(我)+ 1:cumMaturity (i + 1);%索引xr,年和crxr (idx) =我;%债券指数年(idx) =π+ 1:π+ mi;%年到期cr (idx) =(1 +利率(我)/ 100)。^ (1:mi);%返回成熟时期结束yearlyReturns =稀疏(xr,年,cr nPtotal T + 1);%建立不等式约束的系统= -Pmax * yearlyReturns (:, PurchaseYears) + speye (nPtotal);%左手边b = 0 (nPtotal, 1);b (PurchaseYears = = 1) = Pmax * Capital_0;%下界约束添加到这个问题。1磅= 0 (nPtotal);
解决方案没有限制
首先,解决线性规划问题没有不等式约束使用的内点算法。
%没有不等式约束解决这个问题选择= optimoptions (“linprog”,“算法”,“内点”);抽搐(xsol、fval exitflag] = linprog (f [] [], Aeq,说真的,磅,[],选项);
最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
toc
运行时间是0.052589秒。
流(' \ nAfter % d年,换取初始$ % g是$ % g \ n ',…T Capital_0 -fval);
30年之后,换取最初的1000美元是5167.58美元
解决方案控股有限
现在,解决不等式约束的问题。
%解决不等式约束的问题选择= optimoptions (“linprog”,“算法”,“内点”);抽搐(xsol、fval exitflag] = linprog (f, A、b Aeq,说真的,磅,[],选项);
最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
toc
运行时间是0.953470秒。
流(' \ nAfter % d年,换取初始$ % g是$ % g \ n ',…T Capital_0 -fval);
30年之后,换取最初的1000美元是5095.26美元
尽管约束增加了订单的数量,找到一个解决方案的解决者的时间增加了100年的订单。这种性能差异部分引起的密度列不等式系统矩阵所示一个
。这些列对应于债券期限较长的时期,如下图所示。
%每个列的非零元素数量nnzCol =总和(spones (A));%画出成熟长度为每个键和非零元素的数量图;情节(nnzCol成熟,“o”);包含(债券的期限为k”)ylabel (“非零列k的数量”)
密集的列的约束导致解算器的内部致密的块矩阵,产生的损失其稀疏方法的效率。加快解决,试着对偶单纯形算法,这是不太敏感的密度列。
%使用对偶单纯形解决不等式约束的问题选择= optimoptions (“linprog”,“算法”,对偶单纯形的);抽搐(xsol、fval exitflag] = linprog (f, A、b Aeq,说真的,磅,[],选项);
找到最优解。
toc
运行时间是0.281840秒。
流(' \ nAfter % d年,换取初始$ % g是$ % g \ n ',…T Capital_0 -fval);
30年之后,换取最初的1000美元是5095.26美元
在这种情况下,花更少的时间获得相同的对偶单纯形算法的解决方案。
定性结果分析
了解解决方案发现linprog
,比较数量fmax
,你会如果你能开始你的所有的钱都投资在一个债券利率为6%(最高利率)完整的30年。你也可以计算相对应的等效利率最终财富。
%最大数量fmax = Capital_0 * (1 + 6/100) ^ T;%的比例(%)老鼠= -fval / fmax * 100;%相当于利率(%)rsol = ((-fval / Capital_0) ^ (1 / T) 1) * 100;流([的收集量% g最大金额的% % $ % g’…”,您将获得投资于债券。\ n”…“期末财富对应于一个% g % % % d年利率”…“。\ n”),老鼠,fmax rsol T)
收集量88.7137%的最高金额5743.49美元,你会获得投资于债券。你最后的财富对应于一个30年5.57771%的利率。
plotInvestments (N, PurchaseYears、成熟度、利率、xsol,假)