R语言与马克维茨资产组合理论学习笔记(fportfolio包简介)


       说到投资学里著名的马克维茨资产方差组合的想法,来自于我们通常所说的“不要把鸡蛋放在一个篮子里”。事实也确实如此,在一个有效市场上,单纯投资一只股票或风险债券的收益风险比值是要大于一个资产组合的。

       关于马克维茨的均值方差模型,我们略去数学推导简单介绍如下:

       投资者将一笔给定的资金在一定时期进行投资。在期初,他购买一些证券,然后在期末卖出。那么在期初他要决定购买哪些证券以及资金在这些证券上如何分配,也就是说投资者需要在期初从所有可能的证券组合中选择一个最优的组合。这时投资者的决策目标有两个:尽可能高的收益率和尽可能低的不确定性风险。最好的目标应是使这两个相互制约的目标达到最佳平衡。由此建立起来的投资模型即为均值-方差模型。

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

  1、投资者在考虑每一次投资选择时,其依据是某一持仓时间内的证券收益的概率分布。

  2、投资者是根据证券的期望收益率估测证券组合的风险。

  3、投资者的决定仅仅是依据证券的风险和收益。

  4、在一定的风险水平上,投资者期望收益最大;相对应的是在一定的收益水平上,投资者希望风险最小。

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

  目标函数:minб2(rp)=∑∑xixjCov(ri-rj)

  rp= ∑ xiri

  限制条件: 1=∑Xi (允许卖空)

  或 1=∑Xi xi>≥0(不允许卖空)

  其中rp为组合收益, ri为第i只股票的收益,xi、 xj为证券 i、j的投资比例,б2(rp)为组合投资方差(组合总风险),Cov (ri 、rj ) 为两个证券之间的协方差。该模型为现代证券投资理论奠定了基础。上式表明,在限制条件下求解Xi 证券收益率使组合风险б2(rp )最小,可通过朗格朗日目标函数求得。其经济学意义是,投资者可预先确定一个期望收益,通过上式可确定投资者在每个投资项目(如股票)上的投资比例(项目资金分配),使其总投资风险最小。不同的期望收益就有不同的最小方差组合,这就构成了最小方差集合。

         一般的投资组合的计算都需要用到最优化方法,在允许卖空的条件下,我们可以考虑用拉格朗日乘法求解约束最值。对于不允许卖空这一符合当前股市实际的模型,需要的数学知识更为复杂。

         今天分享的内容就是利用R语言的程序包fPortfolio来构建有效资产组合,从而进行合理的投资。

一、fPortfolio包的简要介绍
          我们说到一个投资组合有四个要素需要考虑:投资模型,资产数据,投资约束条件,资产选择函数。fPortfolio包的4个主要的类(class)就是围绕这4个要素设立的。

1、  投资模型(portfolioSpec)
          一个投资模型包括投资的方法,也就是模型的类别(如:均值方差模型,均值—VAR模型,均值—下偏矩模型等);优化的对象(前面提到的目标函数,如风险最小,收益最大等);估计风险的方法(如马克维茨提到的利用协方差得到的β值测定风险)等诸多因素。

           一个组合还需要提供一些必要的信息:预期收益,预期风险,无风险利率(这个通常使用一年期的国债利率)等

           这些在设定模型时十分重要,在R中设置模型时参数列表如下:

portfolioSpec(

   model = list(type = "MV", optimize = "minRisk",

       estimator = "covEstimator", tailRisk = list(),

       params = list(alpha = 0.05, a = 1)),

   portfolio = list(weights = NULL, targetReturn = NULL,

        targetRisk = NULL, riskFreeRate =0, nFrontierPoints = 50,

       status = NA),

   optim = list(solver = "solveRquadprog", objective = NULL,

       options = list(meq = 2), control = list(), trace = FALSE),

   messages = list())

         其中optim设置最优化的处理,暂时可以采用默认的方法。

        对参数的设定我们可以在建模伊始便设置好,也可以通过settype,setriskFreeRate等函数设置它们。

如:

library(fPortfolio)
myspec<-portfolioSpec()
getType(myspec)
setType(myspec)<-"CVaR"
setRiskFreeRate(myspec)<-0.05


2、  资产数据(portfolioData)

这个是最重要的部分了,如果不能导入数据,那么我们的努力将要白费。设置数据的函数为portfolioData。参数如下:

function (data, spec =portfolioSpec())

我们以R中的内置数据LPP2005.RET为例:

