最优投资组合–马科维茨投资组合理论

最优投资组合–马科维茨投资组合理论代码已经过期 其中爬虫链接已经失效 一 马科维茨投资组合理论投资组合 Portfolio 是由投资人或金融机构所持有的股票 债券 衍生金融产品等组成的集合 投资组合的目的在于分散风险 投资组合按粗略的分类有三种不同的模式可供运用 即积极的 中庸的和保守的 投资组合理论 1 若干种证券组成的投资组合 其收益是这些证券收益的加权平均数 但是其风险不是这些证券风险的 代码已经过期 其中爬虫链接已经失效


<代码已经过期,其中爬虫链接已经失效>

一:马科维茨投资组合理论

投资组合(Portfolio)是由投资人或金融机构所持有的股票、债券、衍生金融产品等组成的集合。投资组合的目的在于分散风险,投资组合按粗略的分类有三种不同的模式可供运用,即积极的、中庸的和保守的。

投资组合理论[1]:若干种证券组成的投资组合,其收益是这些证券收益的加权平均数,但是其风险不是这些证券风险的加权平均风险,投资组合能降低非系统性风险。人们进行投资,本质上是在不确定性的收益和风险中进行选择。投资组合理论用均值-方差来刻画这两个关键因素。其中均值是指投资组合的期望收益率,它是单只证券的期望收益率的加权平均,权重为相应的投资比例。方差是指投资组合的收益率的方差。我们把收益率的标准差称为波动率,它刻画了投资组合的风险。

那么在证券投资决策中应该怎样选择收益和风险的组合呢?投资组合理论主要通过研究”理性投资者”优化投资组合。所谓理性投资者:是指在给定期望风险水平下对期望收益进行最大化,或者在给定期望收益水平下对期望风险进行最小化。

 

二:求解最优投资组合过程

本文最优投资组合思想是:在给定期望收益水平下对期望风险进行最小化的投资。利用的是马克维茨的均值-方差模型:

本文实现最优投资组合的主要步骤:

1:得到夏普比率最大时的期望收益

2:得到标准差最小时的期望收益

3:根据1,2所得的期望收益,获取预估期望收益范围,在预估期望收益范围内取不同值,获取其最小方差,得到预估期望收益与最小方差的关系即获得最小方差边界。

4:最小方差边界位于最小方差资产组合上方为有效边界

5;获取最小方差边界上最大夏普比率,绘出CML

6:得到最小方差边界上最大夏普比率处各股票权重

三:实证数据用例:

1:获取10股股票历史收盘价记录(2014.07.01—2017.07.01)(附件:stocks.xlsx)

stocks=[”, #兴业银行

        ”, #白云机场

        ”, #精准信息

        ”, #交通银行

        ”, #中国平安

        ”, #中设股份

        ‘000333’, #美的集团

        ”, #招商银行

        ”, #民生银行

        ”] #光大银行

 

1.1:股票历史收盘价趋势折线图如下:

最优投资组合--马科维茨投资组合理论

2:计算预期收益率:连续复利收益率即对数收益率(附件:stock_revs.xlsx)          

revs=np.log(data/data.shift(1))  

 

3: 用蒙特卡洛模拟产生大量随机组合,得到随机权重投资组合散点图如下:

最优投资组合--马科维茨投资组合理论

4:最优投资组合步骤:

4.1:得到夏普比率最大时的期望收益

def max_sharpe(weights):

return -getPortfolioInformation(weights)[2]

opts=sco.minimize(max_sharpe,numb * [1. / numb,], method=’SLSQP’,bounds=bnds, constraints=cons)

getPortfolioInformation(opts[‘x’]).round(4)   #opts[‘x’] : 得到夏普比率最大时的权重,收益率,标准差,夏普比率

#此时权重:[ 3.e-01 5.00e-02  8.e-02  0.00000000e+00  5.e-01  0.00000000e+00  0.00000000e+00  0.00000000e+00

0.00000000e+00   5.e-16]

# [收益率= 0.478  标准差=0.251  夏普比率=1.904]

 

4.2: minimize:优化,最小化风险:方差最小化

def min_variance(weights):

    return getPortfolioInformation(weights)[1]  2

optv=sco.minimize(min_variance, numb * [1. / numb,],method=’SLSQP’, bounds=bnds,constraints=cons)

#此时权重:[ 1.e-01  1.00e-01  1.0e-01  4.0e-02   4.e-02  0.00000000e+00  0.00000000e+00  9.e-18   5.e-01  1.e-17]

