Frontera eficiente en R

Se construye la frontera eficiente  utilizando un archivo con los rendimientos diarios de 5 acciones. Se utilizan los multiplicadores de Lagrange y la condición de no negatividad utilizando los paquetes quadprog y Rglpk.

Puede consultar el libro "Introducción al riesgo financiero" en  

https://1drv.ms/b/s!Aj-hHTVbsx01h4JmNiA9O57JQuANWg?e=l4IFbm


>C=read.csv("C:/Users/User/Documents/ORLANDO/USTA171/RIESGO/datosacc2.csv",header=TRUE,dec=".",sep=";")
> attach(C)
The following objects are masked from A:
    cargos, davivienda, éxito, ic20, isa, nutresa
> n=nrow(C)
> #Portafolio de mínimo riesgo(Lagrange)
> ###################################
> z=qnorm(.01)
> s=c(100000000,100000000,100000000,100000000,100000000)
> w=s/sum(s)
> rend.medio=0
> varianza=0
> desv.std=0
> VaR.indiv=0
> covar=cov(C[1:5])
> covar
                 cargos          isa   davivienda      nutresa        éxito
cargos     2.923125e-04 1.040143e-04 1.030154e-04 7.426151e-05 1.135951e-04
isa        1.040143e-04 2.834763e-04 8.519429e-05 8.814294e-05 1.380720e-04
davivienda 1.030154e-04 8.519429e-05 2.322348e-04 7.598694e-05 1.320829e-04
nutresa    7.426151e-05 8.814294e-05 7.598694e-05 1.487497e-04 9.430535e-05
éxito      1.135951e-04 1.380720e-04 1.320829e-04 9.430535e-05 4.633249e-04
> Z0=cbind(rbind(2*covar,c(1,1,1,1,1)),c(1,1,1,1,1,0))
> Q0=c(0,0,0,0,0,1)
> Z0.inv=solve(Z0)
> W.aux=Z0.inv%*%Q0
> W.min=W.aux[1:5,]; W.min
    cargos        isa davivienda    nutresa      éxito
0.13847363 0.12521250 0.21259969 0.51216925 0.01154493
> # Las anteriores son las wi's del portafolio de mínimo riesgo
> rend.medio=sapply(C[1:5],mean)
> rend.Pmin=W.min%*%rend.medio
> varia.Pmin=t(W.min)%*%covar%*%W.min
> VaR.Pmin=z*sum(s)*sqrt(varia.Pmin)
> G=rbind(rend.Pmin,varia.Pmin,VaR.Pmin)
> colnames(G)=c("Portafolio Mínimo")
> rownames(G)=c("Rendimiento.Pmin","Varianza.Pmin","VaR.Pmin"); G
                 Portafolio Mínimo
Rendimiento.Pmin     -7.992820e-06
Varianza.Pmin         1.147484e-04
VaR.Pmin             -1.246000e+07
> ### Portafolios con rend. exógenos ###
> rend.exo=seq(rend.Pmin,0.00004,0.000005)
> Z2=cbind(rbind(2*covar,c(rend.medio),c(1,1,1,1,1)),c(rend.medio,0,0),c(1,1,1,1,1,0,0))
> Z2.inv=solve(Z2)
> varia.exo=0
> VaR.P<-0
> W=matrix(0,length(rend.exo),5)
> for(i in 1:length(rend.exo))
+ {
+   Q2=c(0,0,0,0,0,rend.exo[i],1)
+   W2.aux=Z2.inv%*%Q2
+   W[i,]=W2.aux[1:5,]
+   varia.exo[i]=t(W[i,])%*%covar%*%W[i,]
+   VaR.P[i]=z*sum(s)*sqrt(t)*sqrt(varia.exo[i])
+ }
> plot(c(varia.Pmin,varia.exo),c(rend.Pmin,rend.exo),pch=16,type="o",xlab="Varianza",ylab="Rendimiento",main="Frontera Eficiente")














> mark=cbind(c(rend.Pmin,rend.exo),c(varia.Pmin,varia.exo))
> colnames(mark)=c("Rendimiento","Varianza"); mark

      
 Rendimiento     Varianza
 [1,] -7.992820e-06 0.0001147484
 [2,] -7.992820e-06 0.0001147484
 [3,] -2.992820e-06 0.0001147511
 [4,]  2.007180e-06 0.0001147590
 [5,]  7.007180e-06 0.0001147723
 [6,]  1.200718e-05 0.0001147909
 [7,]  1.700718e-05 0.0001148148
 [8,]  2.200718e-05 0.0001148440
 [9,]  2.700718e-05 0.0001148785
