《测绘学报》
构建与学术的桥梁 拉近与权威的距离
公募债券与私募债券的区别
'''
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
fun:最优化的目标函数
x0:初始猜测值
method:优化方法,常用的方法有'BFGS','SLSQP'等
bounds:变量的边界值,元组形式
constraints:约束条件,字典形式({'type':'eq','fun':约束条件一},{'type':'ineq','fun':约束条件二}),'eq'表示等于0,'ineq'表示大于等于0
返回值
fun:目标函数值
sucess:布尔值,true成功
x:最优解
'''
# 求解最优权重
import scipy.optimize as sco
#定义一个最优化函数
def f(w):
w = np.array(w) #设置投资组合每只股票的权重
Rp_opt = np.sum(w*R_mean) #计算最优投资组合的预期收益率
Vp_opt = np.sqrt(np.dot(w,np.dot(R_cov,w.T))) #计算最优投资组合的收益波动率
return np.array([Rp_opt,Vp_opt])
def Vmin_f(w):
return f(w)[1] #返回f(w)函数结果的波动率
#输入最优解条件,预期收益设定10%
cons = ({'type':'eq','fun':lambda x:np.sum(x)-1},{'type':'eq','fun':lambda x:f(x)[0]-0.1})
#输入边界条件
bnds = tuple((0,1) for x in range(len(R_mean)))
#生成初始权重(平均分配)
frist_weight = len(R_mean)*[1/len(R_mean)]
#求最值
result = sco.minimize(Vmin_f,frist_weight,method='SLSQP',bounds=bnds,constraints=cons)
# 获取最优化结果的权重
result['x'].round(4)
for i in np.arange(len(R_cov)):
print('投资组合预期收益率10%时' + R_cov.columns[i] +'的权重:',result['x'][i].round(4))
#投资组合预期收益率10%时A的权重: 0.3109
#投资组合预期收益率10%时B的权重: 0.0859
#投资组合预期收益率10%时C的权重: 0.0
#投资组合预期收益率10%时D的权重: 0.5507
#投资组合预期收益率10%时E的权重: 0.0525