跳到主要内容

金融数据分析(十三)投资组合问题

· 5 分钟阅读
Allen Ma

项目二:

案例详情

A公司是总部位于广州的一家公募基金管理公司,在公司对外发行的全部基金产品中,有一只名为“新金融股票型基金”,该基金在投资策略上是精选具有核心竞争优势、持续增长潜力且估值水平相对合理的A股市场金融股。截止到2020年5月末,该基金重仓的股票包括浦发银行(600000)、招商银行(600036)、海通证券(600837)、华泰证券(601688)、中国平安(601318)、中国太保(601601)。 假定你是A公司的一位基金经理助理,日常的工作就是协助“新金融股票型基金”的基金经理跟踪并分析已投资的股票。根据基金经理的要求,你需要运用Python完成3项编程任务。

编程任务

(1)获取6只股票在2014年1月1日至2020年5月31日期间的收盘价,计算每只股票的日收益率、年化平均收益率、年化收益波动率,计算日收益率时需用到自然对数; (2)针对这6只股票构建投资组合,随机生成包括每只股票配置权重的一个数组(权重合计为1),并且计算以该权重配置的投资组合年化平均收益率、年化收益波动率; (3)针对6只股票,随机生成2000组不同的股票配置权重数组,以此计算出相对应的2000个不同的投资组合年化平均收益率、年化收益波动率,并且以散点图的方式绘制在横坐标为年化收益波动率、纵坐标为年化平均收益率的坐标轴中。

开始编程:

# -*- coding: utf-8 -*-
"""
Created on Wed Sept 23 8:59:40 2020

@author: mly
"""
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
stock_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) #将股价按照2014年首个交易日进行归1处理并且可视化
stock_return=np.log(stock_price/stock_price.shift(1)) #计算股票的日收益率
stock_return=stock_return.dropna() #删除缺失值所在的行
return_mean=stock_return.mean()*252 #计算股票的平均年化收益率
print('2014年至2020年5月的日收益率\n',stock_return.round(6)) #保留小数点后6位
print('2014年至2020年5月的年化平均收益率\n',return_mean.round(6)) #保留小数点后6位
return_volatility=stock_return.std()*np.sqrt(252) #计算股票的年化收益波动率
print('2014年至2020年5月的年化收益波动率\n',return_volatility.round(6))

#任务2
x=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))

#任务3
x_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()

结果展示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述