MarkowitzR (version 0.9900.0)

itheta_vcov: Compute variance covariance of Inverse 'Unified' Second Moment

Description

Computes the variance covariance matrix of the inverse unified second moment matrix.

Usage

itheta_vcov(X,vcov.func=vcov,fit.intercept=TRUE)

Arguments

X

an \(n \times p\) matrix of observed returns.

vcov.func

a function which takes an object of class lm, and computes a variance-covariance matrix. If equal to the string "normal", we assume multivariate normal returns.

fit.intercept

a boolean controlling whether we add a column of ones to the data, or fit the raw uncentered second moment. For now, must be true when assuming normal returns.

Value

a list containing the following components:

mu

a \(q = (p+1)(p+2)/2\) vector of 1 + squared maximum Sharpe, the negative Markowitz portfolio, then the vech'd precision matrix of the sample data

Ohat

the \(q \times q\) estimated variance covariance matrix.

n

the number of rows in X.

pp

the number of assets plus as.numeric(fit.intercept).

Details

Given \(p\)-vector \(x\) with mean \(\mu\) and covariance, \(\Sigma\), let \(y\) be \(x\) with a one prepended. Then let \(\Theta = E\left(y y^{\top}\right)\), the uncentered second moment matrix. The inverse of \(\Theta\) contains the (negative) Markowitz portfolio and the precision matrix.

Given \(n\) contemporaneous observations of \(p\)-vectors, stacked as rows in the \(n \times p\) matrix \(X\), this function estimates the mean and the asymptotic variance-covariance matrix of \(\Theta^{-1}\).

One may use the default method for computing covariance, via the vcov function, or via a 'fancy' estimator, like sandwich:vcovHAC, sandwich:vcovHC, etc.

References

Pav, S. E. "Asymptotic Distribution of the Markowitz Portfolio." 2013 http://arxiv.org/abs/1312.0557

Pav, S. E. "Portfolio Inference with this One Weird Trick." R in Finance, 2014 http://www.rinfinance.com/agenda/2014/talk/StevenPav.pdf

See Also

theta_vcov, mp_vcov.

Examples

Run this code
# NOT RUN {
X <- matrix(rnorm(1000*3),ncol=3)
# putting in -X is idiomatic:
ism <- itheta_vcov(-X)
iSigmas.n <- itheta_vcov(-X,vcov.func="normal")
iSigmas.n <- itheta_vcov(-X,fit.intercept=FALSE)
# compute the marginal Wald test statistics:
qidx <- 2:ism$pp
wald.stats <- ism$mu[qidx] / sqrt(diag(ism$Ohat[qidx,qidx]))

# make it fat tailed:
X <- matrix(rt(1000*3,df=5),ncol=3)
ism <- itheta_vcov(X)
qidx <- 2:ism$pp
wald.stats <- ism$mu[qidx] / sqrt(diag(ism$Ohat[qidx,qidx]))
# }
# NOT RUN {
if (require(sandwich)) {
 ism <- itheta_vcov(X,vcov.func=vcovHC)
 qidx <- 2:ism$pp
 wald.stats <- ism$mu[qidx] / sqrt(diag(ism$Ohat[qidx,qidx]))
}
# }
# NOT RUN {
# add some autocorrelation to X
Xf <- filter(X,c(0.2),"recursive")
colnames(Xf) <- colnames(X)
ism <- itheta_vcov(Xf)
qidx <- 2:ism$pp
wald.stats <- ism$mu[qidx] / sqrt(diag(ism$Ohat[qidx,qidx]))
# }
# NOT RUN {
if (require(sandwich)) {
ism <- itheta_vcov(Xf,vcov.func=vcovHAC)
 qidx <- 2:ism$pp
 wald.stats <- ism$mu[qidx] / sqrt(diag(ism$Ohat[qidx,qidx]))
}
# }

Run the code above in your browser using DataLab