作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Python3.11
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2024年2月25日
数学规划、线性规划、整数规划
例4.12(本题选自1998年全国大学生数学建模竞赛A题)
市场上有 种资产(如股票、债券、……) 供投资者选择,某公司有数额为 的一笔相当大的资金可用作一个时期的投资。公司财务分析人员对这 种资产进行了评估,估算出在这一时期内购买资产 的平均收益率为 ,并预测出购买 的风险损失率为 。考虑到投资越分散,总的风险越小,公司确定,当用这笔资金购买若干种资产时,总体风险可用所投资的 中最大的一个风险来度量。
购买 要付交易费,费率为 ,并且当购买额不超过给定值 时,交易费按购买 计算(不买当然无须付费)。另外,假定同期银行存款利率是 ,且既无交易费又无风险。
1). 试给该公司设计一种投资组合方案,即用给定的资金 ,有选择地购买若干种资产或存银行生息,使净收益尽可能大,而总体风险尽可能小。已知 时的相关数据如表1所示。
表1 四种资产的相关数据
资产 | 平均收益率 | 风险损失率 | 交易费率 | 定值费 |
---|---|---|---|---|
(%) | (%) | (%) | (元) | |
28 | 2.5 | 1 | 103 | |
21 | 1.5 | 2 | 198 | |
23 | 5.5 | 4.5 | 52 | |
25 | 2.6 | 6.5 | 40 |
2). 试就一般情况对以上问题进行讨论,并利用 数据文件ex0412 中的数据进行计算。
明确问题 这是一个组合投资问题:已知市场上可供投资的 种资产的平均收益率、风险损失率以及购买资产时产生的交易费费率,设计一种投资组合方案,也就是要将可供投资的资金分成 份分别购买 种资产。不同类型的资产的平均收益率和风险损失率也各不相同,因此在进行投资时,要同时兼顾两个目标:投资的 净收益 和 风险。
(1)可供投资的资金数额 相当大;
(2)投资越分散,总的风险越小,总体风险可用所投资的 中最大的一个风险来度量;
(3)可供选择的 种资产(含银行存款)之间是相互独立的;
(4)每种资产可购买的数量为任意值;
(5)在当前投资周期内, 固定不变;
(6)不考虑在资产交易过程中产生的其他费用,如股票交易印花税等。
设购买资产 的金额为 ,存银行的金额为 ,投资组合向量记为 ,向量x是本问题的决策变量。题目中明确指出要考虑两类目标,即投资的净收益和风险,分别记为 和 。
(1)购买 时,需要支付一定的交易费,其费率为 。当购买额不超过给定值 时,支付的交易费按照 计算(不购买时无需付费),即为 ;当购买额超过给定值 时,支付的交易费以实际交易额为准,即为 。所以,所付交易费 是一个分段函数,即:
此处, 表示存银行的金额 。
(2)题目给出购买 的平均收益率为 ,因此投资 的平均净收益为:
于是投资组合 的平均净收益为:
(3)购买 的风险费率为 ,因此总体风险可以用所投资的 中最大的一个风险来衡量,即:
(4)投资所需的总资金为:
(5)为了满足题目要求的 净收益尽可能大,总体风险尽可能小,本题可以归结为一个多目标规划模型。
(6)投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资组合。此时可以使用权重 来权衡两个方面,当对风险和收益分别赋予权重 和 时, 称为投资偏好系数。
在题设中,给定了公司提供的资金 是一个相当大的值。相对而言,题目所给的定值 (单位:元)相对总投资 就变得很少,与交易费率 相乘后的交易手续费 就更小,这样购买 的净收益 可以简化为 。此时,目标函数(7)可以简化为:
为了便于求解,我们可以进一步将模型(8)简化为以下三种情况:
在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 ,使最大的一个风险 ,可找到相应的投资方案。这样把多目标规划变成单目标的线性规划。
若投资者希望总盈利至少达到水平 以上,在风险最小的情况下寻求相应的投资组合。此时,多目标规划也简化为单目标的线性规划。
根据模型公式(8),投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资组合。因此对风险、收益分别赋予权重 和 后,模型可以简化为:
首先,我们将题目给定的相关数据(表1)转换为矩阵形式,可得以下变量:
(1) 求解
设 元,最高风险率 ,并代入相关参数后,模型一可表示为:,
由于 是任意给定的风险度,到底怎样设置是没有准则的,不同的投资者有不同的风险度。因此,我们从 开始,以步长为 进行循环搜索,以确定最优方案。编制Python程序如下:
# ch0609_ex4_12_1
import cvxpy as cp # 载入凸优化包
import matplotlib.pylab as plt # 载入绘图程序包
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
q = plt.array([0.025, 0.015, 0.055, 0.026])
r = plt.array([0.05, 0.27, 0.19, 0.185, 0.185])
x = cp.Variable(5, pos=True)
aep = plt.array([1, 1.01, 1.02, 1.045, 1.065])
obj = cp.Maximize(r @ x)
a = 0; aa = []; Q = []; X = []; M = 10000; # 设置初始风险率为0,增长上限为0.05
while a <= 0.05:
con = [aep @ x == M, cp.multiply(q, x[1:])<=a*M]
prob = cp.Problem(obj, con)
prob.solve(solver=cp.GLPK_MI)
aa.append(a); # aa用于保存不同风险下的风险率向量
Q.append(prob.value) # 将不同风险下的收益保存进变量Q中,以便可视化
X.append(x.value) # X为投资组合向量
a = a + 0.001
plt.figure(figsize=(6,3))
plt.plot(aa, Q, 'r*');
plt.xlabel('风险率a')
plt.ylabel('收益Q', rotation=0);
plt.show()
(2)结果分析
由以上风险 与收益 之间的关系可以得知
i = 6
print('当风险率为{}%时,\n 收益为:{:.2f},\n 投资组合为:{}'.format(aa[i], Q[i], X[i]))
当风险率为0.006%时,
收益为:2019.08,
投资组合为:[0. 2400. 4000. 1090.90909091 2212.20657277]
(1)线性化
具体求解时,我们需要把目标函数线性化,引进变量 ,则模型可线性化为:
(2)求解及分析
当取不同的风险和收益预期权重 时,计算结果如 表2 所示,计算代码如下:
# ch0610_ex4_12_2
import numpy as np
import cvxpy as cp
import pylab as plt
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rc('font', family='SimHei')
plt.rc('font', size=15)
x = cp.Variable(6, pos = True)
r = np.array([0.05, 0.28, 0.21, 0.23, 0.25])
p = np.array([0, 0.01, 0.02, 0.045, 0.065])
q = np.array([0, 0.025, 0.015, 0.055, 0.026])
def LP(w):
V = [] #风险初始化
Q = [] #收益初始化
X = [] #最优解的初始化
W = [] # 权重系数初始化
con = [(1+p) @ x[: -1] == 10000, cp.multiply(q[1:],x[1:5])<=x[5]]
for i in range(len(w)):
obj = cp.Minimize(w[i] * x[5] - (1-w[i]) *((r-p) @ x[: -1]))
prob = cp.Problem(obj, con)
prob.solve(solver='GLPK_MI')
xx = x.value #提出所有决策变量的取值
V.append(max(q*xx[:-1]))
Q.append((r-p)@xx[:-1])
X.append(xx)
W.append(w[i])
print('w =', w);
print('V =', np.round(V,2))
print('Q =', np.round(Q,2))
plt.figure(figsize=(12,3));
plt.grid('on')
ax0 = plt.subplot(1,2,1)
ax0.plot(V, Q, '*-');
ax0.set_xlabel('风险(元)');
ax0.set_ylabel('收益(元)')
ax1 = plt.subplot(1,2,2)
ax1.plot(w, Q, 'o-', color='red')
ax1.set_ylabel('收益(元)')
ax1.set_xlabel('权重系数w')
ax2 = ax1.twinx()
ax2.plot(w, V, '^-', color='blue')
ax2.set_ylabel('风险(元)')
return X
w1 = np.arange(0, 1.1, 0.1)
LP(w1);
plt.show()
w = [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
V = [247.52 247.52 247.52 247.52 247.52 247.52 247.52 247.52 92.25 59.4
0. ]
Q = [2673.27 2673.27 2673.27 2673.27 2673.27 2673.27 2673.27 2673.27 2164.82
2016.24 500. ]
表2 风险与收益数据表(单位:元)
w | 0.0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1.0 |
---|---|---|---|---|---|---|---|---|---|---|---|
风险 | 247.52 | 247.52 | 247.52 | 247.52 | 247.52 | 247.52 | 247.52 | 247.52 | 92.25 | 59.4 | 0 |
收益 | 2673.27 | 2673.27 | 2673.27 | 2673.27 | 2673.27 | 2673.27 | 2673.27 | 2673.27 | 2164.82 | 2016.24 | 500 |
从以上数据可以看出,
当投资偏好系数 时,所对应的收益和风险均达到最大值。此时,收益为2673.27元,风险为247.52元,全部资金均用来购买资产 ;
当 由 增加到 时,收益和风险均呈下降趋势;
特别,当 时,收益和风险均达到最小值,收益为500元,风险为0元,此时应将所有资金全部存入银行。
进一步细化分析
为更好地描述收益和风险的对应关系,可将的取值进一步细化,只对0.7到1.0之间进行取值,对 按照 0.01的间隔进行计算,此时可得表4.10(部分结果),绘制收益和风险的函数关系图像如图4.3所示。
表3 风险与收益数据表(单位:元)
w | 0.766 | 0.767 | 0.810 | 0.811 | 0.824 | 0.825 | 0.962 | 0.963 | 1.0 |
---|---|---|---|---|---|---|---|---|---|
风险 | 247.52 | 92.25 | 95.25 | 78.49 | 78.49 | 59.4 | 59.4 | 0 | 0 |
收益 | 2673.27 | 2164.82 | 2164.82 | 2105.99 | 2105.99 | 2016.24 | 2016.24 | 500 | 500 |
从 表3 可以看出,投资的收益越大,风险也越大。投资者可以根据自己对风险喜好的不同,选择合适的投资方案。曲线的拐点坐标约为 (59.4,2016.24),此时对应的投资方案是购买资产 的资金分别为2375.84元、3959.73元、1079.93元、2284.46元和59.39元,存入银行的资金基本为0元(可以直接忽略),这对于风险和收益没有明显偏好的投资者是一个比较合适的选择。
w2 = np.array([0.7, 0.766, 0.767, 0.810, 0.811, 0.824, 0.825, 0.962, 0.963, 1.0])
X = LP(w2);
print(X[-3]); # 取拐点值0.962时的投资组合
plt.show()
w = [0.7 0.766 0.767 0.81 0.811 0.824 0.825 0.962 0.963 1. ]
V = [247.52 247.52 92.25 92.25 78.49 78.49 59.4 59.4 0. 0. ]
Q = [2673.27 2673.27 2164.82 2164.82 2105.99 2105.99 2016.24 2016.24 500.
500. ]
[4.54747351e-13 2.37583954e+03 3.95973257e+03 1.07992706e+03
2.28446110e+03 5.93959885e+01]
(本题选自1998年全国大学生数学建模竞赛A题)
进一步完成原题中,第2小问的求解,要求在第1问的基础上给出完整的解题过程。
市场上有 种资产(如股票、债券、……) 供投资者选择,某公司有数额为 的一笔相当大的资金可用作一个时期的投资。公司财务分析人员对这 种资产进行了评估,估算出在这一时期内购买资产 的平均收益率为 ,并预测出购买 的风险损失率为 。考虑到投资越分散,总的风险越小,公司确定,当用这笔资金购买若干种资产时,总体风险可用所投资的 中最大的一个风险来度量。
购买 要付交易费,费率为 ,并且当购买额不超过给定值 时,交易费按购买 计算(不买当然无须付费)。另外,假定同期银行存款利率是 ,且既无交易费又无风险。
1). 试给该公司设计一种投资组合方案,即用给定的资金 ,有选择地购买若干种资产或存银行生息,使净收益尽可能大,而总体风险尽可能小。已知 时的相关数据如表1所示。
表1 四种资产的相关数据
资产 | 平均收益率 | 风险损失率 | 交易费率 | 定值费 |
---|---|---|---|---|
(%) | (%) | (%) | (元) | |
28 | 2.5 | 1 | 103 | |
21 | 1.5 | 2 | 198 | |
23 | 5.5 | 4.5 | 52 | |
25 | 2.6 | 6.5 | 40 |
2). 试就一般情况对以上问题进行讨论,并利用 数据文件ex0412 中的数据进行计算。