ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pyhon非线性规划最优资产组合

2021-04-10 12:32:08  阅读:288  来源: 互联网

标签:return pyhon 非线性 list weights ex np ratio 最优


pyhon非线性规划最优资产组合

数据集格式csv

import pandas as pd
import numpy as np
from pylab import mpl,plt

plt.style.use('seaborn')
mpl.rcParams['font.family']='serif'
pd.set_option('display.width', None)  # 设置字符显示宽度
pd.set_option('display.max_rows', 50)  # 设置显示最大行


filename='tr_eikon_eod_data.csv'
data=pd.read_csv(filename,index_col=0,parse_dates=True)
#print(data)
symbols=["AAPL.O",  "MSFT.O" ,"AMZN.O"  ,"GDX" , "GLD"]
noa=len(symbols)
data=pd.DataFrame(data[symbols]).dropna()
#(data/data.ix[0]*100).plot()#价格变动


rets=np.log(data/data.shift(1))#日对数收益率
# print(rets.cov()*252)
# rets["AAPL.O"].plot.hist(bins=70)
# plt.show()


# 蒙特卡洛计算出可行性边界————————————————————方法一
ex_return_ratio_list=[]
ex_var_list=[]
ex_sharpe_list=[]
N=2500
for j in range(N):
    weights = np.random.random(noa)
    weights /= np.sum(weights)
    ex_return_ratio = np.sum(rets.mean() * weights) * 252
    ex_var = np.dot(weights.T, np.dot(rets.cov() * 252, weights))#dot表示向量点积或是矩阵乘法   T表示转置
    ex_return_ratio_list.append(ex_return_ratio)
    ex_var_list.append(ex_var)
    ex_sharpe_list.append(ex_return_ratio/np.sqrt(ex_var))

ex_return_ratio_list=np.array(ex_return_ratio_list)
ex_var_list=np.array(ex_var_list)
ex_std_list=np.sqrt(ex_var_list)
# plt.scatter(x=ex_std_list,y=ex_return_ratio_list,c=ex_sharpe_list,cmap='coolwarm')
# plt.show()

# 非线性约束规划————————————————————方法二
import scipy.optimize as sco
def get_ex_return_ratio(weights):
    return np.sum(rets.mean() * weights) * 252
def get_ex_std(weights):
    return np.sqrt(np.dot(weights.T, np.dot(rets.cov() * 252, weights)))
def min_func_sharpe(weights):#(带无风险投资)
    # e_f = 0.05
    # std_f = 0
    return -(get_ex_return_ratio(weights)-e_f)/(get_ex_std(weights)-std_f)
e_f = 0.05
std_f = 0

# 非线性约束规划计算最大夏普
cons=({'type':'eq','fun':lambda x: np.sum(x)-1})#等式约束
bnds=tuple((0,1) for x in range(noa))#参数范围
eweights=np.array(noa*[1./noa])# 等权重向量
opts=sco.minimize(min_func_sharpe,eweights,method='SLSQP',bounds=bnds,constraints=cons)#最优化函数
print(opts)# x表示最优情况下权重weights的array
print(get_ex_return_ratio(opts['x']),get_ex_std(opts['x']))
plt.plot(get_ex_std(opts['x']),get_ex_return_ratio(opts['x']),'ys',std_f,e_f,'bs')
t=np.linspace(-0.05,0.3,50)
plt.plot(t,-1*t*(min_func_sharpe(opts['x']))+e_f)

#有效边界——给定收益率时最小化方差的投资组合——最优投资组合
trets=np.linspace(0,0.25,80)
tvols=[]
weights = np.random.random(noa)
weights /= np.sum(weights)
for tret in trets:

    cons=({'type':'eq','fun':lambda x: get_ex_return_ratio(x)-tret},{'type':'eq','fun':lambda x: np.sum(x)-1})#等式约束
    bnds=tuple((0,1) for x in range(noa))
    eweights = np.array(noa * [1. / noa])
    res = sco.minimize(get_ex_std, eweights, method='SLSQP', bounds=bnds, constraints=cons)
    tvols.append(res['fun'])

tvols=np.array(tvols)

plt.scatter(x=ex_std_list,y=ex_return_ratio_list,c=ex_sharpe_list,cmap='coolwarm')
plt.plot(tvols,trets)
plt.show()

最优组合以及可行性边界

在这里插入图片描述

标签:return,pyhon,非线性,list,weights,ex,np,ratio,最优
来源: https://blog.csdn.net/xic18/article/details/115570465

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有