[10,]  3.200718e-05 0.0001149183
[11,]  3.700718e-05 0.0001149634
> W
           [,1]      [,2]      [,3]      [,4]          [,5]
 [1,] 0.1384736 0.1252125 0.2125997 0.5121692  1.154493e-02
 [2,] 0.1393046 0.1267696 0.2142988 0.5103916  9.235398e-03
 [3,] 0.1401356 0.1283266 0.2159980 0.5086139  6.925863e-03
 [4,] 0.1409666 0.1298837 0.2176971 0.5068362  4.616327e-03
 [5,] 0.1417976 0.1314408 0.2193963 0.5050586  2.306791e-03
 [6,] 0.1426286 0.1329979 0.2210954 0.5032809 -2.744304e-06
 [7,] 0.1434596 0.1345549 0.2227945 0.5015032 -2.312280e-03
 [8,] 0.1442905 0.1361120 0.2244937 0.4997256 -4.621816e-03
 [9,] 0.1451215 0.1376691 0.2261928 0.4979479 -6.931351e-03
[10,] 0.1459525 0.1392262 0.2278920 0.4961702 -9.240887e-03
> VaR.P
 [1] -12459999 -12460143 -12460576 -12461296 -12462305 -12463601 -12465186
 [8] -12467058 -12469218 -12471666

> #Portafolio con no negatividad
> library(quadprog)
> library(Rglpk)

> Medias=sapply(C[1:5],mean)
> Medias
       cargos           isa    davivienda       nutresa         éxito
 0.0003415332  0.0003631495  0.0003173994 -0.0002984070 -0.0013340188
> Desviaciones=sapply(C[1:5],sd)
> Desviaciones
    cargos        isa davivienda    nutresa      éxito
0.01709715 0.01683675 0.01523925 0.01219630 0.02152498
> Covarianzas=cov(C[1:5])
> Covarianzas
                 cargos          isa   davivienda      nutresa        éxito
cargos     2.923125e-04 1.040143e-04 1.030154e-04 7.426151e-05 1.135951e-04
isa        1.040143e-04 2.834763e-04 8.519429e-05 8.814294e-05 1.380720e-04
davivienda 1.030154e-04 8.519429e-05 2.322348e-04 7.598694e-05 1.320829e-04
nutresa    7.426151e-05 8.814294e-05 7.598694e-05 1.487497e-04 9.430535e-05
éxito      1.135951e-04 1.380720e-04 1.320829e-04 9.430535e-05 4.633249e-04
> Correlaciones=cor(C[1:5])
> Correlaciones
              cargos       isa davivienda   nutresa     éxito
cargos     1.0000000 0.3613357  0.3953801 0.3561329 0.3086692
isa        0.3613357 1.0000000  0.3320385 0.4292410 0.3809821
davivienda 0.3953801 0.3320385  1.0000000 0.4088343 0.4026615
nutresa    0.3561329 0.4292410  0.4088343 1.0000000 0.3592241
éxito      0.3086692 0.3809821  0.4026615 0.3592241 1.0000000
> cova=c(2*Covarianzas)
> cova
 [1] 0.0005846250 0.0002080285 0.0002060308 0.0001485230 0.0002271903
 [6] 0.0002080285 0.0005669525 0.0001703886 0.0001762859 0.0002761440
[11] 0.0002060308 0.0001703886 0.0004644696 0.0001519739 0.0002641658
[16] 0.0001485230 0.0001762859 0.0001519739 0.0002974994 0.0001886107
[21] 0.0002271903 0.0002761440 0.0002641658 0.0001886107 0.0009266498
> cov2=matrix((cova),nrow=5)
> cov2
             [,1]         [,2]         [,3]         [,4]         [,5]
[1,] 0.0005846250 0.0002080285 0.0002060308 0.0001485230 0.0002271903
[2,] 0.0002080285 0.0005669525 0.0001703886 0.0001762859 0.0002761440
[3,] 0.0002060308 0.0001703886 0.0004644696 0.0001519739 0.0002641658
[4,] 0.0001485230 0.0001762859 0.0001519739 0.0002974994 0.0001886107
[5,] 0.0002271903 0.0002761440 0.0002641658 0.0001886107 0.0009266498
> a=matrix(1,ncol=5)
> a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
> a1=rbind(cov2,a)
> a1
             [,1]         [,2]         [,3]         [,4]         [,5]
