基于Python怎么实现股票收益率分析

基于Python怎么实现股票收益率分析

这篇“基于Python怎么实现股票收益率分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么实现股票收益率分析”文章吧。

案例详情

A公司是总部位于北京的一家公募基金管理公司,在公司对外发行的全部基金产品中,有一只名为“新金融股票型基金”,该基金在投资策略上是精选具有核心竞争优势、持续增长潜力且估值水平相对合理的A股市场金融股。

截止到2019年9月末,该基金重仓的股票包括浦发银行、招商银行、中信证券、海通证券、中国平安以及中国太保这6只股票,表7-2就列示了2014年1月至2019年9月末这6只股票的部分日收盘价,并且全部数据均存放于Excel文件。

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只股票的收益波动率,Cov(Ri,Rj)表示第i只股票收益率与第只股票收益率之间的协方差,投资组合收益波动率的σp表达式如下:

参考代码

任务1的代码

In[1]:importnumpyasnp...:importpandasaspd...:importmatplotlib.pyplotasplt...:frompylabimportmpl...:mpl.rcParams['font.sans-serif']=['KaiTi']...:mpl.rcParams['axes.unicode_minus']=FalseIn[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.117563dtype:float64In[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.359268dtype: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_covOut[9]:浦发银行招商银行海通证券华泰证券中国平安中国太保浦发银行0.0797650.0543470.0556930.0653240.0620480.056216招商银行0.0543470.0877570.0581480.0668470.0782280.072074海通证券0.0556930.0581480.1571220.1473650.0929940.086569华泰证券0.0653240.0668470.1473650.2018060.1020200.096885中国平安0.0620480.0782280.0929940.1020200.2162850.110579中国太保0.0562160.0720740.0865690.0968850.1105790.129074In[10]:return_corr=stock_return.corr()#计算每只股票收益率之间的相关系数...:return_corrOut[10]:浦发银行招商银行海通证券华泰证券中国平安中国太保浦发银行1.0000000.6495750.4974830.5148720.4723980.554035招商银行0.6495751.0000000.4951910.5023100.5678160.677201海通证券0.4974830.4951911.0000000.8275800.5044590.607889华泰证券0.5148720.5023100.8275801.0000000.4883210.600306中国平安0.4723980.5678160.5044590.4883211.0000000.661823中国太保0.5540350.6772010.6078890.6003060.6618231.000000In[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_2000Out[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]:foriinrange(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%。

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

以上就是关于“基于Python怎么实现股票收益率分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。

发布于 2022-04-03 22:39:47
收藏
分享
海报
0 条评论
67
上一篇:MySQL表锁、行锁、排它锁及共享锁怎么使用 下一篇:docker启动jenkins环境的问题怎么解决
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码