# [收益率= 0.309  标准差= 0.22  夏普比率=1.405]

 

4.3:获取有效边界

4.3.1:获取最小方差边界曲线图,最小方差资产组合,随机组合散点图:

指定收益率范围 [0.1545, 0.5736 ],求最小方差:

def min_sd(weights):

    return getPortfolioInformation(weights)[1]

tvols = []

infor_min_sd=[]

#获取在指定期望收益下的最小标准差:

for tret in trets:

    cons = ({‘type’: ‘eq’, ‘fun’: lambda x:  getPortfolioInformation(x)[0] – tret},

            {‘type’: ‘eq’, ‘fun’: lambda x:  np.sum(x)-1})

    res = sco.minimize(min_sd, numb * [1. / numb,], method=’SLSQP’,bounds=bnds, constraints=cons)

    infor_min_sd.append(res)  # tret 唯一的

    tvols.append(res[‘fun’])  #获取函数返回值,即最小标准差

 

tvols = np.array(tvols) 

ind_min_sd = np.argmin(tvols)   #最小方差组合处进行划分,分两段

evols = tvols[:ind_min_sd] 

erets = trets[:ind_min_sd]

tck = sci.splrep(erets,evols )  #B-Spline样条曲线函数 #前一个必须是唯一

y2 = np.linspace(np.min(erets), np.max(erets), 100)

x2 = sci.splev(y2, tck) 

 

evols = tvols[ind_min_sd:] 

erets = trets[ind_min_sd:]

tck = sci.splrep(evols, erets)   

x3 = np.linspace(np.min(evols), np.max(evols), 100)

y3 = sci.splev(x3, tck) 

 

plt.figure(figsize=(10, 8))

plt.scatter(pvols, prets, c=prets/pvols,s=5, marker=’.’)

plt.plot(x2, y2,’g’,label=u”最小方差边界”)

plt.plot(x3, y3,’g’,label=u”最小方差边界”)

plt.axhline(y=rev_min_variance,color=’b’,label=u”最小方差资产组合”) #最小方差资产组合

plt.plot(getPortfolioInformation(opts[‘x’])[1], getPortfolioInformation(opts[‘x’])[0],’r*’, markersize=5.0)#最大夏普比率

plt.plot(getPortfolioInformation(optv[‘x’])[1], getPortfolioInformation(optv[‘x’])[0],’y*’, markersize=5.0)#最小方差

plt.grid(True)

plt.xlabel(‘Expect Volatility’)

plt.ylabel(‘Expect Return’)        

plt.show()

 

结果显示如下

最优投资组合--马科维茨投资组合理论

4.3.2:获取有效边界曲线图:

plt.figure(figsize=(10, 8))

plt.scatter(pvols, prets, c=prets/pvols,s=5, marker=’.’)

plt.plot(x3, y3,’g’,label=u”有效边界”)

plt.plot(getPortfolioInformation(opts[‘x’])[1], getPortfolioInformation(opts[‘x’])[0],’r*’, markersize=8.0)#最大夏普比率

plt.plot(getPortfolioInformation(optv[‘x’])[1], getPortfolioInformation(optv[‘x’])[0],’y*’, markersize=8.0)#最小方差

plt.grid(True)

plt.xlabel(‘Expect Volatility’)

plt.ylabel(‘Expect Return’)         

plt.show()

 最优投资组合--马科维茨投资组合理论

5: 获取最小方差边界上最大夏普比率,绘出CML

5.1: B-Spline样条曲线的参数

tck = sci.splrep(evols, erets) 

5.2: B-Spline样条曲线函数

def f(x):

    return sci.splev(x, tck, der=0)

5.3: B-Spline样条曲线函数一阶导数

def df(x):

    return sci.splev(x, tck, der=1)

 

5.4: 构造非线性函数,使函数fun(x)无限逼近0向量, risk_free_return:无风险收益,默认为0.00

def fun(x, risk_free_return=0.00):

    e1 = risk_free_return – x[0]

    e2 = risk_free_return + x[1] * x[2] – f(x[2])

    e3 = x[1] – df(x[2])

    return e1, e2, e3

5.5 利用最小二乘法 无限逼近0, 无风险收益率:0,斜率:0.5,初始自变量:zone

X = sco.fsolve(fun, [0.00, 0.50, zone])

plt.figure(figsize=(12, 6))

#圆点为随机资产组合

plt.scatter(pvols, prets,c=prets/ pvols,s=5, marker=’.’)#随机组合散点集

plt.plot(x3, y3,’g’,label=u”有效边界”)

