Engee 文档
Notebook

最大化长期投资

导言

这个例子提出了优化长期固定收益投资组合的任务。 目标是通过将不同期限和利率的债券的收入再投资,在给定的规划范围内最大化最终资本。 该研究演示了使用线性规划方法来形式化和解决这个问题。

设置任务

让我们考虑一个投资模型,在给定的时间范围内,固定的初始资本分布在具有确定性回报的债券之间。 每种债券的特点是年资本化的固定利率和到期时累积利息收入的名义价值支付。 该模型的目标函数旨在使投资期结束时的总资本最大化。

此外,该模型可能包括对投资组合多样化的限制,该限制设定了单笔投资在配售时资本总额中的最大份额。

研究方法涉及一步一步地考虑这个问题:从一个有限的工具集的特殊情况到一个广义的公式。 问题的数学形式化是在线性规划装置的框架内实现的,这使得可以制定和解决最大化最终福祉的相应优化问题。

介绍性例子

让我们来看一个初始资本为1,000卢布,投资期限为5年的演示示例。 该模型包括四种不同特征的债券:债券1在第一年购买,期限为4年,收益率为2%;债券2在第五年购买,期限为1年,收益率为4%;债券3和4在第二年购买,

为了模拟非投资基金,引入了五种一年期零收益债券,形成了九种投资工具的等价模型。

添加必要的库和可视化功能:

In [ ]:
using Plots, Random, JuMP, HiGHS
include("plotInvest.jl")

我们使用表示每个债券可用购买期限的水平矩形来可视化此任务。 利率债券的数量沿着这条线排列。 以年为单位的投资期列于各栏中。

In [ ]:
# 年的时间段
期间=5
# 债券数目
债券数目=4
# 初始金额
Summa_0=1000
# 购买选项总数
所有可能的购买=债券数量+期限
# 购买期限
购买年份= [1; 2; 3; 4; 5; 1; 5; 2; 2]
# 债券期限
还款期= [1; 1; 1; 1; 1; 4; 1; 4; 3]
# 债券发售期
还款年=购买年。+还款期。- 1
# 利率百分比
百分比= [0; 0; 0; 0; 0; 2; 4; 6; 6]
# 一年后收益率,包括利息
每天盈利能力=1+百分比。/ 100
# 任务可视化
p1=plotInvest(债券数量,购买年份,到期日,利息)
display(p1)

可变解决方案

让我们用向量x来表示解变量,其中 -投资于债券k的卢布金额,对于k=1,。..,9. 偿还后,投资的付款 等于:

In [ ]:
# 创建优化模型
模型=模型()。优化器)
# 可变解决方案-投资金额
@variable(model,x[1:所有可能的购买]>=0)
# 总回报
总回报=每天的盈利能力。 还款期

目标功能

优化的目的是使可赎回债券的收入再投资所产生的总资本最大化。 正如图形可视化所示,在过渡期间收到的现金流量被再投资,并有助于形成最终的福利。

让我们创建一个目标函数和一个任务来最大化。

In [ ]:
# 创建优化任务(最大化)
@objective(model,Max,x[5]*总回报[5]+x[7]*总回报[7]+x[8]*总盈利能力[8])

线性约束

该模型假设每年在投资工具之间分配可用资本。 在初始阶段,种子资本被放置,在随后的时期,可赎回债券的现金流量被再投资。

让我们做一个方程组:

In [ ]:
# 投资限制
@constraint(model,restriction_investment1,x[1]+x[6]==Summa_0)
@constraint(model,restriction_investment2,x[2]+x[8]+x[9]==每天盈利[1]*x[1])
@constraint(model,restriction_investment3,x[3]==每天盈利[2]*x[2])
@constraint(model,restriction_investment4,x[4]==每天盈利[3]*x[3])
@constraint(model,restriction_investment5,x[5]+x[7]==每天盈利能力[4]*x[4]+总回报[6]*x[6]+总回报[9]*x[9])

决定

我们将解决这个问题,不限制可以投资于一个债券的金额。

