基于Python的投资组合收益率与波动率的数据分析

基于Python的投资组合收益率与波动率的数据分析
在这里插入图片描述

在这里插入图片描述

摘要:該文通过研究马科维茨的投资组合模型,并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据,接着利用数据分析的黄金组合库:Pandas,Numpy,Matplotlib来进行股票数据的预处理、计算分析、数据可视化处理,最后通过分析得出对投资有价值的结论。它可以广泛应用于其他任何基金投资组合的分析,对做好投资前股票分析具有一定的参考价值。
关键词:数据分析;Python;投资组合模型;收益率;波动率
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2021)32-0029-03
Data Analysis of Portfolio Returns and Volatility Based on Python Technology
CHEN Li-hua, ZENG De-sheng
(Information Engeering Institute, Guangdong Innovative Technical College, Dongguan 523960, China)
Abstract: In this paper, we study Markowitz's portfolio model and apply the portfolio model to a financial sector fund containing six financial stocks. Firstly, we obtain the raw stock data through the open source financial interface Tushare, then we use the golden combination libraries for data analysis: Pandas, Numpy, Matplotlib for stock data pre-processing, computational analysis, data visualization processing, and finally, we draw valuable conclusions for investment through analysis. It can be widely used in the analysis of any other fund portfolios, and has a certain reference value for pre-investment stock analysis.
Key words: data analysis; Python; portfolio selection model; rate of return; volatility
1 背景
近年来随着我国居民收入不断增长,投资意识和投资热情不断增强。股票、基金是普通居民参与投资的最常见方式,比起买一只股票,更多人倾向于投资基金,通过购买公司的基金,让自己的资金分散投资到更多的股票上,既能降低投资风险,也能获得较为可观的收益。如何在风险可控下获得更高的收益,就需要对资产做配置,也就是投资组合问题。近年来,在金融领域,量化投资技术越来越受到金融企业青睐,特别是随着大数据分析技术、人工智能技术不断发展,很多金融投资企业变为技术驱动性金融公司[1-3]。本文主要集中在股票投资组合的研究,以金融股为例,通过分析组合各个股票的历史数据来构建最优的股票投资组合,采用开源的财经接口Tushare来获取股票数据,利用Python数据分析的黄金组合库:Pandas,Numpy,Matplotlib来进行数据的预处理、计算分析、可视化处理。最终得出有价值的数据分析结论。
2 投资组合理论基础
投资组合理论是亨利·马科维茨(Harry Markowitz)在1952年提出,目前在投资组合的研究与实践中仍然被广泛采用[4]。本文就是基于马科维茨模型对股票进行分散投资,利用历史数据计算机出最佳投资组合策略,可以使投资过程中有效避免投机行为带来的非系统风险,获得比较稳定收益。在马科维茨的投资组合模型中,有两个非常重要的变量用来评估一个投资组织,分别是投资组合的预期收益率和收益率的波动率。假设投资组合由N个股票组成,wi代表投资组合中第i只股票投资金额占投资组合总投资金额的比例,E(Ri)代表投资组合中第i只股票的预期收益率,这里采用该股票历史数据中的收益率的均值代替,根据模型可以得到投资组合的预期收益率E(RP)公式如(1)所示。
[ERP=i=1NwiERi] (1)
假设[σi]表示第i只股票的收益波动率,Cov(Ri,Rj)表示第i只股票收益率与第j只股票收益率之间的协方差,那么投资组合收益波动率[σP]的公式如(2)所示。
[σP=i=1Nj=1NwiwjCov(Ri,Rj)] (2)
3 投资组合数据分析
投资组合数据分析过程大概分为5个步骤:1)从财经接口获取股票历史数据;2)对初始数据进行预处理,将处理好的数据存入文件;3)通过数据可视化观察股票数据的基本走势;4)计算股票年化平均收益率、年化收益波动率、股票收益率之间协方差、收益率相关系数等;5)构建3000组投资组合,结合马科维茨模型,计算并观察最优组合的年收益率、波动率。
3.1 获取股票历史数据
本文采用开源免费的财经数据接口Tushare来获取股票历史交易数据,Tushare提供了从数据采集、数据清洗加工到数据存储的功能[5]。本文主要分析某个金融股票型基金,它包含6只金融股票:招商银行(600036)、中国平安(601318)、工商银行(601398)、中国太保(601601)、中国人寿(601628)中国光大(601788)。首先通过pip install tushare安装所需要的Tushare第三方财经数据库。接下来通过tushare接口获取交易原始数据,本文通过获取近五年的交易数据来进行数据分析。第二个步骤包含三个小步骤:1)到官网注册账号,并获取对应的密钥,并初始化接口;2)定义列表,存储需要分析的股票代号,股票代号可以在官网查询;3)遍历每只股票,通过api接口的daily获取股票的当天详细数据,输入参数:股票代码、开始时间、结束时间;输出参数:股票代号、交易日期、开盘价、最低价、最高价、收盘价等等,本项目我们只保存股票代号,交易日期,收盘价。共获取6个股票从2016年6月1日至2021年7月23日期间的交易数据,共计7518条交易数据。核心代码如下:
# 1.设置Token
ts.set_token('填写获取到的个人密钥')
# 初始化接口
ts_api = ts.pro_api()
#2.定义列表,存储你需要分析的股票代号
ts_codes = ['600036.SH','601318.SH','601398.SH','601601.SH','601628.SH','601788.SH']
#3.遍历每只股票、读取相应数据并进行保存。
for ts_code in ts_codes:
data = ts_api.daily(ts_code=ts_code, start_date='20160601', end_date='20210725')
 if(ts_code=="600036.SH"):
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a')
else:
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a',header=False)
最终执行后保存在zuhe.csv文件的数据如图1(截取其中10行数据)所示。
3.2 股票数据预处理
上一个步骤获取到的股票原始数据不利我们进行数据分析,所以需要对数据进行预处理,数据预处理主要采用Pandas库来进行处理[6],它分为四个步骤:1)利用df.drop(df.columns[0], axis=1, inplace=True)把上图中表格数据中的第一列删除;2)使用代码:two_level_index_series = df.set_index(["trade_date", "ts_code "])["close"]將交易日期trade_date、股票代号ts_code设定位复合索引;3)应用unstack()函数进行“行转列”操作,new_df = two_level_index_series.unstack();4)最后将处理好的数据存入新的文件,new_df.to_csv("new_zuhe.csv")。经过数据预处理后,数据整合成1253条数据,每条数据包含日期,跟6只股票当天收盘价。最终数据如图2所示。
3.3 股票走势数据可视化
利用Python数据可视化库matplotlib来绘制2016年6月-2021年7月期间,本文所选6只股票的基本走势图[6],首先将股价按照20160601交易日进行归1处理,然后利用matplotlib库的plot()函数读取上面预处理好的数据,并进行可视化展示,可以观察到每只股票五年内的基本走势,核心代码如下。
import matplotlib.pyplot as plt
stock_price=pd.read_csv('new_zuhe.csv',parse_dates = ['trade_date'], index_col = ['trade_date']).iloc[:,:]
(stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True)
最终实现的效果图如图3所示:
3.4 获得投资组合的年化平均收益率和年化收益波动率
利用Numpy数值计算库来计算股票的各种参数,它提供了大量数学函数库,比如log()、mean()、std()、sqrt()、cov()、corr()等函数,使用方便快捷[6]。下面我们利用函数库计算出股票日收益率、股票年化平均收益率、股票年化收益波动率、股票收益率之间协方差、收益率相关系数。核心代码如下:
#计算股票的日收益率
stock_return=np.log(stock_price/stock_price.shift(1))
#股票平均年化收益率
return_mean=stock_return.mean()*252
#股票年化收益波动率
return_volatility=stock_return.std()*np.sqrt(252)
#计算每只股票收益率之间的协方差
return_cov=stock_return.cov()*252
3.1 获取股票历史数据
本文采用开源免费的财经数据接口Tushare来获取股票历史交易数据,Tushare提供了从数据采集、数据清洗加工到数据存储的功能[5]。本文主要分析某个金融股票型基金,它包含6只金融股票:招商银行(600036)、中国平安(601318)、工商银行(601398)、中国太保(601601)、中国人寿(601628)中国光大(601788)。首先通过pip install tushare安装所需要的Tushare第三方财经数据库。接下来通过tushare接口获取交易原始数据,本文通过获取近五年的交易数据来进行数据分析。第二个步骤包含三个小步骤:1)到官网注册账号,并获取对应的密钥,并初始化接口;2)定义列表,存储需要分析的股票代号,股票代号可以在官网查询;3)遍历每只股票,通过api接口的daily获取股票的当天详细数据,输入参数:股票代码、开始时间、结束时间;输出参数:股票代号、交易日期、开盘价、最低价、最高价、收盘价等等,本项目我们只保存股票代号,交易日期,收盘价。共获取6个股票从2016年6月1日至2021年7月23日期间的交易数据,共计7518条交易数据。核心代码如下:
# 1.设置Token
ts.set_token('填写获取到的个人密钥')
# 初始化接口
ts_api = ts.pro_api()
#2.定义列表,存储你需要分析的股票代号
ts_codes = ['600036.SH','601318.SH','601398.SH','601601.SH','601628.SH','601788.SH']
#3.遍历每只股票、读取相应数据并进行保存。
for ts_code in ts_codes:
data = ts_api.daily(ts_code=ts_code, start_date='20160601', end_date='20210725')
 if(ts_code=="600036.SH"):
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a')
else:
data[['ts_code','trade_date','close']].to_csv('zuhe.csv',mode='a',header=False)
最終执行后保存在zuhe.csv文件的数据如图1(截取其中10行数据)所示。
3.2 股票数据预处理
上一个步骤获取到的股票原始数据不利我们进行数据分析,所以需要对数据进行预处理,数据预处理主要采用Pandas库来进行处理[6],它分为四个步骤:1)利用df.drop(df.columns[0], axis=1, inplace=True)把上图中表格数据中的第一列删除;2)使用代码:two_level_index_series = df.set_index(["trade_date", "ts_code "])["close"]将交易日期trade_date、股票代号ts_code设定位复合索引;3)应用unstack()函数进行“行转列”操作,new_df = two_level_index_series.unstack();4)最后将处理好的数据存入新的文件,new_df.to_csv("new_zuhe.csv")。经过数据预处理后,数据整合成1253条数据,每条数据包含日期,跟6只股票当天收盘价。最终数据如图2所示。
3.3 股票走势数据可视化
利用Python数据可视化库matplotlib来绘制2016年6月-2021年7月期间,本文所选6只股票的基本走势图[6],首先将股价按照20160601交易日进行归1处理,然后利用matplotlib库的plot()函数读取上面预处理好的数据,并进行可视化展示,可以观察到每只股票五年内的基本走势,核心代码如下。
import matplotlib.pyplot as plt
stock_price=pd.read_csv('new_zuhe.csv',parse_dates = ['trade_date'], index_col = ['trade_date']).iloc[:,:]
(stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True)
最终实现的效果图如图3所示:
3.4 获得投资组合的年化平均收益率和年化收益波动率
利用Numpy数值计算库来计算股票的各种参数,它提供了大量数学函数库,比如log()、mean()、std()、sqrt()、cov()、corr()等函数,使用方便快捷[6]。下面我们利用函数库计算出股票日收益率、股票年化平均收益率、股票年化收益波动率、股票收益率之间协方差、收益率相关系数。核心代码如下:
#计算股票的日收益率
stock_return=np.log(stock_price/stock_price.shift(1))
#股票平均年化收益率
return_mean=stock_return.mean()*252
#股票年化收益波动率
return_volatility=stock_return.std()*np.sqrt(252)
#计算每只股票收益率之间的协方差
return_cov=stock_return.cov()*252

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS re:Invent 2024 现场实录 - It‘s all about Scale