[1,] 0.0005846250 0.0002080285 0.0002060308 0.0001485230 0.0002271903
[2,] 0.0002080285 0.0005669525 0.0001703886 0.0001762859 0.0002761440
[3,] 0.0002060308 0.0001703886 0.0004644696 0.0001519739 0.0002641658
[4,] 0.0001485230 0.0001762859 0.0001519739 0.0002974994 0.0001886107
[5,] 0.0002271903 0.0002761440 0.0002641658 0.0001886107 0.0009266498
[6,] 1.0000000000 1.0000000000 1.0000000000 1.0000000000 1.0000000000
> b=c(1,1,1,1,1,0)
> b1=matrix(b,ncol=1)
> Zeta=cbind(a1,b1)
> Zeta
             [,1]         [,2]         [,3]         [,4]         [,5] [,6]
[1,] 0.0005846250 0.0002080285 0.0002060308 0.0001485230 0.0002271903    1
[2,] 0.0002080285 0.0005669525 0.0001703886 0.0001762859 0.0002761440    1
[3,] 0.0002060308 0.0001703886 0.0004644696 0.0001519739 0.0002641658    1
[4,] 0.0001485230 0.0001762859 0.0001519739 0.0002974994 0.0001886107    1
[5,] 0.0002271903 0.0002761440 0.0002641658 0.0001886107 0.0009266498    1
[6,] 1.0000000000 1.0000000000 1.0000000000 1.0000000000 1.0000000000    0
> Zetacero=solve(Zeta)
> Zetacero
             [,1]          [,2]          [,3]          [,4]          [,5]
[1,] 2169.9098298  -499.0242467  -729.0365711  -774.6164492 -167.23256282
[2,] -499.0242467  2375.5575370  -313.1612206 -1170.1139103 -393.25815932
[3,] -729.0365711  -313.1612206  2845.2581328 -1298.9739432 -504.08639784
[4,] -774.6164492 -1170.1139103 -1298.9739432  3625.4141490 -381.70984638
[5,] -167.2325628  -393.2581593  -504.0863978  -381.7098464 1446.28696635
[6,]    0.1384736     0.1252125     0.2125997     0.5121692    0.01154493
              [,6]
[1,]  0.1384736308
[2,]  0.1252124995
[3,]  0.2125996887
[4,]  0.5121692470
[5,]  0.0115449339
[6,] -0.0002294968
> Q=c(0,0,0,0,0,1)
> Q0=matrix(Q)
> W0=Zetacero%*%Q0
> W0
              [,1]
[1,]  0.1384736308
[2,]  0.1252124995
[3,]  0.2125996887
[4,]  0.5121692470
[5,]  0.0115449339
[6,] -0.0002294968
> W0p=W0[-6]
> W0p
[1] 0.13847363 0.12521250 0.21259969 0.51216925 0.01154493
> W0p1=t(W0p)
> W0p1
          [,1]      [,2]      [,3]      [,4]       [,5]
[1,] 0.1384736 0.1252125 0.2125997 0.5121692 0.01154493
> REMIN=W0p1%*%Medias
> REMIN
             [,1]
[1,] -7.99282e-06
> VARMIN=W0p1%*%Covarianzas%*%W0p
> VARMIN
             [,1]
[1,] 0.0001147484
> mu=matrix(Medias)
> sigma=matrix(Covarianzas,nrow=5)
> N=length(mu)
> one=rep(1,N)
> x=c(one,mu)
> Alo=matrix(x,ncol=2)
> Alo
     [,1]          [,2]
[1,]    1  0.0003415332
[2,]    1  0.0003631495
[3,]    1  0.0003173994
[4,]    1 -0.0002984070
[5,]    1 -0.0013340188
> maxi=REMIN+9*0.00003
> maxi
             [,1]
[1,] 0.0002620072
> ngrid<-25
> muP<-seq(REMIN,maxi,length.out=ngrid)
> sigmaP<-muP
> sigmaP2<-muP
> wP<-matrix(0,N,ngrid)
> wP2<-wP
> IMatrix<-matrix(0,5,5)
> diag(IMatrix)<-1
> A<-cbind(Alo,IMatrix)
> for(i in 1:ngrid)
+ {
+   f<-rep(0,N)
+   b0<-c(1,muP[i])
+   b<- c(b0,rep(-0.0000001,N))
+  
+   sol<-solve.QP(sigma,f,A,b,meq=0)  
+   wP2[,i]=sol$solution
+   sigmaP2[i]=wP2[,i]%*%sigma%*%wP2[,i]
+ }
> wP2
           [,1]        [,2]        [,3]       [,4]       [,5]       [,6]