plt.plot(getPortfolioInformation(opts[‘x’])[1], getPortfolioInformation(opts[‘x’])[0],’g*’, markersize=5.0)#最大夏普比率

plt.plot(getPortfolioInformation(optv[‘x’])[1], getPortfolioInformation(optv[‘x’])[0],’y*’, markersize=5.0)#最小方差

#设定资本市场线CML的x范围从0到1.5最大夏普利率时标准差值           

x = np.linspace(0.0, 1.5*zone)

#带入公式a+b*x求得y,作图

plt.plot(x, X[0] + X[1] * x, lw=1.5)

#标出资本市场线与有效边界的切点,绿星处            

plt.plot(X[2], f(X[2]), ‘r*’, markersize=5.0) 

plt.grid(True)

plt.axhline(0, color=’k’, ls=’–‘, lw=2.0)

plt.axvline(0, color=’k’, ls=’–‘, lw=2.0)

plt.xlabel(‘expected volatility’)

plt.ylabel(‘expected return’)

plt.colorbar(label=’Sharpe ratio’)

plt.show() 

#最大夏普比率点: (0.2 ,0.8)      

#切点:           (0.7, 0.75755)

 

结果图如下:

最优投资组合--马科维茨投资组合理论

6: 得到最小方差边界上最大夏普比率处各股票权重:

根据收益率差绝对值最小选取权重进行投资:    

rev_result=f(X[2])

flag=0

temp=abs(trets[0]-rev_result)

length=len(trets)

for i in range(1,length):

    if abs(trets[i]-rev_result)

        temp=trets[i]-rev_result

        flag=i

 

weight_result=infor_min_sd[flag][‘x’]    

all=0   #最终为 1.0

for i in range(10):

    all=all+weight_result[i]

    print(‘{:.5f}’.format(weight_result[i])) 

# weight_result=[ 0.00000  0.04802  #白云机场

0.00000  0.85880  #交通银行  0.00000  0.00000  0.00000  0.00000  0.09318  #民生银行  0.00000 ]   

 

故最终投资股票是:

0.04802  #白云机场

0.85880  #交通银行

0.09318  #民生银行

 

转载于:https://www.cnblogs.com/laoketeng/p/11268677.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214501.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:07
下一篇 2026年3月18日 下午4:07


相关推荐

  • 第五届中国(北京)国际智能家居产业博览会

    第五届中国(北京)国际智能家居产业博览会展出范围:  1、智能家居,影音娱乐及小区管理系统:包括智能家居控制系统、可视对讲系统、智能灯光控制、家庭智能安防及报警呼救系统、背景音乐系统、家庭娱乐系统、智能家居集成产品、酒店智能化产品、酒店客房智能控制系统、酒店智能管理系统,移动互联终端、智能门窗产品、智能抄表系统、智能家电产品、家庭网络产品、小区物业管理系统,影音视讯系统,音视频系统、广播会议系统、多媒体信息发…

    2022年6月22日
    30
  • 判断凸包

    判断凸包下面以 hdu2108 为例 说明一下判断凸包的算法

    2026年3月17日
    2
  • android之List<T>的空指针问题_List的初始化

    在使用list做东西的时候出现空指针,查了半天资料本来是这样的 List model; LunchListAdapter adapter;//这是我重写的适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setC

    2022年3月10日
    250
  • javascript 页面后退并刷新

    javascript 页面后退并刷新javascript做页面后退常使用的方法是window.history.back();这样确实可以做到后退的功能,但是项目中,常常并不只是后退就行完成需求,往往需要在后退的同时,刷新后退的页面信息,比如后退到首页同时刷新首页的最新数据,这样的需求通过上面这种方法就没法满足了,为了实现这个需求,我们需要使用到document.referrer这个方法可以取到上一个页面的具体路径

    2022年7月25日
    13
  • 新浪免费天气Api简单使用说明

    新浪免费天气Api简单使用说明下面开始说说新浪这个 Api 示例地址为 nbsp http php weather sina com cn xml php city C4 CF B2 FD amp password DJOYnieT8234 amp day 0 其中的 password 是固定的 不要更改 nbsp city 为你要获取的城市 这里是获取南昌的天气 南昌对应的 gb2312 的编码为 C4 CF B2 FD 在 Java 中转化编

    2026年3月26日
    3
  • echarts图表在Tab页中width: 100%失效导致的第一个Tab页之后的Tab页图表不能正常显示的问题

    echarts图表在Tab页中width: 100%失效导致的第一个Tab页之后的Tab页图表不能正常显示的问题

    2021年11月22日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号