投资的收益与风险
例 1.9(本题选自1998年全国大学生数学建模竞赛A题)
市场上有n种资产(如股票、债券等) S i ( i = 1 , 2 , ⋯ , n ) S_i (i = 1, 2, \cdots, n) Si(i=1,2,⋯,n) 供投资者选取,某公司有数额为 M M M 的一笔相当大的资金可用作一个时期的投资。公司财务分析人员对这 n n n 种资产进行了评估,估算出在这一时期内购买资产 S i S_i Si 的平均收益率为 r i r_i ri ,并预测出购买 S i S_i Si 的风险损失率为 q i q_i qi 。考虑到投资越分散,总的风险越小,公司确定,当用这笔资金购买若干种资产时,总体风险可用所投资的 S i S_i Si 中最大的一个风险来度量。
购买 S i S_i Si 要付交易费,费率为 p i p_i pi ,并且当购买额不超过给定值 u i u_i ui 时,交易额按购买 u i u_i ui 计算(不买当然无须付费)。另外,假定同期银行存款率是 r 0 r_0 r0 ( r 0 = 5 % r_0 = 5\% r0=5%),且既无交易费有无风险。
已知 n = 4 n = 4 n=4 时的相关数据如表所示。
s i s_i si | r i / % r_i/\% ri/% | q i / % q_i /\% qi/% | p i / % p_i /\% pi/% | u i / 元 u_i/元 ui/元 |
---|---|---|---|---|
s 1 s_1 s1 | 28 | 2.5 | 1 | 103 |
s 2 s_2 s2 | 21 | 1.5 | 2 | 198 |
s 3 s_3 s3 | 23 | 5.5 | 4.5 | 52 |
s 4 s_4 s4 | 25 | 2.6 | 6.5 | 40 |
试给该公司设计一种投资组合方案,即用给定的资金 M M M ,有选择地购买若干种资产或存银行生息,使净收益尽可能大,总体风险尽可能小。
1.问题分析
这是一个组合投资问题:已知市场上可供投资的 n + 1 n + 1 n+1 种资产的平均收益率以及购买资产时产生的交易费用率,设计一种投资组合方案,也就是要将可供投资的资金分成数量不等的 n + 1 n + 1 n+1 份分别购买 n + 1 n + 1 n+1 种资产。不同类型的资产的平均收益率和风险损失率也各不相同,因此在投资时,要同时兼顾两个目标:投资的净收益和风险。
2.符号说明
S i : 可 供 投 资 的 第 i 种 资 产 , i = 0 , 1 , 2 , ⋯ , n , 其 中 S 0 表 示 存 到 银 行 ; x i : 投 资 到 资 产 S i 的 资 金 数 量 , i = 0 , 1 , 2 , ⋯ , n , 其 中 x 0 表 示 存 到 银 行 的 资 金 数 量 ; r i : 资 产 S i 的 平 均 收 益 率 , i = 0 , 1 , 2 , ⋯ , n ; q i : 资 产 S i 的 风 险 损 失 率 , i = 0 , 1 , 2 , ⋯ , n , 其 中 q 0 = 0 ; p i : 资 产 S i 的 交 易 费 用 率 , i = 0 , 1 , 2 , ⋯ , n , 其 中 p 0 = 0 ; u i : 资 产 S i 的 投 资 阈 值 , i = 0 , 1 , 2 , ⋯ , n 。 \begin{aligned} & S_i:可供投资的第i种资产,i = 0, 1, 2, \cdots,n,其中 S_0 表示存到银行; \\ & x_i:投资到资产 S_i 的资金数量,i = 0, 1, 2, \cdots,n,其中 x_0 表示存到银行的资金数量; \\ & r_i:资产S_i的平均收益率,i = 0, 1, 2, \cdots,n;\\ & q_i:资产S_i的风险损失率,i = 0, 1, 2, \cdots,n,其中q_0 = 0;\\ & p_i:资产S_i的交易费用率,i = 0, 1, 2, \cdots,n,其中p_0 = 0;\\ & u_i:资产S_i的投资阈值,i = 0, 1, 2, \cdots,n。\\ \end{aligned} Si:可供投资的第i种资产,i=0,1,2,⋯,n,其中S0表示存到银行;xi:投资到资产Si的资金数量,i=0,1,2,⋯,n,其中x0表示存到银行的资金数量;ri:资产Si的平均收益率,i=0,1,2,⋯,n;qi:资产Si的风险损失率,i=0,1,2,⋯,n,其中q0=0;pi:资产Si的交易费用率,i=0,1,2,⋯,n,其中p0=0;ui:资产Si的投资阈值,i=0,1,2,⋯,n。
3.模型假设
- 可供投资的资金数额 M M M 相当大。
- 投资越分散,总的风险越小,总体风险可用所投资的 S i S_i Si 中最大的一个风险来度量。
- 可供选择的 n + 1 n + 1 n+1种资产(含银行存款)之间是相互独立的。
- 每种资产可购买的数量为任意值。
- 在当前投资周期内, r i , q i , p i , u i ( i = 0 , 1 , ⋯ , n ) r_i,q_i,p_i,u_i(i = 0, 1, \cdots, n) ri,qi,pi,ui(i=0,1,⋯,n)固定不变。
- 不考虑在资产交易过程中产生的其他费用,如股票交易印花税等。
4.模型建立
(1)总体风险用所投资的 S i S_i Si 中最大的一个风险来衡量,即
max { q i x i ∣ i = 1 , 2 , ⋯ , n } . \max \{ q_ix_i | i = 1,2, \cdots, n \}. max{
qixi∣i=1,2,⋯,n}.
(2)购买 S i ( i = 1 , 2 , ⋯ , n ) S_i(i = 1,2,\cdots,n) Si(i=1,2,⋯,n)所付交易费是一个分段函数,即
交 易 费 = { p i x i , x i > u i , p i u i , 0 ≤ x i ≤ u i . 交易费 = \left\{ \begin{array}{rcl} \begin{aligned} & p_ix_i,x_i > u_i,\\ & p_iu_i, 0 \leq x_i \leq u_i.\\ \end{aligned} \end{array} \right. 交易费={
pixi,xi>ui,piui,0≤xi≤ui.
而题目中给定的定值 u i u_i ui (单位:元)相对于总投资 M M M 很少, p i u i p_iu_i piui 更小,这样购买 S i S_i Si 的净收益可以简化为 ( r i − p i ) x i (r_i - p_i)x_i (ri−pi)xi 。
要使净收益尽可能大,总体风险尽可能小,这是一个多目标规划模型。
目标函数为
{ max ∑ i = 0 n ( r i − p i ) x i , min { max 1 ≤ i ≤ n { q i x i } } . \left\{ \begin{array}{rcl} \begin{aligned} & \max \sum_{i = 0}^n (r_i - p_i) x_i, \\ & \min \{ \quad \max_{1 \leq i \leq n} \{ q_i x_i\} \quad\}. \end{aligned} \end{array} \right. ⎩⎪⎪⎨⎪⎪⎧maxi=0∑n(ri−pi)xi,min{
1≤i≤nmax{
qixi}}.
约束条件为
{ ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \begin{cases} \sum_{i = 0}^n (1 + p_i) x_i = M ,\\ x_i \geq 0, i = 0,1, \cdots, n.\\ \end{cases} {
∑i=0n(1+pi)xi=M,xi≥0,i=0,1,⋯,n.
模型简化:
① 在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 a a a ,使最大的一个风险 q i x i M ≤ a \displaystyle\frac{q_ix_i}{M} \leq a Mqixi≤a,则可找到相应的投资方案
模型一:固定风险水平,优化收益
max ∑ i = 0 n ( r i − p i ) x i , s . t . { q i x i M ≤ a , i = 1 , 2 , ⋯ , n , ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \max \sum_{i = 0}^n (r_i - p_i)x_i, \\ ~\\~\\ s. t. \begin{cases} & \displaystyle\frac{q_i x_i}{M} \leq a, & i = 1,2, \cdots, n,\\ ~\\ & \sum_{i = 0}^n (1 + p_i) x_i = M,\\ ~\\ & x_i \geq 0, &i = 0,1, \cdots, n.\\ \end{cases} maxi=0∑n(ri−pi)xi, s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ Mqixi≤a,∑i=0n(1+pi)xi=M,xi≥0,i=1,2,⋯,n,i=0,1,⋯,n.
② 若投资者希望总盈利至少达到水平 k k k 以上,在风险最小的情况小寻求相应的投资组合。
模型二:固定盈利水平,极小化风险
min { max 1 ≤ i ≤ n { q i x i } } , s . t . { ∑ i = 0 n ( r i − p i ) x i ≥ k i M , ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \min \{ \quad \max_{1 \leq i \leq n} \{ q_i x_i\} \quad\},\\ ~\\ s. t. \begin{cases} & \sum_{i = 0}^n (r_i - p_i) x_i \geq k_i M,\\ ~\\ & \sum_{i = 0}^n (1 + p_i) x_i = M,\\ ~\\ & x_i \geq 0, &i = 0,1, \cdots, n.\\ \end{cases} min{
1≤i≤nmax{
qixi}}, s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ ∑i=0n(ri−pi)xi≥kiM,∑i=0n(1+pi)xi=M,xi≥0,i=0,1,⋯,n.
③ 投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资组合。因此对风险。收益分别赋予权重 w ( 0 ≤ w ≤ 1 ) w( 0 \leq w \leq 1) w(0≤w≤1) 和 ( 1 − w ) (1 - w) (1−w), w w w 称为投资偏好系数。
模型三:两个目标函数加权求和
min w { max 1 ≤ i ≤ n { q i x i } } − ( 1 − w ) ∑ i = 0 n ( r i − p i ) x i , s . t . { ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \min \quad w\{ \max_{1 \leq i \leq n} \{ q_i x_i\} \} - (1 - w)\sum_{i = 0}^n (r_i - p_i) x_i ,\\ ~\\ s. t. \begin{cases} & \sum_{i = 0}^n (1 + p_i) x_i = M,\\ ~\\ & x_i \geq 0, &i = 0,1, \cdots, n.\\ \end{cases} minw{ 1≤i≤nmax{ qixi}}−(1−w)i=0∑n(ri−pi)xi, s.t.⎩⎪⎨⎪⎧ ∑i=0n(1+pi)xi=M,xi≥0,i=0,1,⋯,n.
5.模型的求解与分析(含python、matlab代码)
不妨设 M = 10000 M = 10000 M=10000 元。
模型一
模型一为
max f = [ 0.05 , 0.27 , 0.19 , 0.185 , 0.185 ] ⋅ [ x 0 , x 1 , x 2 , x 3 , x 4 ] T , s . t . { x 0 + 1.01 x 1 + 1.02 x 2 + 1.045 x 3 + 1.065 x 4 = M , 0.025 x 1 ≤ a M , 0.015 x 2 ≤ a M , 0.055 x 3 ≤ a M , 0.026 x 4 ≤ a M , x i ≥ 0 ( i = 0 , 1 , 2 , ⋯ , 4 ) . \max f = [0.05, 0.27, 0.19, 0.185, 0.185] \cdot [x_0,x_1,x_2,x_3,x_4]^T, \\ s. t. \begin{cases} & x_0 + 1.01x_1 + 1.02x_2 + 1.045x_3 + 1.065x_4 = M, \\ & 0.025x_1 \leq aM, \\ & 0.015x_2 \leq aM, \\ & 0.055x_3 \leq aM, \\ & 0.026x_4 \leq aM, \\ & x_i \geq 0(i = 0,1,2, \cdots ,4). \end{cases} maxf=[0.05,0.27,0.19,0.185,0.185]⋅[x0,x1,x2,x3,x4]T,s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧x0+1.01x1+1.02x2+1.045x3+1.065x4=M,0.025x1≤aM,0.015x2≤aM,0.055x3≤aM,0.026x4≤aM,xi≥0(i=0,1,2,⋯,4).
matlab程序:
prob = optimproblem('ObjectiveSense', 'max');
x = optimvar('x', 5, 1, 'LowerBound', 0);
c = [0.05,0.27,0.19,0.185,0.185];
Aeq = [1,1.01, 1.02, 1.045, 1.065]; %等号约束矩阵
prob.Objective = c * x; M = 10000;
prob.Constraints.con1 = Aeq * x == M;
q = [0.025,0.015, 0.055,0.026]';
a =0;aa = [];QQ=[];XX=[];
hold on
while a<0.05
prob.Constraints.con2 = q.*x(2:end) <= a*M;
[sol,Q,flag,out] = solve(prob)
aa = [aa;a];QQ=[QQ,Q];
XX=[XX;sol.x'];a=a+0.001;
end
plot(aa, QQ, '*k')
xlabel('$a$','Interpreter','Latex')
ylabel('$a$','Interpreter','Latex', 'Rotation', 0)
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
c = np.array([0.05, 0.27, 0.19, 0.185, 0.185])
A = np.array([
[0, 0.025, 0, 0, 0],
[0, 0, 0.015, 0, 0],
[0, 0, 0, 0.055, 0],
[0, 0, 0, 0, 0.026]
])
a = 0
M = 10000
b = np.array([M, M, M, M])
Aeq = np.array([[1, 1.01, 1.02, 1.045, 1.065]])
Beq = np.array([M])
Q_history = []
a_history = []
while a < 0.05:
res = optimize.linprog(-c, A_ub=A, b_ub=a * b, A_eq=Aeq, b_eq=Beq, bounds=([0, None]), method='revised simplex')
a_history.append(a)
Q_history.append(-res.fun)
a = a + 0.001
plt.scatter(a_history, Q_history)
plt.show()
模型二
模型二为
min { max 1 ≤ i ≤ n { q i x i } } , s . t . { ∑ i = 0 n ( r i − p i ) x i ≥ k i M , ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \min \{ \quad \max_{1 \leq i \leq n} \{ q_i x_i\} \quad\},\\ ~\\ s. t. \begin{cases} & \sum_{i = 0}^n (r_i - p_i) x_i \geq k_i M,\\ ~\\ & \sum_{i = 0}^n (1 + p_i) x_i = M,\\ ~\\ & x_i \geq 0, &i = 0,1, \cdots, n.\\ \end{cases} min{
1≤i≤nmax{
qixi}}, s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ ∑i=0n(ri−pi)xi≥kiM,∑i=0n(1+pi)xi=M,xi≥0,i=0,1,⋯,n.
在具体求解时,需要将目标函数具体化,引进变量 x n + 1 = max 1 ≤ i ≤ n { q x x i } x_{n+1} = \max_{1 \leq i \leq n} \{ q_x x_i\} xn+1=max1≤i≤n{
qxxi} ,则模型可线性化为
min x n + 1 , s . t . { q i x i ≤ x n + 1 , ∑ i = 0 n ( r i − p i ) x i ≥ k i M , ∑ i = 0 n ( 1 + p i ) x i = M , x i ≥ 0 , i = 0 , 1 , ⋯ , n . \min x_{n+1},\\ ~\\ s. t. \begin{cases} & q_i x_i \leq x_{n+1,}\\ ~\\ & \sum_{i = 0}^n (r_i - p_i) x_i \geq k_i M,\\ ~\\ & \sum_{i = 0}^n (1 + p_i) x_i = M,\\ ~\\ & x_i \geq 0, &i = 0,1, \cdots, n.\\ \end{cases} minxn+1, s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧ qixi≤xn+1,∑i=0n(ri−pi)xi≥kiM,∑i=0n(1+pi)xi=M,xi≥0,i=0,1,⋯,n.
python代码
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
c = np.array([0, 0, 0, 0, 0, 1])
r_i = np.array([0.05, 0.28, 0.21, 0.23, 0.25, 0])
p_i = np.array([0, 0.01, 0.02, 0.045, 0.065, 0])
M = 10000
k = 0
A = np.array([
[-0.05, -0.27, -0.19, -0.185, -0.185, 0],
[0, 0, 0, 0, 0, -1],
[0, 0.025, 0, 0, 0, -1],
[0, 0, 0.015, 0, 0, -1],
[0, 0, 0, 0.055, 0, -1],
[0, 0, 0, 0, 0.026, -1]
])
b = np.array([-M, 0, 0, 0, 0, 0])
Aeq = np.array([[1, 1.01, 1.02, 1.045, 1.065, 0]])
Beq = np.array([M])
while k < 0.3:
res = optimize.linprog(c, A_ub=A, b_ub=k * b, A_eq=Aeq, b_eq=Beq, bounds=([0, None]), method='revised simplex')
k = k + 0.001
就提供一下求解的部分,分析的自己写写看吧。
模型三就是将模型一二综合起来,就不写了。