Loading...
墨滴

傲天居士

2021/07/05  阅读:22  主题:默认主题

使用R语言构建投资组合

1. 马科维茨投资组合理论

证券及其它风险资产的投资首先需要解决的是两个核心问题:即预期收益与风险。 那么如何测定组合投资的风险与收益和如何平衡这两项指标进行资产分配是市场投资者迫切需要解决的问题。正是在这样的背景下,在50年代和60年代初,马科维茨理论应运而生。

该理论依据以下几个假设:

  1. 投资者在考虑每一次投资选择时,其依据是某一持仓时间内的证券收益的概率分布。
  2. 投资者是根据证券的期望收益率估测证券组合的风险。
  3. 投资者的决定仅仅是依据证券的风险和收益。
  4. 在一定的风险水平上,投资者期望收益最大;相对应的是在一定的收益水平上,投资者希望风险最小。

根据以上假设,马科维茨确立了证券组合预期收益、风险的计算方法和有效边界理论,建立了资产优化配置的均值-方差模型(允许放空):

若不允许放空,则为:

2. 单指数模型

单因素模型假设只有一种宏观因素会引起股票收益风险。根据单因素模型的假设,任何股票的收益都可以分解为个别股份剩余收益的期望(这里用一个公司特指的因子 表示)、影响市场的宏观事件的收益和不可预测的只影响公司的微观事件组成。特别地,当宏观经济因素由市场指数的收益率代表时,单因素模型就成了单指数模型:

在单指数模型中,我们有 ,因此:

其中,

3. 投资组合的构建

3.1 股票的选择

我们首先按照行业分类,从每一个行业中选择5档股票,共50档股票。去除缺失数据比较多的以及退市的股票,用剩下的29档股票构建单指数模型,将股票按照阿尔法值排序,从中取阿尔法值为正的股票,并选出其中阿尔法值最大的8档股票。

计算所选取的8档股票的相关系数矩阵并可视化: 上图表示用颜色表示8档个股两两之间的相关系数,且相关性强弱与颜色的对应关系由图片内部右侧的色带展现。对角线上的元素相关系数为1,颜色偏向深蓝色。相关系数为正时,颜色显示为冷色调,且越接近1,颜色越偏向深蓝色;相关系数为负时,颜色显示为暖色调,且越接近-1,颜色越偏向红色。当相关系数接近0时,颜色较浅。 上图对角线部分是分布图与密度曲线,左下角表示变量两两之间的散点图与拟合曲线,右上角表示变量两两之间的相关系数与显著性。由上图结合 可知,我们选择的5档股票可以为:古井贡酒、光迅科技、科大讯飞、华联控股、英特集团。

3.2 马科维茨资产组合的构建

R中有现成的工具包,可以非常方便地进行马科维茨资产组合的构建。代码如下:

#1.标的资产的筛选
rm(list=ls())
#加载股票月收益率数据
load('mypath/data1.Rdata')
#加载中证500指数月收益率与无风险月收益率数据
load('mypath/market_riskfree.Rdata')
#无风险收益率
rf <- ts(as.data.frame(market_riskfree[,3]),start=2016,freq=12)
plot(rf)
#股票收益率
ra <- ts(as.data.frame(data1[,2:30]),start=2016,freq=12)
#中证指数月收益率
rb <- ts(as.data.frame(market_riskfree[,2]),start=2016,freq=12)
plot(rb)
#单指数模型构建,求解参数
library(PerformanceAnalytics)
alpha <- CAPM.alpha(Ra=ra,Rb=rb,Rf=rf)
alpha
beta <- CAPM.beta(Ra=ra,Rb=rb,Rf=rf)
beta

#寻找正阿尔法
a<-which(alpha>0)
a
#将阿尔法排序
order(alpha)
#寻找负的阿尔法
b <- which(beta<0)
b
#萃取α排名前8的股票,注意第一列是时间
mydata <- as.matrix(cbind(data1[,8],data1[,19],data1[,20],data1[,11],data1[,12],data1[,15],data1[,22],data1[,28]))
library(Hmisc)
#求解相关系数与显著性
mydata1 <- as.matrix(rcorr(mydata))
library(corrplot)
#提取相关系数
corrdata <- mydata1[,1]$r
#相关系数矩阵可视化
corrplot(corrdata, type = "upper", order = "hclust", tl.col = "black", tl.srt = 45)
chart.Correlation(corrdata, histogram=TRUE, pch=19)

#2.共变异数矩阵的求解
#选择5档股票作为标的资产
data3 <- as.matrix(cbind(data1[,8],data1[,11],data1[,12],data1[,15],data1[,28]))
#求解5档股票各自的标准差(样本标准差)
varvector <- as.matrix(apply(data3,2,sd),nrow=5,ncol=1)
varvector
#求解5档股票的相关系数矩阵
mydata2<-as.matrix(rcorr(data3))
#提取相关系数矩阵
corrdata1 <- mydata2[,1]$r
corrdata2 <- matrix(corrdata1,nrow = 5,ncol = 5)
corrdata2
# 股票的标准差向量
varvector

#计算变异数-共变异数矩阵,R中*表示矩阵对应元素相乘

m<-cbind(rep(varvector[,1],5))
m1<-matrix(m,nrow = 5,ncol = 5)
varmatrix <- m1*corrdata2*t(m1)
ftable(varmatrix)
data3
library(timeSeries)
data4 <- as.timeSeries(data3,start=2016,freq=12)
data4

# 构建投资组合可行集
library(fPortfolio)
Frontier <- portfolioFrontier(data4,constraints = "LongOnly")
Frontier
Frontier1 <- portfolioFrontier(data4,constraints = "ShortAllow")
Frontier1
plot(Frontier)
plot(Frontier1)

绘制出不可放空的条件下的可行集,如下图:

绘制出允许放空条件下的可行集,见下图:

傲天居士

2021/07/05  阅读:22  主题:默认主题

作者介绍

傲天居士