R软件在马科维茨资产组合投资理论中的教学应用
2018-01-31高蓉
【摘要】随着经济的发展和科技的突破,当下已进入大数据时代,数据科学对金融的影响越来越大。然而R软件在金融学教学中发挥的作用还很有限,本文结合数据科学工具R软件,探讨如何在《投资学》课堂上引入软件教学,以此推广R软件在投资学课堂上的教学应用,进一步提高学生理论联系实际的实践能力。
【关键词】R语言 马科维茨投资组合 最优风险组合 资本市场线
一、《投资学》课程
《投资学》是金融学的专业基础课,具有很强的专业性和实践性。教学目标是指导学生掌握基本的投资学原理和分析方法,并在实际问题中运用这些知识。教学形式力求灵活多样,充分利用統计分析软件等多媒体工具来增强学生的兴趣和积极性。教学要求有三方面:一是掌握投资学的基本概念和基本理论,理解相关的背景和适用的条件;二是掌握基本的计算方法和理论之间的推理;三是掌握投资学理论的运用技能。投资学的教学既要重视基础知识的教育,又要强调实际应用能力的培养。
近年来,随着计算机的发展和大数据的发展,金融领域正在快步进入高科技时代,对人才的动手实践能力较以往有了更高的要求。仅仅掌握基本理论而不能解决实际问题,已经不再符合社会对金融学类学生的要求。传统的《投资学》本科课堂以基本理论为主要内容,以单向的教师讲解为主要模式,以黑板和PPT为主要方式,与学生继续深造或从事实际工作所需要的能力有一定脱节。
以《投资学》中的组合理论教学为例,传统方式主要存在两个缺点。第一,投资组合涉及到的数学知识较多较深,理论的推导和习题的计算难度都比较多,增加了教学难度,较多的学生反映课程太难太抽象,不易理解更不易应用。第二,EXCEL软件本身的计算能力也比较有限。EXCEL是一款功能强大的办公软件,但计算性能相对较差,进行复杂计算时速度较慢甚至计算机容易陷入死机,平台之间的移植性也不好,不同版本的EXCEL文件之间功能偶尔不兼容,VBA计算程序在更换计算机后常常因为兼容不好而无法运行。因此,课堂上和教材中往往都选择高度理想化的例子辅助理论的阐述,增加了理论联系实际的难度。此外,EXCEL毕竟不是数据科学工具,难以应付当下的大数据时代对培养学生数据处理能力的要求。
二、数据科学工具R软件
R软件是一款开源的统计计算软件,是一套完整的数据处理、计算和制图的软件系统,特点是统计分析功能和作图功能都非常优秀。1992年,新西兰的奥克兰大学统计系的Ross Ihaka和Robert Gentleman在AT&T贝尔实验室创立的S语言的基础上开发了R系统。S语言主要在Insightful公司的S-Plus软件中使用,R语言在免费发行的R软件中使用,R软件与S-Plus软件有很大的相似性和兼容性。R软件和源代码可以自由下载和使用,并由R开发核心志愿者小组负责开发和维护。经过20多年的发展,R语言已经成为世界上主流的数据分析语言,广泛应用于统计计算和数据分析的各个领域,包括金融计算和量化交易领域。作为一种数据分析语言,R语言具有如下的优点:
第一,R系统是一个全面的统计计算平台,提供了从传统方法到学术前沿的各种数据分析方法。几乎任何类型的数据分析工作都可以在R中完成,并且R提供了100多个与金融直接相关的包。
第二,R语言可以进行交互式的数据分析,同时具有强大图形能力,便于进行理论方法的细节研究、数据探索和展示。同时,R语言作为一种编程语言,它的语法和数据结构与主流的计算机编程语言相似,易学易用。
第三,R软件是开源软件,可以免费的下载和使用,无需考虑商业软件的授权问题。同时,开源软件的用户众多,新的方法和新的研究成果会迅速以R包的形式上传到R社区供大家下载和研究,这是其他商业软件无法比拟的。
总之,R软件为金融计算提供了大量的函数、数据类型和包,可以胜任金融领域各种数据分析和模型计算的任务,包括时间序列分析、衍生品定价以及量化交易系统的开发和评价。教师在教学过程中可以直接借鉴,使计算部分更加容易和直观,提高学生的参与度和学习兴趣。
三、马可维茨资产组合选择的R应用
投资学的一个重要问题是如何在多种风险资产中选择最好的风险资产组合,哈维.马可维茨在论文《资产组合选择》中首次提出了正式的科学理论回答这个问题,该理论也称为马可维茨投资组合理论。马科维茨使用均值刻画收益率,使用方差刻画风险,第一次将数理统计的方法引入投资组合的选择,因此该理论也叫做均值-方差模型。同时,它还标志着现代金融学的建立,自此金融学理论进入了模型化和数量化的时代。马可维茨的学生威廉.夏普随后在此基础上发展出资本资产定价模型,奠定了完整的金融经济学基础理论。马科维茨和夏普这对师生因为在金融经济学领域出色的开创性工作,与莫顿.米勒一起获得了1990年的诺贝尔经济学奖。
如果可以在课堂上适当结合R计算案例讲解最优风险资产组合模型的计算,向同学们清晰展示计算的步骤,会有利于学生对知识的理解和吸收,锻炼学生的学习能力,培养学生的综合能力,开拓学生的创新能力,提高课堂的综合教学效果。本文以马可维茨资产组合计算为例,展示R语言的计算。
(一)从互联网获取实时金融数据
R软件可以直接通过互联网下载实时的金融和经济数据。包quantmod可以下载国内股票的数据。在此之前,我们先加载包fPortfolio和包lpSolve,前者可以进行有效投资组合的计算,后者可以进行函数优化的计算。我们在上证A股中选择四支股票,浦发银行(600000),山东黄金(600547),伊利股份(600887)、康美药业(600518),并使用包quantmod的getSymbols函数,从雅虎金融下载这四只股票实时的价格时间序列,同时计算月收益率。注意,下载上交所的股票数据时,股票代码的后面需要加上ss后缀。实现的代码如下。
library(fPortfolio)endprint
library(lpSolve)
library(quantmod)
stocksymbol<-c('600000','600547','600887','600518')
stocksymbols<-paste(stocksymbol,'.ss',sep='')
stock<-list()
stock.n<-list()
for(i in stocksymbols){
stock[[i]]<-getSymbols(i,src="yahoo",from="2010-01-01", to=Sys.Date(),auto.assign=FALSE)
stock.n[[i]]<-periodReturn(stock[[i]],period='monthly')
}
names(stock.n)<-stocksymbol
得到收益率序列后,我們接着进行初步的数据处理。为了便于随后R的计算需要,我们把数据结果的形式转化为数据框,并去掉其中可能的缺失值,代码如下。
n1<-length(stock.n)
stock.d<-stock.n[[1]]
for(i in 2:n1)
{stock.d<-na.locf(merge(stock.d,stock.n[[i]],all=F))}
colnames(stock.d)<-names(stock.n)
(二)资产组合有效前沿的计算
数据处理完毕之后,接下来我们使用fPortfolio包来进行最优组合的计算。根据马尔维茨投资组合理论,优化组合的计算需要使用风险资产的均值和协方差。我们先使用fPortfolio包将数据形式转化为timeSeries对象,再使用内置函数covEstimator计算月收益率数据的均值和协方差矩阵。R语言通过程序控制数据对象,避免了直接控制数据出错的可能,而相同的计算在EXCEL中需要用单元格计算来进行,鼠标操作容易出错,股票数量越大,出错的可能性也越大。
stock.s<-as.timeSeries(stock.d)
covEstimator(stock.s)
得到的结果简化如下表1、表2所示:
接下来,我们计算均值-方差组合的有效前沿。有效前沿是风险资产的组合中风险最小的组合连成的线。包fPortfolio对上面得到的stock.s对象进行计算,以离散方式(计算前沿上的50个组合)。使用包fPortfolio需要指定以下几个参数,组合的类型(portfolioSpec)、求解方法的类型(setSolver)以及组合投资的约束(constraints="LongOnly")。通过summary函数可以看到概况和相关图示。
shortSpec<-portfolioSpec()
setSolver(shortSpec)<-"solveRshortExact"
shortFrontier<-portfolioFrontier(stock.s,spec=shortSpec,constraints="LongOnly")
summary(shortFrontier)
使用frontierPlot函数可以画出有效边界,边界上最左端的点表示方差最小的组合,也是所有风险资产的组合中方差最小的组合,使用minvariancePoints函数可以在有效边界上标示出方差最小的组合点。程序如下。
Frontier<-shortFrontier
frontierPlot(Frontier,frontier="both",risk="Sigma",type="l",
title=F,labels=F)
title('有效边界',xlab='标准差',ylab='预期收益率')
minvariancePoints(Frontier,pch=19,col="red")
找到了方差最小的投资组合,我们可以看一看其中各个证券的权重,并将权重用条形图绘出。
MVP<-minvariancePortfolio(stock.s)
MVP.portfolio<-slot(slot(MVP,'portfolio'),'portfolio')
MVP.weights<-MVP.portfolio$weights
MVP.weights
barplot(MVP.weights[which(MVP.weights!=0)],main="最小方差投资组合",
xlab="资产",ylab="权重",
col=topo.colors(4),beside=TRUE)
legend("topright",names(MVP.weights[which(MVP.weights!=0)]),
cex=1,col=topo.colors(4),pch=19)
其中,各个证券的权重如下表3所示:
在有效边界上,我们也可以计算任意投资组合的组成权重。比如,设定预期收益为0.001,我们来计算相应的组合。
mu<-0.001
Spec<-portfolioSpec()
setSolver(Spec)<-"solveRshortExact"
setTargetReturn(Spec)<-muendprint
efficientPortfolio(stock.s,Spec)
得到该组合的情况,简化如下表4、表5:
(三)最优风险组合的计算
找出了有效边界,再考虑无风险资产,找出从无风险资产出发,与风险资产的有效边界相切的切线,就是资本市场线,相应的切点表示最优的风险组合。根据基金分离定理,每个投资者都会选择这种最优的风险组合与无风险资产的组合,只是根据每个人自身的风险厌恶程度的不同,在最优风险组合和无风险资产之间的配置比例不同。
假设无风险资产的收益率为0.002,利用tangencyPortfolio函数,我们能得到切点组合,记为M,代码如下。
RiskF=portfolioSpec()
setRiskFreeRate(RiskF)=0.002
setSolver(RiskF)<-"solveRshortExact"
M=tangencyPortfolio(stock.s,spec=RiskF,constraints="Short")
summary(M)
M.portfolio<-slot(slot(M,'portfolio'),'portfolio')
M.return<-M.portfolio$targetReturn[2]
M.sigma<-M.portfolio$targetRisk[2]
切点组合M的权重情况可以通过饼图展示,如图所示。
画出资本市场线的图形,如图所示。
Frontier=portfolioFrontier(stock.s,spec=RiskF,constraints= "Short")
frontierPlot(Frontier,risk="Sigma",lwd=2,type='l',xlim= c(0.05,0.12),
title=F,labels=F)
tangencyLines(Frontier,risk="Sigma",col="blue",lwd=1)
##plot Market Portfolio
cmlPoints(Frontier,pch=19,col="purple")
text(x=M.sigma+0.001,y=M.return+0.001,'M',cex=1)
title('投资组合和资本市场线',xlab='标准差',ylab='预期收益率')
minvariancePoints(Frontier,pch=19,col="red")
四、结论
确定有效的投资组合是一个复杂的决策过程,数学推导过程比较抽象和枯燥。在投资学教学过程中应用R语言进行投资组合的计算,既能使学生感受投资学的基本原理,又能让学生从直观上感受到投资学的意义,发挥出计算机辅助的高效作用。这样的课堂教学设计,不仅符合学生的认知规律,而且学生的接受速度快,对理论的理解也更加深刻,学生在学习过程中既得到了知识,又培养了创新能力。在实际的教学中,可以进一步结合知识点设计新的计算实验,有效结合理论教学与实验教学,达到不断提高学生实践能力的目的。
参考文献
[1]盖尔盖伊.量化金融R语言初级教程[M].人民邮电出版社,2016.
[2]盖尔盖伊.量化金融R语言高级教程[M].人民邮电出版社,2016.
[3]D Würtz.Portfolio Optimization with R/Rmetrics, Rmetrics eBook[M]. Rmetrics Association and Finance Online,Zurich.2009.
作者簡介:高蓉(1982-),陕西安康人,博士,任职于杭州电子科技大学经济学院金融系讲师,毕业于南开大学经济学院金融系,研究方向:资产定价、金融工程、数据科学应用。endprint