Python对5支股票的投资组合进行分析

您所在的位置:网站首页 万科的股票代码是多少 Python对5支股票的投资组合进行分析

Python对5支股票的投资组合进行分析

2024-07-02 17:33:03| 来源: 网络整理| 查看: 265

三、投资组合的相关性分析

1、投资组合的相关矩阵

相关矩阵用于估算多支股票收益之间的线性关系,可使用pandas数据框内建的 .corr()方法来计算。

# 计算相关矩阵 correlation_matrix = stock_return.corr() # 输出相关矩阵 print('****************************************************************') print(correlation_matrix)

矩阵中每一个元素都是其对应股票的相关系数,取值从-1到1,正数代表正相关,负数代表负相关。

我们观察到矩阵的对角线永远是1,因为自己和自己当然是完全相关的。另外相关矩阵也是对称的,即上三角和下三角呈镜像对称。

为了便于观察,可以将数值的相关矩阵用热图的形式展现出来。以下采用了 seaborn 包来绘制热图。

import seaborn as sns #创建热图 sns.heatmap(correlation_matrix,annot=True,cmap='rainbow',linewidths=1.0,annot_kws={'size':8}) plt.xticks(rotation=0) plt.yticks(rotation=75) plt.show()

 

2、投资组合的协方差矩阵

相关系数只反应了股票之间的线性关系,但并不能告诉我们股票的波动情况,而协方差矩阵则包含这一信息。可使用pandas数据框内建的 .cov() 方法来计算协方差矩阵。

# 计算协方差矩阵 cov_mat = stock_return.cov() # 年化协方差矩阵 cov_mat_annual = cov_mat * 252 # 输出协方差矩阵 # print('****************************************************************') print(cov_mat_annual)

3、投资组合的标准差

投资组合的风险可以用标准差来衡量,只要知道组合权重和协方差矩阵,就可以通过以下公式进行计算。

在NumPy中,使用.T属性对数组进行转置,np.dot()函数用于计算两个数组的点积。

# 设置组合权重,存储为numpy数组类型 portfolio_weights = np.array([0.32, 0.15, 0.10, 0.18, 0.25]) # 计算投资组合的标准差 portfolio_volatility = np.sqrt(np.dot(portfolio_weights.T, np.dot(cov_mat_annual, portfolio_weights))) print('****************************************************************') print(portfolio_volatility)

四、探索股票的最优投资组合

应该选择怎样的组合权重才是最好的呢?是让收益最大吗?还是风险最小?我们需要综合权衡风险和收益这两个因素。

诺贝尔经济学奖得主马科维茨(Markowitz)提出的投资组合理论被广泛用于组合选择和资产配置中。该理论中的均值-方差分析法和有效边界模型可用于寻找最优的投资组合。

1、使用蒙特卡洛模拟Markowitz模型

采用蒙特卡洛模拟来进行分析,也就是随机生成一组权重,计算该组合下的收益和标准差,重复这一过程许多次(比如1万次),将每一种组合的收益和标准差绘制成散点图。

# 设置模拟的次数 number = 10000 # 设置空的numpy数组,用于存储每次模拟得到的权重、收益率和标准差 random_p = np.empty((number, 7)) # 设置随机数种子,这里是为了结果可重复 np.random.seed(7) # 循环模拟10000次随机的投资组合 for i in range(number): # 生成5个随机数,并归一化,得到一组随机的权重数据 random5 = np.random.random(5) random_weight = random5 / np.sum(random5) # 计算年平均收益率 mean_return = stock_return.mul(random_weight, axis=1).sum(axis=1).mean() annual_return = (1 + mean_return) ** 252 - 1 # 计算年化标准差,也成为波动率 random_volatility = np.sqrt(np.dot(random_weight.T, np.dot(cov_mat_annual, random_weight))) # 将上面生成的权重,和计算得到的收益率、标准差存入数组random_p中 random_p[i][:5] = random_weight random_p[i][5] = annual_return random_p[i][6] = random_volatility # 将Numpy数组转化为DataF数据框 RandomPortfolios = pd.DataFrame(random_p) # 设置数据框RandomPortfolios每一列的名称 RandomPortfolios.columns = [ticker + '_weight' for ticker in ticker_list] + ['Returns', 'Volatility'] # 绘制散点图 RandomPortfolios.plot('Volatility', 'Returns', kind='scatter', alpha=0.3) plt.show()

投资的本质是在风险和收益之间做出选择,上图正是刻画了这两个要素。其中每一个点都代表着一种投资组合的情况,横坐标是代表风险的标准差,纵坐标是收益率。

Markowitz投资组合理论认为,理性的投资者总是在给定风险水平下对期望收益进行最大化,或者是在给定收益水平下对期望风险做最小化。反映在图中也就是红色曲线所示的有效边界,只有在有效边界上的点才是最有效的投资组合。

