基于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