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

目录
  • 前言
  • 案例详情
  • 编程任务
  • 编程提示
  • 参考代码
    • 任务1的代码
    • 任务2的代码
    • 任务3的代码

前言

金融行业的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只金融机构股票的部分日收盘价。

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

假定你是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]:  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%。

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

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

(0)

相关推荐

  • 使用python的pandas为你的股票绘制趋势图

    前言 手里有一点点公司的股票, 拿不准在什么时机抛售, 程序员也没时间天天盯着看,不如动手写个小程序, 把股票趋势每天早上发到邮箱里,用 python 的 pandas, matplotlib 写起来很容易, 几十行代码搞定. 准备环境 python3 -m venv venv source ./venv/bin/activate pip install pandas pip install pandas_datareader pip install matplotlib 代码如下 绘制 201

  • 利用Python分析一下最近的股票市场

    目录 一.数据获取 二.合并数据 三.绘制股票每日百分比变化 四.箱线图 五.计算月化夏普比率 六.结论 一.数据获取 数据获取范围为2022年一月一日到2022年2月25日,获取的数据为俄罗斯黄金,白银,石油,银行,天然气: # 导入模块 import numpy as np import pandas as pd import yfinance as yf # GC=F黄金,SI=F白银,ROSN.ME俄罗斯石油,SBER.ME俄罗斯银行,天然气 tickerSymbols = ['GC=F

  • python爬取股票最新数据并用excel绘制树状图的示例

    大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊. 不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们. 以下截图来自金融界网站-大盘云图: 那么,今天我们试着用python爬取最近交易日的股票数据,并试着用excel简单绘制以下上面这个树状图.本文旨在抛砖引玉,吼吼. 1. python爬取网易财经不同板块股票数据 目标网址: http://quotes.money.163.com/old/#query=hy

  • python3使用pandas获取股票数据的方法

    如下所示: from pandas_datareader import data, wb from datetime import datetime import matplotlib.pyplot as plt end = datetime.now() start = datetime(end.year - 1, end.month, end.day) alibaba = data.DataReader('BABA', 'yahoo', start, end) alibaba['Adj Clo

  • 基于Python实现股票数据分析的可视化

    目录 一.简介 二.代码 1.主文件 2.数据库使用文件 3.ui设计模块 4.数据处理模块 三.数据样例的展示 四.效果展示 一.简介 我们知道在购买股票的时候,可以使用历史数据来对当前的股票的走势进行预测,这就需要对股票的数据进行获取并且进行一定的分析,当然了,人们是比较喜欢图形化的界面的,因此,我们在这里采用一种可视化的方法来实现股票数据的分析. 二.代码 1.主文件 from work1 import get_data from work1 import read_data from w

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

    目录 前言 案例详情 编程任务 编程提示 参考代码 任务1的代码 任务2的代码 任务3的代码 前言 金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平.然而,学会Python可以让你实现一个人写完一个交易系统的需求,真正的一个人当成一支军队. 在量化交易里,Python是工具,金融是Sense,它可以让你的想法快速实现并得到验证.而在金融领域运用Python就必然会涉及资本市场最重要的部分——股票.“股市如此多娇,引无数投资者竞折腰”,用Python来分析股票投资组合收

  • 基于Python词云分析政府工作报告关键词

    前言 十三届全国人大三次会议作了政府工作报告.这份政府工作报告仅有10500字左右,据悉是改革开放40年以来最短的一次.受到疫情影响,今年的两会会议适当缩短,政府工作报告也大幅压缩,体现了"实干为要"的理念.那么,这份政府工作报告突出强调了哪些关键词呢?我们其实可以基于Python技术进行词频分析和词云制作! import matplotlib.pyplot as plt#绘图库 import jieba from wordcloud import WordCloud # 读入文本数据

  • 基于python分析你的上网行为 看看你平时上网都在干嘛

    简介 想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了. 这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅适用于Chrome浏览器或者以Chrome为内核的浏览器. 在该页面中你将可以查看有关自己在过去的时间里所访问浏览的域名.URL以及忙碌天数的前十排名以及相关的数据图表. 部分截图 代码思路 1. 目录结构 首先,我们先看一下整体目录结构 Code ├─ app_callback.py 回调函数,实

  • 基于python历史天气采集的分析

    分析历史天气的趋势. 先采集 代码: #-*- coding:utf-8 -*- import requests import random import MySQLdb import xlwt from bs4 import BeautifulSoup user_agent=['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36'

  • 基于python实现cdn日志文件导入mysql进行分析

    目录 一.本文需求背景 二.需求落地如下 三.自定义查询 一.本文需求背景 周六日出现CDN大量请求,现需要分析其请求频次与来源,查询是否存在被攻击问题. 本文以阿里云CDN日志作为辅助查询数据,其它云平台大同小异. 系统提供的离线日志如下所示: 二.需求落地如下 日志实例如下所示: [9/Jun/2015:01:58:09 +0800] 10.10.10.10 - 1542 "-" "GET http://www.aliyun.com/index.html" 20

  • 基于Python开发chrome插件的方法分析

    本文实例讲述了基于Python开发chrome插件的方法.分享给大家供大家参考,具体如下: 谷歌Chrome插件是使用HTML.JavaScript和CSS编写的.如果你之前从来没有写过Chrome插件,我建议你读一下这个.在这篇教程中,我们将教你如何使用Python代替JavaScript. 创建一个谷歌Chrome插件 首先,我们必须创建一个清单文件:manifest.json. { "manifest_version": 2, "name": "Py

  • 基于python select.select模块通信的实例讲解

    要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值. select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息在网上一直在找这个select.select的参数解释, 但实在是没有, 哎...自己硬着头皮分析了一下. readable, writable, exceptional = select.select(inputs, ou

  • 基于Python和Scikit-Learn的机器学习探索

    你好,%用户名%! 我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎.我同时在为一家俄罗斯移动运营商开发大数据产品.这是我第一次在网上写文章,不喜勿喷. 现在,很多人想开发高效的算法以及参加机器学习的竞赛.所以他们过来问我:"该如何开始?".一段时间以前,我在一个俄罗斯联邦政府的下属机构中领导了媒体和社交网络大数据分析工具的开发.我仍然有一些我团队使用过的文档,我乐意与你们分享.前提是读者已经有很好的数学和机器学习方面的知识(我的团队主要由MIPT(莫斯科物理与技术大学)和

  • 基于Python的接口测试框架实例

    背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter.SoupUI等学习周期有点长,干脆自己写一个吧,不求人,所有功能自己都能一清二楚. 当然,写工具造轮子只是学习的一种方式,现成成熟的工具肯定比我们自己的写的好用. 开发环境 ------------------------------------------------------------- 操作系统:Mac OS X EI

  • 基于Python对象引用、可变性和垃圾回收详解

    变量不是盒子 在示例所示的交互式控制台中,无法使用"变量是盒子"做解释.图说明了在 Python 中为什么不能使用盒子比喻,而便利贴则指出了变量的正确工作方式. 变量 a 和 b 引用同一个列表,而不是那个列表的副本 >>> a = [1, 2, 3] >>> b = a >>> a.append(4) >>> b [1, 2, 3, 4] 如果把变量想象为盒子,那么无法解释 Python 中的赋值:应该把变量视作

随机推荐