R语言与马克维茨资产组公道论进修条记(fportfolio包简介)
当前位置:以往代写 > 其他教程 >R语言与马克维茨资产组公道论进修条记(fportfolio包简介)
2019-06-14

R语言与马克维茨资产组公道论进修条记(fportfolio包简介)

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等函数配置它们。

如:

[plain] view plaincopyprint?

  1. library(fPortfolio)  

[plain] view plaincopyprint?

  1. myspec<-portfolioSpec()  
  2. getType(myspec)  
  3. setType(myspec)<-“CVaR”  
  4. setRiskFreeRate(myspec)<-0.05  

2、  资产数据(portfolioData)

这个是最重要的部门了,假如不能导入数据,那么我们的尽力将要白搭。配置数据的函数为portfolioData。参数如下:

function (data, spec =portfolioSpec())

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

#p#分页标题#e#

[plain] view plaincopyprint?

  1. lppData<-portfolioData(data=100*LPP2005.RET,spec= portfolioSpec())#(对数据乘上100是为了转换为收益率) style="font-size: 18px;">  
  2. 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)

#p#分页标题#e#

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

关于这几种环境,portfolioconstraints类里提供了longonly(不许卖空),short(没有限制),尚有很风雅的minW[],maxW[]

对付这几个,我们照旧以LPP2005为例来展示:

[plain] view plaincopyprint?

  1. Data<-100*LPP2005.RET  
  2. myspec<-portfolioSpec()  
  3. constraints<-“longonly”  
  4. defaultconstrains<-portfolioConstraints(Data,myspec,constraints)  
  5. 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

        雷同的:

#p#分页标题#e#

[plain] view plaincopyprint?

  1. constraints<-“short”  
  2. defaultconstrains<-portfolioConstraints(Data,myspec,constraints)  
  3. print(defaultconstrains)  
  4.    
  5.    
  6. b1<-“minW[1:9]=0.1”  
  7. b2<-“maxW[1:5]=0.5”  
  8. b3<-“maxW[6:9]=c(0.3,0.4,0.5,0.7)”  
  9. constraints<-c(b1,b2,b3)  
  10. defaultconstrains<-portfolioConstraints(Data,myspec,constraints)  
  11. 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.

关于均值方差模子的成立及处理惩罚待续。。。

    关键字:

在线提交作业