In [ ]:
优化!(型号)
=值。(x)
目标函数的值=objective_value(model)
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
LP   has 5 rows; 9 cols; 15 nonzeros
Coefficient ranges:
  Matrix [1e+00, 1e+00]
  Cost   [1e+00, 1e+00]
  Bound  [0e+00, 0e+00]
  RHS    [1e+03, 1e+03]
Presolving model
2 rows, 6 cols, 9 nonzeros  0s
1 rows, 4 cols, 4 nonzeros  0s
0 rows, 0 cols, 0 nonzeros  0s
Presolve : Reductions: rows 0(-5); columns 0(-9); elements 0(-15) - Reduced to empty
Solving the original LP from the solution after postsolve
Model status        : Optimal
Objective value     :  1.2624769600e+03
P-D objective error :  0.0000000000e+00
HiGHS run time      :          0.00
Out[0]:
1262.4769600000004

解决方案的可视化

让我们展示投资回报的价值。

In [ ]:
println("$5年后,初始$(Sum_0)₽的收入将是$(round(目标函数的值,digits=2))₽")
После 5 лет, доход с начальных 1000 ₽ составит 1262.48 ₽

可视化解决方案:

In [ ]:
p2=plotInvest(债券数量,购买年份,到期日,利息,解决方案)
display(p2)

有限的最佳投资

为确保投资组合多样化,该模型对单一资产的投资相对于本期总资本(包括可赎回证券的收益)的最大份额提出了限制。

