如何用Python分析股票收益率?

发布时间:2021-02-23 发表于话题:手机上查看自己股票步骤 点击:6 当前位置:财神股票资讯网 > 综合 > 如何用Python分析股票收益率? 手机阅读

2014年1月至2019年9月期间A股市场6只金融机构股票的部分日收盘价

(单位:元/股)

数据来源:上海证券交易所

假定你是A公司的一位基金经理助理,日常的工作就是协助“新金融股票型基金”的基金经理跟踪并分析已投资的股票。根据基金经理的要求,你需要运用Python完成3项编程任务。

编程任务

【任务 1】导入存放表7-2中这些股票在2014年1月至2019年9月期间日收盘价的Excel文件,计算每只股票的日收益率、年化平均收益率、年化收益波动率,计算日收益率时需要用自然对数。

【任务 2】针对由这6只股票构建的投资组合,随机生成包含每只股票配置权重的一个数组(权重合计等于1),并且计算以该权重配置的投资组合年化平均收益率、年化收益波动率。

【任务 3】随机生成包含2000组不同的股票配置权重的数组,以此计算出相对应的2 000个不同的投资组合年化平均收益率、年化收益波动率,并且以散点图的方式绘制在横坐标为年化收益波动率、纵坐标为年化平均收益率的坐标轴中。

编程提示

针对任务2,假定投资组合由N只股票组成,wi代表了投资组合中第i只股票所占的权重(股票的市值占投资组合整体市值的比例),E(Ri)代表了投资组合中第i只股票的预期收益率(用该股票过去收益率的均值代替),可以得到投资组合预期收益率E(RP)的表达式如下:

同时,假设

表示第i只股票的收益波动率,

表示第i只股票收益率与第只股票收益率之间的协方差,投资组合收益波动率的

表达式如下:

参考代码与说明

任务1的代码

In [1]: import numpy as np ...: import pandas as pd ...: import matplotlib.pyplot as plt ...: from pylab import mpl ...: mpl.rcParams['font.sans-serif'] = ['KaiTi'] ...: mpl.rcParams['axes.unicode_minus'] = False In [2]: stock_price=pd.read_excel('C:/Desktop/金融股(2014年—2019年9月).xlsx', sheet_name= "Sheet1",header=0,index_col=0) #导入外部数据 ...: stock_price=stock_price.dropna() #删除缺失值的行 In [3]: (stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True) #将股价按照2014年首个交易日进行归1处理并且可视化 Out[3]: In [4]: stock_return=np.log(stock_price/stock_price.shift(1)) #计算股票的日收益率 ...: stock_return=stock_return.dropna() #删除缺失值所在的行 In [5]: return_mean=stock_return.mean()*252 #计算股票的平均年化收益率 ...: print('2014年至2019年9月的年化平均收益率\n',return_mean.round(6)) #保留小数点后6位 2014年至2019年9月的年化平均收益率 浦发银行 0.042824 招商银行 0.211223 海通证券 0.043759 华泰证券 0.138177 中国平安 0.134000 中国太保 0.117563 dtype: float64 In [6]: return_volatility=stock_return.std()*np.sqrt(252) #计算股票的年化收益波动率 ...: print('2014年至2019年9月的年化收益波动率\n',return_volatility.round(6)) 2014年至2019年9月的年化收益波动率 浦发银行 0.282428 招商银行 0.296238 海通证券 0.396386 华泰证券 0.449228 中国平安 0.465064 中国太保 0.359268 dtype: float64

从下图不难看出,由于6只股票均是金融类股票,因此在整体的走势方面存在一定的趋同性。但是每只股票的平均年化收益率则存在较大差异,其中,招商银行的平均收益率最高,浦发银行的收益率则最低。同时,从平均年化波动率来看,银行股最低,中国平安则最高。

2014年1月至2019年9月期间6只金融股股价走势图

(股价在2014年首个交易日做归1处理)

任务2的代码