时隔五年,再度造访美国,也是同样的主题,参加在拉斯维加斯举行的 AWS re:Invent 大会。 会场 从 2012 起第一届开始,每年的 re:Invent 大会都放在拉斯维加斯,主会场也都放在威尼斯人酒店 (Venetian)。有小伙伴好奇这背…

【实用干货】日本上市药品价格、说明书、在研新药在线查询网站及数据库

众所周知,日本对上市药品公开信息程度非常高,我们在了解药品信息时常常会访问日本药监局(日本药方局)官网的PMDA数据库来查询信息,但由于网站的不熟悉或语言障碍原因,导致查找某个药品信息需要花费大量时间,如药物综述…

【vba源码】自动获取汇率

Hi,大家好! 没有想到今天居然是腊八,过了腊八就是年,离过年越来越近了,那在这里给大家就拜个年,希望大家在新的一年都有好事发生。 最近在弄点小项目,在项目遇到了一个汇率计算的问题&#xff…

【学习路线】Python 算法(人工智能)详细知识点学习路径(附学习资源)

学习本路线内容之前,请先学习Python的基础知识 其他路线: Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析(数据科学) >> Python 算法(人工智能) >> Pyth…

CV-LLM经典论文解读|VTimeLLM: Empower LLM to Grasp Video MomentsVTimeLLM:赋能大语言模型理解视频片段