In [ ]:
# 为具有约束的问题创建模型
model_with_constraints=Model()。优化器)
# 约束模型的决策变量
@variable(model with constraints,x2[1:All possible purchases]>=0)
# 目标功能
@objective(带约束的模型,Max,x2[5]*总回报[5]+x2[7]*总回报[7]+x2[8]*总盈利能力[8]
# 基本投资限制
@constraint(model with constraints,x1,x2[1]+x2[6]==Summa_0)
@constraint(具有约束的模型,x2,x2[2]+x2[8]+x2[9]==每天盈利能力[1]*x2[1]
@constraint(model with constraints,investment3,x2[3]==每天盈利[2]*x2[2])
@constraint(具有约束的模型,investment4,x2[4]==每天盈利能力[3]*x2[3]
@constraint(具有约束的模型,investment5,x2[5]+x2[7]==每天盈利能力[4]*x2[4]+总回报[6]*x2[6]+总回报[9]*x2[9]
# 投资于任何债券的最高利率
最大百分比=0.6

让我们创建一个不平等的系统:

In [ ]:
# 最大投资额的限制
@constraint(具有约束的模型,limit1,x2[1]<=最大百分比*Summa_0)
@constraint(model_with_constraints,limit2,x2[2]<=最大百分比*(盈利能力代码[1]*x2[1]+盈利能力代码[6]*x2[6]))
@constraint(model with constraints,limit3,x2[3]<=Max Percentage*(盈利能力代码[2]*x2[2]+盈利能力代码[6]^2*x2[6]+盈利能力代码[8]*x2[8]+盈利能力代码[9]*x2[9]))
@constraint(model with constraints,limit4,x2[4]<=Max Percentage*(盈利能力代码[3]*x2[3]+盈利能力代码[6]^3*x2[6]+盈利能力代码[8]^2*x2[8]+盈利能力代码[9]^2*x2[9]))
@constraint(model with constraints,limit5,x2[5]<=Max Percentage*(盈利能力代码[4]*x2[4]+盈利能力代码[6]^4*x2[6]+盈利能力代码[8]^3*x2[8]+盈利能力代码[9]^3*x2[9]))
@constraint(具有约束的模型,limit6,x2[6]<=最大百分比*Summa_0)
@constraint(model with constraints,limit7,x2[7]<=Max Percentage*(盈利能力代码[4]*x2[4]+盈利能力代码[6]^4*x2[6]+盈利能力代码[8]^3*x2[8]+盈利能力代码[9]^3*x2[9]))
@constraint(model_with_constraints,limit8,x2[8]<=最大百分比*(盈利能力代码[1]*x2[1]+盈利能力代码[6]*x2[6]))
@constraint(model_with_constraints,limit9,x2[9]<=最大百分比*(盈利能力代码[1]*x2[1]+盈利能力代码[6]*x2[6]))

通过有限的多样化(每个资产的最大资本的60%)解决问题表明,与无限优化相比,最终盈利能力下降。 由此产生的投资组合的可视化显示了投资流的重新分配。

In [ ]:
# 用约束解决问题
优化!(带约束的模型)
solution2=值。(x2)
goal_function_2=objective_value(具有约束的模型)
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
LP   has 14 rows; 9 cols; 46 nonzeros
Coefficient ranges:
  Matrix [6e-01, 1e+00]
  Cost   [1e+00, 1e+00]
  Bound  [0e+00, 0e+00]
  RHS    [6e+02, 1e+03]
Presolving model
7 rows, 6 cols, 25 nonzeros  0s
Dependent equations search running on 2 equations with time limit of 1000.00s
Dependent equations search removed 0 rows and 0 nonzeros in 0.00s (limit = 1000.00s)
4 rows, 6 cols, 19 nonzeros  0s
Presolve : Reductions: rows 4(-10); columns 6(-3); elements 19(-27)
Solving the presolved LP
Using EKK dual simplex solver - serial
  Iteration        Objective     Infeasibilities num(sum)
          0    -3.3024705065e+00 Ph1: 4(3.57078); Du: 3(3.30247) 0s
          3    -1.2077779546e+03 Pr: 0(0) 0s
Solving the original LP from the solution after postsolve
Model status        : Optimal
Simplex   iterations: 3
Objective value     :  1.2077779546e+03
P-D objective error :  9.4089971014e-17
HiGHS run time      :          0.00
Out[0]:
1207.7779545600001

让我们在考虑到限制的情况下显示收入值:

In [ ]:
println("$5年后,初始$(Sum_0)₽的收入将为$(round(value of goal_function2,digits=2))₽")
После 5 лет, доход с начальных 1000 ₽ составит 1207.78 ₽

可视化解决方案:

In [ ]:
# 具有约束的解决方案的可视化
p3=plotInvest(债券数量,购买年份,到期日,利息,决议2)
display(p3)

自定义大小的模型

让我们继续讨论这个问题的广义表述,将模型扩展到30年的投资期限,400债券的投资组合随机回报在1-6%的范围内。 这种配置形成了具有430个变量的线性规划问题,证明了该方法对实际投资问题的适用性。

In [ ]:
Random.seed!(123)
# 初始金额
Summer_0_大=1000
# 年的时间段
Long_周期=30
# 债券数目
债券数量大=400
# 购买选项总数
所有可能的购买量都很大=债券数量很大+Big_期
# 产生随机还款期限
还款time_Long=rand(1:(Period_Large-1),所有可能的购买都很大)
# 债券的到期日为1年
还款时间_很长[1:期限很长]= 1
# 我们为每个债券生成随机年利率
百分比很大=兰特(1:6,所有可能的购买都很大)
# 债券的利率为0(未投资)
百分比很大[1:Period_Long]= 0
# 一年后收益率,包括利息
盈利能力为small_=1+百分比很大。/ 100
# 计算每只债券在到期期结束时的收益率
总盈利能力大=盈利能力非常大。 长期还款期
# 为每个选项创建随机购买年份
购买年份大=零(Int,所有可能的购买都很大)
# 这些债券每年都可供购买
购买年份大[1:Long_period]=1:The Big_period
对于i in1:债券数量很大
    # 生成随机年份以在T年期结束前偿还债券
    购买年份大[i+Long_period]=rand(1:(Long period-长还款期[i+Long period]+1))
end
# 计算每只债券在年底到期的期限
还款年份大=购买年份大。+还款期限长。- 1

让我们形成一个投资操作的临时模型,其中矩阵 индексы_покупки_большиеиндексы_продажи_большие 每种金融工具的开仓和平仓可接受的期限都已设定。

In [ ]:
# 采购指数矩阵
购买指数很大=假(所有可能的购买都很大,周期很大)
对于ii in1:Big_时期
    购买指数大[:,ii]=购买年份大。==
end

# 销售指数矩阵
Sale index_sold=falses(所有可能的购买量都很大,周期很大)
对于ii in1:Big_时期
    出售的指数很大[:,ii]=还款年份很大。==
end

我们设置了对应于债券的优化变量。

In [ ]:
model_large=模型(HiGHS.优化器)
# 可变解决方案
@variable(model_big,x_big[1:所有可能的购买都很大]>=0)

让我们创建一个优化目标函数。

In [ ]:
# 最大化的任务
@objective(model big,Max,sum(x big[sale index big[:,Period Big]].*总盈利能力大[销售指标大[:,周期大]]))
# 限制
@约束(模型大,初始投资大, 
    sum(x_big[i]for i in1:All possible purchases are large if the purchases indexes are large[i,1])==Sum_0_Large)

对于t in2:The Big_period
    @constraint(model_很大, 
        sum(x_big[i]for i in1:All possible purchases are large if the purchases indexes are large[i,t])==
        sum(x_big[i]*Total profitability is large[i]for i in1:All possible purchases are large if the sale indexes are large[i,t-1]))
end

让我们解决问题:

In [ ]:
@时间优化!(model_很大)
big_resolution=值。(x_大)
目标函数的值很大=objective_value(模型很大)
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
LP   has 30 rows; 430 cols; 823 nonzeros
Coefficient ranges:
  Matrix [1e+00, 5e+00]
  Cost   [1e+00, 5e+00]
  Bound  [0e+00, 0e+00]
  RHS    [1e+03, 1e+03]
Presolving model
29 rows, 381 cols, 727 nonzeros  0s
24 rows, 304 cols, 545 nonzeros  0s
10 rows, 64 cols, 109 nonzeros  0s
8 rows, 47 cols, 77 nonzeros  0s
5 rows, 22 cols, 36 nonzeros  0s
4 rows, 18 cols, 28 nonzeros  0s
0 rows, 0 cols, 0 nonzeros  0s
Presolve : Reductions: rows 0(-30); columns 0(-430); elements 0(-823) - Reduced to empty
Solving the original LP from the solution after postsolve
Model status        : Optimal
Objective value     :  5.7434911729e+03
P-D objective error :  0.0000000000e+00
HiGHS run time      :          0.00
  0.006142 seconds (3.72 k allocations: 326.117 KiB)
Out[0]:
5743.491172913259

投资效果如何?

In [ ]:
println("美元后一个期间的多年中,收入从初始$(sum0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0")
После 30 лет, доход с начальных 1000 ₽ составит 5743.49 ₽

有限股份的解决方案

让我们创建一个具有约束的优化问题:

In [ ]:
# 为具有约束的问题创建模型
model_Large with constraints=Model()。优化器)

@variable(model带约束很大,x带[1:所有可能的购买都很大]>=0
@objective(模型很大,有约束,最大, 
    sum(x_big_c[i]*Total profitability is large[i]for i in1:All possible purchases are large if the sale indexes are large[i,period_Large]))

# 具有约束的模型的约束
@constraint(模型带约束大,初始投入大, 
    sum(x_big_c[i]for i in1:All possible purchases are large if the purchases indexes are large[i,1])==Sum_0_Large)

对于t in2:The Big_period
    @constraint(模型很大,有约束, 
        sum(x_big_c[i]for i in1:All possible purchases are large if the purchases indexes are large[i,t])==
        sum(x_big_c[i]*Total profitability is large[i]for i in1:All possible purchases are large if the sale indexes are large[i,t-1]))
end

比例模型使用多样化标准,将单一债券在投资组合中的份额限制为0.4。

In [ ]:
最大百分比大=0.4

多样化约束的形式化需要构建两个数据结构:债券活动矩阵和当前价值矩阵,在此基础上确定投资组合中单个资产份额的上限。

In [ ]:
active_size=falses(所有可能的购买都很大,Period_size)
对于ii in1:Big_时期
    活动大[:,ii]=(ii.>=购买年份大)。&(二.<=还款年_大)
end

我们将对最大投资设定限制。:

In [ ]:
# 最大投资额的限制
对于i in1:所有可能的购买都很大
    对于t in1:The Big_period
        如果购买指数很大[i,t]
            if t == 1
                @constraint(model大带约束,x大带[i]<=maxcenter大*Sum is0大)
            else
                @constraint(model大带约束,x大带[i]<=maxcenter大 * 
                    sum(x_big with[j]*(盈利能力is_big[j]^sum(active big[j,1:(t-1)])) 
                        对于j in1:所有可能的购买都很大,如果活动很大[j,t-1]))
            end
        end
    end
end

解决问题:

In [ ]:
@时间优化!(模型很大,有约束)
解决方案很大,约束条件=值。(x_big_c)
目标函数的值大带约束=objective_value(模型大带约束)
println("经过多年的时间,最初的收入$(sum0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0")
Running HiGHS 1.11.0 (git hash: 364c83a51e): Copyright (c) 2025 HiGHS under MIT licence terms
LP   has 460 rows; 430 cols; 72421 nonzeros
Coefficient ranges:
  Matrix [4e-01, 5e+00]
  Cost   [1e+00, 5e+00]
  Bound  [0e+00, 0e+00]
  RHS    [4e+02, 1e+03]
Presolving model
419 rows, 430 cols, 72380 nonzeros  0s
Dependent equations search running on 28 equations with time limit of 1000.00s
Dependent equations search removed 0 rows and 0 nonzeros in 0.00s (limit = 1000.00s)
417 rows, 422 cols, 70114 nonzeros  0s
Presolve : Reductions: rows 417(-43); columns 422(-8); elements 70114(-2307)
Solving the presolved LP
Using EKK dual simplex solver - serial
  Iteration        Objective     Infeasibilities num(sum)
          0    -2.3043600253e+02 Ph1: 380(10201.3); Du: 102(230.436) 0s
        117    -5.7109808455e+03 Pr: 0(0) 0s
Solving the original LP from the solution after postsolve
Model status        : Optimal
Simplex   iterations: 117
Objective value     :  5.7109808455e+03
P-D objective error :  0.0000000000e+00
HiGHS run time      :          0.05
  0.065911 seconds (10.74 k allocations: 4.741 MiB)

После 30 лет, доход с начальных 1000 ₽ составит 5710.98 ₽

结果的定性分析

为了评估最佳投资组合的有效性,最好将其盈利能力与理论最大值进行比较-在整个30年期间,所有资本在债券中的投资率最高为6%。 分析的另一个指标可以是计算与所达到的最终福利水平相对应的等效年率。

In [ ]:
# 最大可能金额
max_size=Sum_0_size*(1+6/100)^大周期

# 比率(百分比)
比率=具有大极限/最大总和的目标函数的值*100

# 等值利率
equivalent_set=((具有约束的goal_function_large的值/Sum_0_Large)^(1/Period_Large)-1)*100

println("收到的金额为$(round(ratio,digits=2))$最大金额的%(round(max_sum,digits=2)),")
println("这可以通过投资一个债券来获得。")
println("\您的收入对应于$(round(equivalent value,digits=2))%年利率为$(Long)-summer period.")

# 可视化结果
p4=plotInvest(债券数量多,购买年份大,还款期大,百分比大,分辨率大,有限制,虚假)
display(p4)
Полученная сумма составит 99.43% от максимальной суммы 5743.49 ₽,
которая могла быть получена при инвестировании в одну облигацию.

Ваш доход соответствует 5.98% годовой ставке за 30-летний период.

图表显示了有限制的投资组合的时间结构:

*水平绿线-选定债券

*行首为购买年份,行尾为还款年份

*大括号{i}中的数字是键标识符

*自上而下的位置-投资优先

该图表显示了一个多元化的投资组合,其中投资按照每项资产不超过60%的限制分布在不同的年份和时期。

结论

所进行的研究证明了线性规划方法优化长期投资组合的有效性。 开发的模型可以确定在给定时间范围内最大限度地提高最终福祉的资本配置策略。

实验计算证实了多样化和盈利能力之间存在折衷:对一种资产份额的60%限制的引入与无限优化相比,最终收益率降低了4.3%。 该方法的可扩展性在具有30年期限和400债券组合的任务上得到验证。

未来研究的方向是考虑到盈利能力的不确定性,并在不断变化的市场条件下创建动态投资组合优化算法。