现在我们知道,理性的投资者都会选择有效边界上的投资组合。可具体选择哪个点呢?接着往下看。

2、投资风险最小组合

一种策略是选择最低的风险,且在该风险水平下收益最高的组合,称为最小风险组合(GMV portfolio)。

让我们找到风险最小的组合,并绘制在代表收益-风险的散点图中。

# 找到标准差最小数据的索引值 min_index = RandomPortfolios.Volatility.idxmin() # 在收益-风险散点图中突出风险最小的点 RandomPortfolios.plot('Volatility', 'Returns', kind='scatter', alpha=0.3) x = RandomPortfolios.loc[min_index, 'Volatility'] y = RandomPortfolios.loc[min_index, 'Returns'] # plt.scatter(x, y, color='red') # 将该点坐标显示在图中并保留四位小数 # plt.text(np.round(x, 4), np.round(y, 4), (np.round(x, 4), np.round(y, 4)), ha='left', va='bottom', fontsize=10) plt.show()

获取风险最小组合的权重如下:

# 设置投资组合中股票的数目 numstocks = 5 # 提取最小波动组合对应的权重, 并转换成Numpy数组 GMV_weights = np.array(RandomPortfolios.iloc[min_index, 0:numstocks]) # 计算GMV投资组合收益 StockReturns['Portfolio_GMV'] = stock_return.mul(GMV_weights, axis=1).sum(axis=1) #输出风险最小投资组合的权重 print('****************************************************************') print(GMV_weights)

3、投资最优组合

(1)夏普比率

夏普比率(Sharpe Ratio)是由诺贝尔奖得主威廉·夏普提出的,用以帮助投资者比较投资的回报和风险。理性的投资者一般都是固定所能承受的风险,追求最大的回报;或者在固定预期回报,追去最小的风险。所以夏普比率计算的是,每承受一单位的总风险所产生的超额回报。计算公式如下:

分子计算了差值,说的是将某项投资与代表整个投资类别的基准进行比较,得到超额回报。分母标准差代表收益的波动率,对应着风险,因为波动越大预示着风险越高。 

只要将超额回报的均值除以其标准差,即可得到衡量回报和风险的夏普比率。另外需再乘上sqrt(252) (一年有252个交易日),得到年化的夏普比率。

(2)夏普最优组合的选择

其实我们更想在收益和风险之间找到平衡点,夏普比率这个变量能帮我做出更好的决策,它计算的是每承受一单位的风险所产生的超额回报。

我们首先来计算上述蒙特卡洛模拟的组合所对应的夏普比率,并将之作为第三个变量绘制在收益-风险的散点图中,这里采用颜色这一视觉线索来表征夏普比率。

# 设置无风险回报率为0 risk_free = 0 # 计算每项资产的夏普比率 RandomPortfolios['Sharpe'] = (RandomPortfolios.Returns - risk_free) / RandomPortfolios.Volatility # 绘制收益-标准差的散点图,并用颜色描绘夏普比率 # plt.scatter(RandomPortfolios.Volatility, RandomPortfolios.Returns, c=RandomPortfolios.Sharpe) plt.colorbar(label='Sharpe Ratio') plt.show()

 我们发现散点图上沿的组合具有较高的夏普比率。接着再找到夏普比率最大的组合,将其绘制在收益-风险的散点图中。

# 找到夏普比率最大数据对应的索引值 max_index = RandomPortfolios['Sharpe'].idxmax() # 在收益-风险散点图中突出夏普比率最大的点 # RandomPortfolios.plot('Volatility', 'Returns', kind='scatter', alpha=0.3) # x = RandomPortfolios.loc[max_index,'Volatility'] # y = RandomPortfolios.loc[max_index,'Returns'] # plt.scatter(x, y, color='red') #将该点坐标显示在图中并保留四位小数 plt.text(np.round(x,4),np.round(y,4),(np.round(x,4),np.round(y,4)),ha='left',va='bottom',fontsize=10) plt.show()

获取夏普比率最大组合的权重如下:

# 设置投资组合中股票的数目 numstocks = 5 # 提取最大夏普比率组合对应的权重,并转化为numpy数组 MSR_weights = np.array(RandomPortfolios.iloc[max_index, 0:numstocks]) # 计算MSR组合的收益 StockReturns['Portfolio_MSR'] = stock_return.mul(MSR_weights, axis=1).sum(axis=1) #输出夏普比率最大的投资组合的权重 print('****************************************************************') print(MSR_weights)

后,需要数据集和完整Python代码的朋友们,请关注如下微信公众号,回复"风险投资组合",即可获取完整内容:

微信公众号:胖哥真不错。

祝您学习愉快。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