论文标题 VTimeLLM: Empower LLM to Grasp Video Moments VTimeLLM:赋能大语言模型理解视频片段 论文链接: VTimeLLM: Empower LLM to Grasp Video Moments论文下载 论文作者 Bin Huang, Xin Wang, Hong Chen, Zihan Song, Wenwu Zhu (Tsinghua Un…

机器学习基础-大语言模型

目录 大语言模型的基本概念 “大”体现在什么地方? 预训练微调两阶段的基本流程和作用 第一阶段:利用语言模型进行无监督预训练 第二阶段:通过监督微调的模式解决下游任务 BERT模型中MLM和NSP机制基本概念 MLM NSP Prompt学习的基本概…

给Kkfileview加请求头鉴权接入

所有接入前端token放localStorage, 或者后端cookie中获取鉴权 本案例以放localStorage为例 一、创建global.js $(document).ready(function() {// 设置全局的 AJAX 请求头$.ajaxSetup({headers: {Authentication: localStorage.getItem(Authentication) }}); }); 二。全部模…

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年,这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合,大大提高了研发效率。在开发过程中,也遇到了一些性能相关问题和…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了(具体哪些是必须的,哪些是多余的没验证),configure才能认为X的库文件和头文件是可以用的。打开多个编程语言的支持特性。 ./configure --prefixpwd/mybui…

爬虫学习记录

1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术

联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…

主机A与主机B建立TCP连接的三次握手过程

( 1 )主机 A 的 TCP 向主机 B 发出连接请求 SYN 报文段(第一次握手)。( 1 分) ( 2 )一旦包含 SYN 报文段的 IP 数据报到达主机 B , SYN 报文段被从数据报…

SpringCloud系列教程:微服务的未来(六)docker教程快速入门、常用命令

对于开发人员和运维工程师而言,掌握 Docker 的基本概念和常用命令是必不可少的。本篇文章将带你快速入门 Docker,并介绍一些最常用的命令,帮助你更高效地进行开发、测试和部署。 目录 前言 快速入门 docker安装 配置镜像加速 部署Mysql …

Express 加 sqlite3 写一个简单博客

例图: 搭建 命令: 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…

C++:字符数组

一、字符数组介绍 数组的元素如果是字符类型,这种数组就是字符数组,字符数组可以是一维数组,可以是二维数组 (多维数组)。我们接下来主要讨论的是一维的字符数组。 char arr1[5]; //⼀维字符数组 char arr2[3][5];//⼆…

基于SpringBoot实现的保障性住房管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

分享3个国内使用正版GPT的网站【亲测有效!2025最新】

1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao

LabVIEW瞬变电磁接收系统

利用LabVIEW软件与USB4432采集卡开发瞬变电磁接收系统。系统通过改进硬件配置与软件编程,解决了传统仪器在信噪比低和抗干扰能力差的问题,实现了高精度的数据采集和处理,特别适用于地质勘探等领域。 ​ 项目背景: 瞬变电磁法是探…

CM3/4启动流程

CM3/4启动流程 1. 启动模式2. 启动流程 1. 启动模式 复位方式有三种:上电复位,硬件复位和软件复位。 当产生复位,并且离开复位状态后,CM3/4 内核做的第一件事就是读取下列两个 32 位整数的值: 从地址 0x0000 0000 处取…

快手短剧播放器uniapp如何引入与对接?

uniApp前端微短剧项目开源分享 开源地址:git开源下载地址 文章目录 快手短剧播放器uniapp如何引入与对接?1.引入短剧播放器2.创建文件kscomponents组件3.local-stream.js文件说明4.用户行为事件4.local-stream.ksml文件参考如下 快手短剧播放器uniapp如何…