Learn R Programming

SharpeR (version 1.0.0)

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

Description

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

Usage

ism_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.

Value

  • a list containing the following components:
  • mua $q = p(p+3)/2$ vector of the negative Markowitz portfolio, then the vech'd precision matrix of the sample data
  • Ohatthe $q \times q$ estimated variance covariance matrix.
  • nthe number of rows in X.
  • pthe number of assets.

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

See Also

sm_vcov, sr_vcov

Examples

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

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

Run the code above in your browser using DataLab