长期投资最大化使用线性规划:具体问题具体分析
这个例子展示了如何使用确定性的具体问题具体分析的方法来解决投资问题返回固定数量的多年T
。问题是分配你的钱可以投资期末财富最大化。solver-based方法,请参阅长期投资最大化使用线性规划:Solver-Based。
问题公式化
假设您有一个初始数量的钱Capital_0
投资的时间T
年N
零息债券。每个债券支付一个固定利率,每年化合物的投资,并支付本金+复合利息的成熟时期。目标是最大化后资金的总额T
年。
可以包括一个约束,没有单一的投资超过一定比例的总资本的投资。
这个例子展示了问题设置一个小案例首先,然后制定一般情况下。
你可以把这作为一个线性规划问题模型。因此,优化你的财富,制定问题使用优化问题的方法。
介绍性的例子
从一个小例子:
开始投资
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
的向量MaturityYears
代表债券的今年年底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];%债券发行时间MaturityYears = PurchaseYears +成熟- 1;% %的利率利率= (0,0,0,0,0;2,4,6,6];%返回后一年的利息rt = 1 +利率/ 100;plotInvestments (N, PurchaseYears,成熟,利率)
决策变量
代表你的决策变量的向量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);
线性约束:投资不超过你
每年都有一定数量的钱用于购买债券。从第一年开始,你可以购买期权的初始资本投资 和 ,所以:
然后接下来的几年里,你收集到期债券的收益,并再投资于新债券来获得可用方程组:
investconstr = optimconstr (T, 1);investconstr (1) = (1) + x (6) = = Capital_0;investconstr (2) = x (2) + (8) + x (9) = = r (1) * x (1);investconstr (3) = x (3) x = = r (2) * (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。我nvestconstr = investconstr;
绑定约束:不借
因为每个投资额必须积极解决方案中的每个条目向量 必须是积极的。包括这个约束通过设定一个下限解向量 。没有明确的上限解向量。
x。下界= 0;
解决这个问题
解决这个问题没有限制你可以投资于债券。内点算法可以用来解决这种类型的线性规划问题。
选择= optimoptions (“linprog”,“算法”,“内点”);[溶胶,fval exitflag] =解决(interestprob,“选项”选项)
使用linprog解决问题。presolve中发现的解决方案。
索尔=结构体字段:x (9 x1双):
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
那年的总资本(包括回报债券目前成熟的时期)。不平等的你获得以下系统:
%最大比例投资于债券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] =解决(interestprob,“选项”、选择);
使用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;%的购买机会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 = rt ^成熟;%为每个选项生成随机购买年PurchaseYears = 0 (nPtotal, 1);% 1是债券每年可供购买PurchaseYears (1: T) = 1: T;为i = 1: N%生成一个随机的债券在年底前到期% T年PurchaseYears (i + T) =兰迪([1 T-Maturity (i + T) + 1]);结束%计算年每个债券在今年年底达到成熟MaturityYears = PurchaseYears +成熟- 1;
计算债券可以购买或出售的时候。的buyindex
矩阵是潜在的购买时间和sellindex
矩阵每个债券持有的潜在销售时间。
buyindex = false (nPtotal T);%分配nPtotal-by-T矩阵为2 = 1:T buyindex(:,(二)= PurchaseYears = = 2;结束sellindex = false (nPtotal T);为2 = 1:T sellindex(:,(二)= MaturityYears = = 2;结束
建立了优化变量对应于债券。
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)。*双(sellindex);
返回生成的销售这些界限
xReturnFromSell = xSell。* repmat (r, 1, T);
创建约束,你投资在每个时间段的数量是前一段时间,你销售的数量。
interestprob.Constraints。InitialInvest =总和(xBuy (: 1)) = = Capital_0;interestprob.Constraints。InvestConstraint =总和(xBuy (:, 2: T), 1) = =总和(xReturnFromSell (:, 1: T - 1), 1);
解决方案没有限制
解决这个问题。
抽搐(溶胶、fval exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
toc
运行时间是0.175883秒。
如何投资做了什么?
流(% d年后,换取最初的$ % g是$ % g \ n ',…T Capital_0 fval);
30年之后,换取最初的1000美元是5167.58美元
解决方案控股有限
创建约束,限制在每个资产投资的一部分,建立一个矩阵,跟踪每一次活跃的债券。表达每个投资必须小于的约束Pmax
乘以总值,建立一个矩阵,跟踪每个投资在每个时间的价值。对于这个大的问题,设置最大分数0.4,可以举行。
Pmax = 0.4;
创建一个活跃的
矩阵对应的时候可以持有债券,和一个cactive
矩阵,每个活动的累积时间键。因此,债券的价值j
在时间t
是x (j) * (rt ^ cactive)
。
积极=双(buyindex | sellindex);为2 = 1:T活跃(:,(二)=双((2 > = PurchaseYears) & (2 < = MaturityYears));结束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;constrlimit (:, 2: T) = xBuy (:, 2: T) < = repmat (Pmax *总和(bondValue (:, 1: T - 1), 1), nPtotal, 1)。*双(buyindex (:, 2: T));interestprob.Constraints。constrlimit = constrlimit;
解决这个问题持有的有限。
抽搐(溶胶、fval exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在选择价值函数的宽容,和约束中满意的选择价值约束宽容。
toc
运行时间是0.781559秒。
流(% d年后,换取最初的$ % g是$ % g \ n ',…T Capital_0 fval);
30年之后,换取最初的1000美元是5095.26美元
加快解决,试着对偶单纯形算法。
选择= optimoptions (“linprog”,“算法”,对偶单纯形的);抽搐(溶胶、fval exitflag] =解决(interestprob,“选项”、选择);
使用linprog解决问题。找到最优解。
toc
运行时间是0.238956秒。
流(% d年后,换取最初的$ % g是$ % g \ n ',…T Capital_0 fval);
30年之后,换取最初的1000美元是5095.26美元
在这种情况下,对偶单纯形算法需要更少的时间获得相同的解决方案。
定性结果分析
了解解决方案,比较多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、成熟度、利率、sol.x,假)