[1,] 0.13847363 0.140343354 0.142213077  0.1458630  0.1500200  0.1541770
[2,] 0.12521250 0.128715916 0.132219333  0.1383263  0.1451750  0.1520237
[3,] 0.21259969 0.216422758 0.220245828  0.2262234  0.2328147  0.2394061
[4,] 0.51216925 0.508169493 0.504169739  0.4895874  0.4719904  0.4543934
[5,] 0.01154493 0.006348479 0.001152024 -0.0000001 -0.0000001 -0.0000001
           [,7]       [,8]       [,9]      [,10]      [,11]      [,12]
[1,]  0.1583340  0.1624910  0.1666480  0.1708050  0.1749620  0.1791190
[2,]  0.1588723  0.1657210  0.1725697  0.1794183  0.1862670  0.1931157
[3,]  0.2459974  0.2525887  0.2591801  0.2657714  0.2723627  0.2789541
[4,]  0.4367964  0.4191994  0.4016024  0.3840054  0.3664084  0.3488114
[5,] -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001
          [,13]      [,14]      [,15]      [,16]      [,17]      [,18]
[1,]  0.1832760  0.1874330  0.1915900  0.1957470  0.1999040  0.2040610
[2,]  0.1999644  0.2068130  0.2136617  0.2205104  0.2273590  0.2342077
[3,]  0.2855454  0.2921367  0.2987281  0.3053194  0.3119107  0.3185021
[4,]  0.3312144  0.3136174  0.2960204  0.2784233  0.2608263  0.2432293
[5,] -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001
          [,19]      [,20]      [,21]      [,22]      [,23]      [,24]
[1,]  0.2082180  0.2123750  0.2165320  0.2206890  0.2248460  0.2290030
[2,]  0.2410564  0.2479051  0.2547537  0.2616024  0.2684511  0.2752998
[3,]  0.3250934  0.3316847  0.3382761  0.3448674  0.3514587  0.3580501
[4,]  0.2256323  0.2080353  0.1904383  0.1728413  0.1552443  0.1376473
[5,] -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001 -0.0000001
          [,25]
[1,]  0.2331600
[2,]  0.2821484
[3,]  0.3646414
[4,]  0.1200503
[5,] -0.0000001
> sigmaP2
 [1] 0.0001147484 0.0001147619 0.0001148022 0.0001148879 0.0001150601
 [6] 0.0001153204 0.0001156687 0.0001161051 0.0001166295 0.0001172420
[11] 0.0001179425 0.0001187310 0.0001196076 0.0001205722 0.0001216249
[16] 0.0001227656 0.0001239943 0.0001253111 0.0001267159 0.0001282088
[21] 0.0001297897 0.0001314587 0.0001332157 0.0001350607 0.0001369938
> f<-0.01
> for(i in 1:ngrid)
+ {
+   if(sigmaP[i]==min(sigmaP)) imin<-i
+   if(sigmaP2[i]==min(sigmaP2)) imin2<-i
+ }
> plot(sigmaP2[imin2:ngrid],muP[imin2:ngrid],pch=16,type="o",lty=1,
+      main="",xlab="Varianza",ylab="Rendimiento",
+      ylim=c(REMIN,maxi))
















> cbind(sigmaP2,muP)
           sigmaP2           muP
 [1,] 0.0001147484 -7.992820e-06
 [2,] 0.0001147619  3.257180e-06
 [3,] 0.0001148022  1.450718e-05
 [4,] 0.0001148879  2.575718e-05



 [5,] 0.0001150601  3.700718e-05
 [6,] 0.0001153204  4.825718e-05
 [7,] 0.0001156687  5.950718e-05
 [8,] 0.0001161051  7.075718e-05
 [9,] 0.0001166295  8.200718e-05
[10,] 0.0001172420  9.325718e-05
[11,] 0.0001179425  1.045072e-04
[12,] 0.0001187310  1.157572e-04
[13,] 0.0001196076  1.270072e-04
[14,] 0.0001205722  1.382572e-04
[15,] 0.0001216249  1.495072e-04
[16,] 0.0001227656  1.607572e-04
[17,] 0.0001239943  1.720072e-04
[18,] 0.0001253111  1.832572e-04
[19,] 0.0001267159  1.945072e-04
[20,] 0.0001282088  2.057572e-04
[21,] 0.0001297897  2.170072e-04
[22,] 0.0001314587  2.282572e-04
[23,] 0.0001332157  2.395072e-04
[24,] 0.0001350607  2.507572e-04
[25,] 0.0001369938  2.620072e-04

> #########

No hay comentarios.:

Publicar un comentario