案例(五)具体金融数据分析
项目二:
案例详情
A公司是总部位于广州的一家公募基金管理公司,在公司对外发行的全部基金产品中,有一只名为“新金融股票型基金”,该基金在投资策略上是精选具有核心竞争优势、持续增长潜力且估值水平相对合理的A股市场金融股。截止到5月末,该基金重仓的股票包括浦发银行(600000)、招商银行(600036)、海通证券(600837)、华泰证券(601688)、中国平安(601318)、中国太保(601601)。
假定你是A公司的一位基金经理助理,日常的工作就是协助“新金融股票型基金”的基金经理跟踪并分析已投资的股票。根据基金经理的要求,你需要运用Python完成3项编程任务。
编程任务
(1)获取6只股票在1月1日至5月31日期间的收盘价,计算每只股票的日收益率、年化平均收益率、年化收益波动率,计算日收益率时需用到自然对数;
(2)针对这6只股票构建投资组合,随机生成包括每只股票配置权重的一个数组(权重合计为1),并且计算以该权重配置的投资组合年化平均收益率、年化收益波动率;
(3)针对6只股票,随机生成2000组不同的股票配置权重数组,以此计算出相对应的2000个不同的投资组合年化平均收益率、年化收益波动率,并且以散点图的方式绘制在横坐标为年化收益波动率、纵坐标为年化平均收益率的坐标轴中。
开始编程:
# -*- coding: utf-8 -*-"""Created on Wed Sept 23 8:59:40 @author: mly"""import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pylab import mplmpl.rcParams['font.sans-serif'] = ['KaiTi']mpl.rcParams['axes.unicode_minus'] = Falsestock_price=pd.read_excel('期末案例二.xlsx', sheet_name= "期末案例",header=0,index_col=0) #导入外部数据stock_price=stock_price.dropna()#(stock_price/stock_price.iloc[0]).plot(figsize=(9,6),grid=True) #将股价按照首个交易日进行归1处理并且可视化stock_return=np.log(stock_price/stock_price.shift(1)) #计算股票的日收益率stock_return=stock_return.dropna() #删除缺失值所在的行return_mean=stock_return.mean()*252 #计算股票的平均年化收益率print('至5月的日收益率\n',stock_return.round(6)) #保留小数点后6位print('至5月的年化平均收益率\n',return_mean.round(6)) #保留小数点后6位return_volatility=stock_return.std()*np.sqrt(252) #计算股票的年化收益波动率print('至5月的年化收益波动率\n',return_volatility.round(6))#任务2x=np.random.random(len(return_mean.index)) #从均匀分布中随机抽取6个从0到1的随机数w = x / np.sum(x) # 生成随机权重的一个数组return_cov=stock_return.cov()*252 #计算每只股票收益率之间的协方差print(return_cov)return_corr=stock_return.corr() #计算每只股票收益率之间的相关系数print(return_corr)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))#任务3x_2000=np.random.random((len(return_mean.index),2000)) #从均匀分布中随机抽取6行、2000列的0到1的随机数w_2000=x_2000/np.sum(x_2000,axis=0) #生成包含2000组随机权重的数组Rp_2000=np.dot(return_mean,w_2000) #计算投资组合不同的2000个收益率Vp_2000=np.zeros_like(Rp_2000) #生成存放投资组合2000个不同收益波动率的初始数组for i in range(len(Rp_2000)):Vp_2000[i] = np.sqrt(np.dot((w_2000.T)[i], np.dot(return_cov, w_2000[:, i])))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()