lppData<-portfolioData(data=100*LPP2005.RET,spec= portfolioSpec())#(对数据乘上100是为了转换为收益率)
print(lppData)


输出如下:

Head/TailSeries Data:#输出部分数据可以使用getData()看到全部数据

Head/Tail Series Data:


GMT 
                  SBI       SPI        SII        LMI       MPI        ALT
2005-11-01 -0.0612745 0.8414595 -0.3190926 -0.1108882 0.1548062 -0.2572971
2005-11-02 -0.2762009 0.2519342 -0.4117638 -0.1175939 0.0342876 -0.1141604
2005-11-03 -0.1153092 1.2707292 -0.5209409 -0.0992456 1.0502959  0.5007442
                LPP25      LPP40      LPP60
2005-11-01 -0.0130008  0.0199980  0.0809672
2005-11-02 -0.1561421 -0.1120404 -0.0469730
2005-11-03  0.1541418  0.3317548  0.5731589
GMT 
                  SBI        SPI        SII        LMI        MPI
2007-04-09  0.0000000  0.0000000  0.0000000 -0.1032441  0.8179152
2007-04-10 -0.0688995  0.6329425 -0.0092300 -0.0031500 -0.1428291
2007-04-11  0.0306279 -0.1044170 -0.1339276 -0.0090900 -0.0991064
                  ALT      LPP25      LPP40      LPP60
2007-04-09  0.7524048  0.1328587  0.2557949  0.3991790
2007-04-10  0.1876307  0.0146495  0.0411114  0.0832712
2007-04-11 -0.1934817 -0.0347960 -0.0586108 -0.0890450


Statistics:


$mean
         SBI          SPI          SII          LMI          MPI 
0.0000406634 0.0841754390 0.0238935607 0.0055315332 0.0590515119 
         ALT        LPP25        LPP40        LPP60 
0.0857678873 0.0233183703 0.0354062058 0.0510727462 


$Cov
                SBI         SPI          SII           LMI         MPI
SBI    0.0158995536 -0.01274142 0.0017993835  0.0098038652 -0.01588837
SPI   -0.0127414183  0.58461212 0.0303364848 -0.0140746906  0.41159843
SII    0.0017993835  0.03033648 0.0851379491  0.0009250538  0.02481619
LMI    0.0098038652 -0.01407469 0.0009250538  0.0149511080 -0.02332223
MPI   -0.0158883679  0.41159843 0.0248161909 -0.0233222329  0.53503263
ALT   -0.0132379421  0.29839619 0.0155489201 -0.0172468707  0.36480523
LPP25  0.0050112372  0.11133544 0.0138797854  0.0024643014  0.11478467
LPP40  0.0003831043  0.18041977 0.0153109453 -0.0026813119  0.19469700
LPP60 -0.0057557573  0.27504649 0.0180309350 -0.0092520455  0.29906954
              ALT       LPP25         LPP40        LPP60
SBI   -0.01323794 0.005011237  0.0003831043 -0.005755757
SPI    0.29839619 0.111335435  0.1804197730  0.275046490
SII    0.01554892 0.013879785  0.0153109453  0.018030935
LMI   -0.01724687 0.002464301 -0.0026813119 -0.009252045
MPI    0.36480523 0.114784674  0.1946970049  0.299069544
ALT    0.32312418 0.083773968  0.1446259835  0.222719923
LPP25  0.08377397 0.032642843  0.0493467943  0.071453186
LPP40  0.14462598 0.049346794  0.0790194916  0.118050956
LPP60  0.22271992 0.071453186  0.1180509555  0.179289420


$estimator
[1] "covEstimator"


$mu
         SBI          SPI          SII          LMI          MPI 
0.0000406634 0.0841754390 0.0238935607 0.0055315332 0.0590515119 
         ALT        LPP25        LPP40        LPP60 
0.0857678873 0.0233183703 0.0354062058 0.0510727462 


$Sigma
                SBI         SPI          SII           LMI         MPI
SBI    0.0158995536 -0.01274142 0.0017993835  0.0098038652 -0.01588837
SPI   -0.0127414183  0.58461212 0.0303364848 -0.0140746906  0.41159843
SII    0.0017993835  0.03033648 0.0851379491  0.0009250538  0.02481619
LMI    0.0098038652 -0.01407469 0.0009250538  0.0149511080 -0.02332223
MPI   -0.0158883679  0.41159843 0.0248161909 -0.0233222329  0.53503263
ALT   -0.0132379421  0.29839619 0.0155489201 -0.0172468707  0.36480523
LPP25  0.0050112372  0.11133544 0.0138797854  0.0024643014  0.11478467
LPP40  0.0003831043  0.18041977 0.0153109453 -0.0026813119  0.19469700
LPP60 -0.0057557573  0.27504649 0.0180309350 -0.0092520455  0.29906954
              ALT       LPP25         LPP40        LPP60
