利用线性规划实现长期投资最大化:基于问题
这个例子展示了如何使用基于问题的方法来解决固定年限内具有确定收益的投资问题T
.问题是如何将你的钱分配到可投资项目上,使你最终的财富最大化。关于基于求解器的方法,请参见利用线性规划实现长期投资最大化:基于求解器.
问题公式化
假设你有一笔初始资金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];%债券发售次数到期日= 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);
线性约束:投资不要超过你所拥有的
每年,你有一定数量的钱可以购买债券。从第1年开始,您可以将初始资本投资于购买选项 而且 ,所以:
然后在接下来的几年里,你从到期的债券中收集收益,并将它们重新投资于新的可用债券,从而得到方程组:
investconstr = optimconstr (T, 1);投资人(1)= x(1) + x(6) == Capital_0;investconstr (2) = x (2) + (8) + x (9) = = r (1) * x (1);investor (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.LowerBound = 0;
解决这个问题
解决这个问题时,不要限制你在债券上的投资金额。内点算法可用于求解这类线性规划问题。
选择= optimoptions (“linprog”,“算法”,“内点”);[溶胶,fval exitflag] =解决(interestprob,“选项”选项)
使用linprog解决问题。解决过程中发现的溶液。
索尔=结构体字段: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;生成随机的期限成熟度= randi([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) = randi([1 T- maturity (i+T)+1]);结束计算每只债券在年底到期的年数到期日= PurchaseYears +到期日- 1;
计算债券可以买卖的时间。的buyindex
矩阵保存着潜在的购买时间,而sellindex
矩阵保存着每个债券的潜在销售时间。
buyindex = false (nPtotal T);分配nPtotal-by-T矩阵为ii = 1:T buyindex(:,ii) = PurchaseYears = ii;结束sellindex = false (nPtotal T);为2 = 1:T sellindex(:,ii) = matityyears == ii;结束
建立与键相对应的优化变量。
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);
创建一个约束条件,即你在每个时间段的投资金额等于你在前一个时间段的销售金额。
interestprobe . constraints . initialinvest = sum(xBuy(:,1)) == Capital_0;interestprobe . constraints . investconstraint = sum(xBuy(:,2:T),1) == sum(xReturnFromSell(:,1:T-1),1);
无持有限制的解
解决这个问题。
Tic [sol,fval,exitflag] = solve(interestprob,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在函数公差的选定值内,约束满足在约束公差的选定值内。
toc
运行时间为0.180245秒。
这些投资表现如何?
流('在%d年后,初始$%g的回报为$%g \n',...T Capital_0 fval);
30年后,最初1000美元的回报是5167.58美元
有限控股解决方案
要创建约束条件,限制每种资产的投资比例,可以建立一个矩阵,跟踪每个时间段的活跃债券。表示每项投资必须小于Pmax
乘以总价值,建立一个矩阵来记录每次投资的价值。对于这个较大的问题,将可以保持的最大分数设置为0.4。
Pmax = 0.4;
创建一个活跃的
矩阵对应的是一个键可以持有的时间,而acactive
持有每个活跃债券的累积期限的矩阵。债券的价值j
在时间t
是x (j) * (rt ^ cactive)
.
Active = double(buyindex | sellindex);为ii = 1:T active(:,ii) = double((ii >= PurchaseYears) & (ii <= 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;
解决有限持股的问题。
Tic [sol,fval,exitflag] = solve(interestprob,“选项”、选择);
使用linprog解决问题。找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在函数公差的选定值内,约束满足在约束公差的选定值内。
toc
运行时间为1.074194秒。
流('在%d年后,初始$%g的回报为$%g \n',...T Capital_0 fval);
30年后,最初1000美元的回报是5095.26美元
为了加快求解速度,可以尝试双单纯形算法。
选择= optimoptions (“linprog”,“算法”,对偶单纯形的);Tic [sol,fval,exitflag] = solve(interestprob,“选项”、选择);
使用linprog解决问题。找到最优解。
toc
运行时间为0.417747秒。
流('在%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%% '...'你从投资一个债券中获得的收益。'...“你的最终财富对应于%g%% d年的利率”...“。\ n”],鼠,fmax, rsol, T)
所得金额为投资一种债券所可获得的最高金额$5743.49的88.7137%。你的最终财富相当于30年5.57771%的利率。
plotInvestments (N, PurchaseYears、成熟度、利率、sol.x,假)