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


Posted in Python onApril 02, 2022

前言

金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平。然而,学会Python可以让你实现一个人写完一个交易系统的需求,真正的一个人当成一支军队。

在量化交易里,Python是工具,金融是Sense,它可以让你的想法快速实现并得到验证。而在金融领域运用Python就必然会涉及资本市场最重要的部分——股票。“股市如此多娇,引无数投资者竞折腰”,用Python来分析股票投资组合收益率和波动率,是每个金融从业者都该掌握的本领。

我们缺少的,是在具体的金融场景下应用Python的经验。今天就让我们以金融股为分析对象,来一次Python金融实战,希望对你有所启发!

案例详情

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

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

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

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

数据来源:上海证券交易所。(单位:元/股)

假定你是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)的表达式如下:

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

同时,假设σi表示第i只股票的收益波动率,Cov(Ri,Rj)表示第i只股票收益率与第只股票收益率之间的协方差,投资组合收益波动率的σp表达式如下:

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

参考代码

任务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只股票均是金融类股票,因此在整体的走势方面存在一定的趋同性。但是每只股票的平均年化收益率则存在较大差异,其中,招商银行的平均收益率最高,浦发银行的收益率则最低。同时,从平均年化波动率来看,银行股最低,中国平安则最高。

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

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%。

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

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

以上就是基于Python实现股票收益率分析的详细内容,更多关于Python股票收益率的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
Django学习笔记之Class-Based-View
Feb 15 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
python实现录音小程序
Oct 26 Python
python3转换code128条形码的方法
Apr 17 Python
浅谈python 中类属性共享的问题
Jul 02 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
Python列表的切片实例讲解
Aug 20 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 24 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 #Python
Python OpenCV超详细讲解基本功能
python函数的两种嵌套方法使用
Apr 02 #Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Python实现提取PDF简历信息并存入Excel
Apr 02 #Python
python对文档中元素删除,替换操作
Apr 02 #Python
Python中第三方库Faker的使用详解
You might like
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
浅谈Vue.js
2017/03/02 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
在Python中使用成员运算符的示例
2015/05/13 Python
Python中psutil的介绍与用法
2019/05/02 Python
python小白切忌乱用表达式
2020/05/29 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
python编写实现抽奖器
2020/09/10 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
初三毕业评语
2014/12/26 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
深入理解Pytorch微调torchvision模型
2021/11/11 Python
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript