金融学习之六——投资比例最优化求解

假设现在有一家投资机构拟投资如下股票组合(名字瞎编的),下表为股票组合及其相关的价格、预测投资收益和β值,若欲投资总额为1亿元,以当前收盘价进行投资,并要求整个组合的β值不超过1.4,并且不考虑卖空等情况,如何配置该投资组合的比例才能获得最大收益?

证券名称预测年化收益率当前收盘价β值
暴富之星34.9032%590.011.64
平安稳定15.5143%5.291.41
小富即安13.2796%26.671.21
随遇而安5.5905%6.501.06

对于这个问题,实际上可以转换为如下数学问题:
用w1,w2,w3,w4分别表示4支股票的投资比例,β1,β2,β3,β4分别表示4支股票的β值,r1,r2,r3,r4分别表示各股票的收益率(下面不是标准的数学公式写法,这个LaTeX文档暂时没研究,先简单代替一下)
(1)求解问题为
max(w1r1+w2r2+w3r3+w4r4)
(2)约束条件为
w1+w2+w3+w4=1
w1,w2,w3,w4>=0
w1β1+w2β2+w3β3+w4β4<=1.4
下面对这个问题用两种方法求解:
方法1:使用scipy模块中的optimize子模块的minimize函数求解,但这个函数时用于求最小值的,由于这个问题是求最大值,所以需要将原问题数据转换为负数进而求最小值。

import scipy.optimize as sci
import numpy as np
#p,r,b分别为价格,投资收益率和β值
p=np.array([590.01,5.29,26.27,6.50])
r=np.array([0.349032,0.155143,0.132796,0.055905])
b=np.array([1.64,1.41,1.21,1.06])

接下来要定义一个问题求解函数:

def f(w):
    w=np.array(w)
    return -np.sum(r*w)

定义好各个约束条件:
这里的tpye为eq表示是一个等式约束,ineq表示为不等式约束,需要用字典形式将约束条件封装,fun为约束条件。

cons=({'type':'eq','fun':lambda w:np.sum(w)-1},{'type':'ineq','fun':lambda w:1.4-np.sum(w*b)})
#以元组形式表示各比例的边界
bd=((0,1),(0,1),(0,1),(0,1))

接着计算最优解:

result=sci.minimize(f,[0.25,0.25,0.25,0.25],method='SLSQP',bounds=bd,constraints=cons)
result

结果为:
fun: -0.22804894822767985
jac: array([-0.349032, -0.155143, -0.132796, -0.055905])
message: ‘Optimization terminated successfully’
nfev: 20
nit: 4
njev: 4
status: 0
success: True
x: array([5.11920517e-01, 2.22044605e-16, 2.87240675e-01, 2.00838808e-01])
可以看到已成功求解,并得知最大收益率为0.228左右,最后的x即为各股的投资比例。
最后计算出每支股票的股票数量:

share=100000000*result['x']/p
#股票数量取整
share=share.round(0)
for i in range(len(share)):
    print(share[i])

结果为:
86765.0
0.0
1093417.0
3089828.0
这里有个美中不足的是,股票的数量不符合买卖的规则(必须是以100股为单位购买),我还没搞定,后面再研究一下。
再来看第二种方法,使用optimize模块的linpro线性规划算法

import scipy.optimize as sci
#需要优化的参数
c=[-0.349032,-0.155143,-0.132796,-0.055905]
#不等式对应参数矩阵
aub=[[1.64,1.41,1.21,1.06]]    #不等式左边参数,必须是二维
bub=[1.4]            #右边参数,必须是一维
#等式对应参数
beq=[[1,1,1,1]]     #等式左边参数,必须是二维
aeq=[1]             #右边参数,必须是一维
#各参数取值范围
w1=(0,1)
w2=(0,1)
w3=(0,1)
w4=(0,1)
sci.linprog(c, aub, bub, beq,aeq,bounds=[w1,w2,w3,w4])

结果为:
con: array([-1.25139952e-08])
fun: -0.22834213283397178
message: ‘Optimization terminated successfully.’
nit: 5
slack: array([-9.13409215e-09])
status: 0
success: True
x: array([4.41860420e-01, 6.82548764e-08, 5.58139523e-01, 1.43559815e-09])
与第一种方法有少许偏差,在最大收益上和配置比例上都有所不同。
将题目调整一下,如果要求的β值不允许超过1.2呢?

import scipy.optimize as sci
import numpy as np
p=np.array([590.01,5.29,26.27,6.50])
r=np.array([0.349032,0.155143,0.132796,0.055905])
b=np.array([1.64,1.41,1.21,1.06])
def f(w):
    w=np.array(w)
    return -np.sum(r*w)
cons=({'type':'eq','fun':lambda w:np.sum(w)-1},{'type':'ineq','fun':lambda w:1.2-np.sum(w*b)})
bd=((0,1),(0,1),(0,1),(0,1))
result=sci.minimize(f,[0.25,0.25,0.25,0.25],method='SLSQP',bounds=bd,constraints=cons)
result

结果为:
fun: -0.1270811963834308
jac: array([-0.349032, -0.155143, -0.132796, -0.055905])
message: ‘Optimization terminated successfully’
nfev: 20
nit: 4
njev: 4
status: 0
success: True
x: array([0.14068234, 0. , 0.3893616 , 0.46995605])
可以看到,两个β值较低的股票的持有率升高了,这也是比较合理的。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值