glPF: Calculate portfolio weights for Garlappi model 1.2.2-1.2.3

Description Usage Arguments Value Examples

View source: R/Garlappi_PF_one.R

Description

Calculate portfolio weights for Garlappi model 1.2.2-1.2.3: Uncertainty about expected returns estimated jointly for all assets and subgroups thereof.

Usage

1
glPF(mu, Sigma, gamma = 3, epsilon, rf)

Arguments

mu,

list of vectors of mus for portfolio subsets

Sigma,

overall covariance matrix

gamma

optional, coefficient of risk aversion

epsilon,

list of coefficients of parameter uncertainty for each subset of parameters defined by mu

rf

optional, should the case with or without the risk-free rate be calculated (only for one PU parameter)

Value

output of function: - vector of optimal weights given PU - sturb: by how much is investment in the optimal portfolio reduced (epsilon vs Sharpe ratio of the other portfolio)

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
require(xts)
data(X)
mu_in <- list(mu1=colMeans(X[,1:4]),mu2=colMeans(X[,5:7]))
Sigma_in <- cov(X[,1:7])
gamma <- 3
## First calculate the tangency portfolio for the first 4 assets without parameter uncertainty
round(c(1/gamma*.mpinv(Sigma_in[1:4,1:4])%*%mu_in[[1]]),4)
# Then do it using the function
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=0),rf=TRUE)$w,4)
# Now, we allow for parameter uncertainty for all 4 assets together
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=0.1),rf=TRUE)$w,4)
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=0.2),rf=TRUE)$w,4)
# Now we calculate the GMVP
round(c(.mpinv(Sigma_in[1:4,1:4])%*%matrix(1,nrow=4,ncol=1)/drop(matrix(1,nrow=1,ncol=4)%*%.mpinv(Sigma_in[1:4,1:4])%*%matrix(1,nrow=4,ncol=1))),4)
# and observe how the assets shift towards it
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=0.1),rf=FALSE)$w,4)
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=0.8),rf=FALSE)$w,4)
round(glPF(mu=mu_in[[1]],Sigma=Sigma_in[1:4,1:4],gamma=gamma,epsilon=list(eps1=10000),rf=FALSE)$w,4)
## Second: We use two groups for the uncertainty example now
# Tangency portfolio for all 7 assets
round(c(1/gamma*.mpinv(Sigma_in)%*%unlist(mu_in)),4)
# The same using the function
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0,eps2=0),rf=TRUE)$w,4)
# Introduce parameter uncertainty for single assets and groups
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.1,eps2=0),rf=TRUE)$w,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0,eps2=0.1),rf=TRUE)$w,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.1,eps2=0.05),rf=TRUE)$w,4)
## Third: We do it for single assets (two)
mu_in <- list(mu1=colMeans(X[,1]),mu2=colMeans(X[,2]))
Sigma_in <- cov(X[,1:2])
gamma <- 3
# Tangency portfolio for 2 assets
round(c(1/gamma*.mpinv(Sigma_in)%*%unlist(mu_in)),4)
# The same using the function
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0,eps2=0),rf=TRUE)$w,4)
# Introduce parameter uncertainty for single assets and groups
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.1,eps2=0),rf=TRUE)$w,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0,eps2=0.1),rf=TRUE)$w,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.0002,eps2=0.01),rf=TRUE)$w,4)
# Sturb
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.1,eps2=0),rf=TRUE)$sturb,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0,eps2=0.1),rf=TRUE)$sturb,4)
round(glPF(mu=mu_in,Sigma=Sigma_in,gamma=gamma,epsilon=list(eps1=0.0002,eps2=0.01),rf=TRUE)$sturb,4)

sstoeckl/uncertaintymeasures documentation built on Nov. 7, 2021, 5:20 p.m.