SBI   -0.01323794 0.005011237  0.0003831043 -0.005755757
SPI    0.29839619 0.111335435  0.1804197730  0.275046490
SII    0.01554892 0.013879785  0.0153109453  0.018030935
LMI   -0.01724687 0.002464301 -0.0026813119 -0.009252045
MPI    0.36480523 0.114784674  0.1946970049  0.299069544
ALT    0.32312418 0.083773968  0.1446259835  0.222719923
LPP25  0.08377397 0.032642843  0.0493467943  0.071453186
LPP40  0.14462598 0.049346794  0.0790194916  0.118050956
LPP60  0.22271992 0.071453186  0.1180509555  0.179289420

注:对于每一部分的查看可以使用$,也可以使用getData,getStatistics来查看,修改用对应的set函数。

这里data的类型是list,也就是这些数据要做成一个dataframe扔进函数里。

3、  约束条件(portfolioconstraint)

对于约束我想至少是有这么几种:允许卖空,存在无风险借贷;不允许卖空,存在无风险借贷;允许卖空,不存在无风险借贷;不许卖空,也没有无风险借贷。而我们的约束条件就是要处理这些东西的。

关于这几种情况,portfolioconstraints类里提供了longonly(不许卖空),short(没有限制),还有很精细的minW[],maxW[]

对于这几个,我们还是以LPP2005为例来展示:

Data<-100*LPP2005.RET
myspec<-portfolioSpec()
constraints<-"longonly"
defaultconstrains<-portfolioConstraints(Data,myspec,constraints)
print(defaultconstrains)


输出结果:(注意边界条件)

Title:
 Portfolio Constraints


Lower/Upper Bounds:
      SBI SPI SII LMI MPI ALT LPP25 LPP40 LPP60
Lower   0   0   0   0   0   0     0     0     0
Upper   1   1   1   1   1   1     1     1     1


Equal Matrix Constraints:
       ceq          SBI         SPI         SII          LMI         MPI
Return  NA  4.06634e-05  0.08417544  0.02389356  0.005531533  0.05905151
Budget  -1 -1.00000e+00 -1.00000000 -1.00000000 -1.000000000 -1.00000000
               ALT       LPP25       LPP40       LPP60
Return  0.08576789  0.02331837  0.03540621  0.05107275
Budget -1.00000000 -1.00000000 -1.00000000 -1.00000000

        类似的:

constraints<-"short"
defaultconstrains<-portfolioConstraints(Data,myspec,constraints)
print(defaultconstrains)
 
 
b1<-"minW[1:9]=0.1"
b2<-"maxW[1:5]=0.5"
b3<-"maxW[6:9]=c(0.3,0.4,0.5,0.7)"
constraints<-c(b1,b2,b3)
defaultconstrains<-portfolioConstraints(Data,myspec,constraints)
print(defaultconstrains)


不再给出运行结果。

 
  4、选择函数(portfolio)
主要的函数有以下几个:
efficientPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
 
maxratioPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
tangencyPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
 
minriskPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
minvariancePortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
 
maxreturnPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
 
注:关于函数的一些描述
Efficient Portfolio:
An efficient portfolio is a portfolio which lies on the efficient frontier. The efficientPortfolio function returns the properties of the efficient portfolio as an S4 object of class fPORTFOLIO.
 
Minumum Risk or Tangency Portfolio:
The function tangencyPortfolio returns the portfolio with the highest return/risk ratio on the efficient frontier. For the Markowitz portfolio this is the same as the Sharpe ratio. To find this point on the frontier the return/risk ratio calculated from the target return and target risk returned by the function efficientPortfolio.
 
Global minimum risk or Minimum Variance Portfolio:
The function minvariancePortfolio returns the portfolio with the minimal risk on the efficient frontier. To find the minimal risk point the target risk returned by the function efficientPortfolio is minimized.
 
Maximum Return Portfolio:
The function maxreturnPortfolio returns the portfolio with the maximal return for a fixed target risk.

关于均值方差模型的建立及处理待续。。。

你可能感兴趣的:(R语言与马克维茨资产组合理论学习笔记(fportfolio包简介))