主要内容

长期投资最大化使用线性规划:Solver-Based

这个例子展示了如何使用linprog解算器的优化工具箱®来解决投资问题与确定性收益固定数量的年T。问题是分配你的钱可以投资期末财富最大化。下面的例子使用了solver-based方法。

问题公式化

假设您有一个初始数量的钱Capital_0投资的时间TN零息债券。每个债券支付的利率每年化合物,并支付本金+复合利息的成熟时期。目标是最大化后资金的总额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的向量银行利率代表了利率 ρ 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)

x ( k ) ( 1 + ρ k / 1 0 0 ) k

定义 r k 总回报的债券k:

r k = ( 1 + ρ k / 1 0 0 ) k

%总回报率finalReturns =(1 +利率/ 100)。^成熟;

目标函数

最大化的目标是选择投资的钱收集的T。的阴谋,你会发现投资收集在不同的中间,再投资。在一年的结束T返回的钱投资5 7和8可以收集和代表你的最后的财富:

马克斯 x x 5 r 5 + x 7 r 7 + x 8 r 8

将这个问题放在表单linprog解决,将这种最大化问题转化为一个最小化问题使用负的系数x (j):

最小值 x f T x

f = ( 0 ; 0 ; 0 ; 0 ; - - - - - - r 5 ; 0 ; - - - - - - r 7 ; - - - - - - r 8 ; 0 ]

f = 0 (nPtotal, 1);f ((5、7、8)) = (-finalReturns (5), -finalReturns (7), -finalReturns (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

写这些方程形式 一个 e x = b e 的每一行 一个 e 矩阵对应的平等需要满足:

一个 e = ( 1 0 0 0 0 1 0 0 0 - - - - - - r 1 1 0 0 0 0 0 1 1 0 - - - - - - r 2 1 0 0 0 0 0 0 0 0 - - - - - - r 3 1 0 0 0 0 0 0 0 0 - - - - - - r 4 1 - - - - - - r 6 1 0 - - - - - - r 9 ]

b e = ( C 一个 p t 一个 l 0 0 0 0 ]

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;

绑定约束:不借

因为每个投资额必须积极解决方案中的每个条目向量 x 必须是积极的。包括这个约束通过设定一个下限在解向量 x 。没有明确的上限解向量。因此,设置上限乌兰巴托空的。

磅= 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那年的总资本(包括回报债券目前成熟的时期)。不平等的你获得以下系统:

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 )

将这些矩阵形式的不平等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,假)

相关的话题