In [7]: x=np.random.random(len(return_mean.index)) #从均匀分布中随机抽取6个从0到1的随机数 In [8]: w=x/np.sum(x) #生成随机权重的一个数组 ...: w #查看生成的随机权重数组 Out[8]: array([0.24372614, 0.03925093, 0.20889395, 0.20843467, 0.23808734, 0.06160696]) 需要注意的是,由于是通过随机生成的数组,因此每一次得到的随机权重数组是不相同的,但是权重的合计数是等于1。 In [9] : return_cov=stock_return.cov()*252 #计算每只股票收益率之间的协方差 ...: return_cov Out[9] : 浦发银行 招商银行 海通证券 华泰证券 中国平安 中国太保 浦发银行 0.079765 0.054347 0.055693 0.065324 0.062048 0.056216 招商银行 0.054347 0.087757 0.058148 0.066847 0.078228 0.072074 海通证券 0.055693 0.058148 0.157122 0.147365 0.092994 0.086569 华泰证券 0.065324 0.066847 0.147365 0.201806 0.102020 0.096885 中国平安 0.062048 0.078228 0.092994 0.102020 0.216285 0.110579 中国太保 0.056216 0.072074 0.086569 0.096885 0.110579 0.129074 In [10]: return_corr=stock_return.corr() #计算每只股票收益率之间的相关系数 ...: return_corr Out[10]: 浦发银行 招商银行 海通证券 华泰证券 中国平安 中国太保 浦发银行 1.000000 0.649575 0.497483 0.514872 0.472398 0.554035 招商银行 0.649575 1.000000 0.495191 0.502310 0.567816 0.677201 海通证券 0.497483 0.495191 1.000000 0.827580 0.504459 0.607889 华泰证券 0.514872 0.502310 0.827580 1.000000 0.488321 0.600306 中国平安 0.472398 0.567816 0.504459 0.488321 1.000000 0.661823 中国太保 0.554035 0.677201 0.607889 0.600306 0.661823 1.000000 In [11]: Rp=np.dot(return_mean,w) #计算投资组合的年化收益率 ...: Vp=np.sqrt(np.dot(w,np.dot(return_cov,w.T))) #计算投资组合的年化收益波动率 ...: print('用随机生成的权重计算得到投资组合的年化收益率',round(Rp,6)) ...: print('用随机生成的权重计算得到投资组合的年化收益波动率',round(Vp,6)) 用随机生成的权重计算得到投资组合的年化收益率 0.095816 用随机生成的权重计算得到投资组合的年化收益波动率 0.315454 从以上的相关系数输出结果不难看出,由于都是金融股,因此不同股票之间的相关系数是比较高的,投资组合的分散化效应可能会不太理想。此外,根据随机生成的权重数,得到投资组合的年化收益率为9.581 6%,波动率高达31.545 4%。 任务3的代码 In [12]: x_2000=np.random.random((len(return_mean.index),2000)) #从均匀分布中随机抽取6行、2000列的0到1的随机数 In [13]: w_2000=x_2000/np.sum(x_2000,axis=0) #生成包含2000组随机权重的数组 ...: w_2000 Out[13]: array([[0.19250103, 0.01845509, 0.01765565, ..., 0.33889512, 0.0463229 , 0.26199306], [0.07263106, 0.00973181, 0.13055863, ..., 0.03118864, 0.20474944, 0.06271757], [0.09534805, 0.30004746, 0.18353861, ..., 0.13704764, 0.22151316, 0.12965449], [0.09386134, 0.16068824, 0.212781 , ..., 0.02455051, 0.13288678, 0.03435049], [0.25893945, 0.31725497, 0.14183784, ..., 0.00825204, 0.03630956, 0.14306535], [0.28671907, 0.19382242, 0.31362827, ..., 0.46006606, 0.35821817, 0.36821904]]) In [14]: Rp_2000=np.dot(return_mean,w_2000) #计算投资组合不同的2000个收益率 ...: Vp_2000=np.zeros_like(Rp_2000) #生成存放投资组合2000个不同收益波动率的初始数组 In [15]: for i in range(len(Rp_2000)): #用for语句快速计算投资组合2000个不同的收益波动率 ...: Vp_2000[i]=np.sqrt(np.dot((w_2000.T)[i],np.dot(return_cov,w_2000[:,i]))) In [16]: plt.figure(figsize=(9,6)) ...: plt.scatter(Vp_2000,Rp_2000) ...: plt.xlabel(u'波动率',fontsize=13) ...: plt.ylabel(u'收益率',fontsize=13,rotation=90) ...: plt.xticks(fontsize=13) ...: plt.yticks(fontsize=13) ...: plt.title(u'投资组合收益率与波动率的关系', fontsize=13) ...: plt.grid('True') ...: plt.show()

下图中的散点就是本次随机生成2 000组不同投资权重所对应的投资组合收益率和波动率。通过映射至纵坐标的数值,可以目测出投资组合的最高年化收益率超过16%,最低年化收益率则略低于7%;通过映射至横坐标的数值可以发现,投资组合的最高波动率接近37%,最低波动率则接近26%。

在随机生成的2 000组不同投资权重条件下投资组合的收益率与波动率的关系图

-END-

Python金融实战案例精粹

作者: 斯文

内容简介:随着金融科技时代的到来,Python在金融领域的影响力已经有目共睹。掌握Python在金融实务中的应用,已经成为金融科技达人们必备的技能之一。

本书作为《基于Python的金融分析与风险管理》一书的配套案例集,整合了源于现实金融市场和日常实务工作的88个原创案例,涉及308项编程任务,包括超过6000行的Python代码。

本书囊括了丰富多样的金融场景,涵盖利率、汇率、债券、股票、基金、远期、股指期货、外汇期货、国债期货、股票期权、商品期权等金融产品,还涉及商业银行、证券公司、期货公司、保险公司、信托公司、资产管理公司、基金管理公司、金融控股公司等各类型的金融机构,既介绍了包括我国在内的新兴市场,又介绍了欧美成熟的金融市场,囊括金融实务中可能涉及Python编程的各种场景。

适合人群:本书着眼于一系列从业者可能涉及的金融实务案例,并结合Python编程给出了高效的解决方案。通过阅读本书,读者能够全方位地了解金融市场的运作,深刻洞察各类职务背后的工作技巧。

波动率 股票 浦发银行 中国太保 Python 声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。

本文来源:https://www.thyysj.com/info/298658.html

标签组:[投资] [股票] [投资组合] [基金收益率] [年化收益率] [股票收益率] [波动率

热门话题

综合推荐文章

综合热门文章