mp_vcov {MarkowitzR} | R Documentation |
Estimate Markowitz Portfolio
Description
Estimates the Markowitz Portfolio or Markowitz Coefficient subject to subspace and hedging constraints, and heteroskedasticity.
Usage
mp_vcov(X,feat=NULL,vcov.func=vcov,fit.intercept=TRUE,weights=NULL,Jmat=NULL,Gmat=NULL)
Arguments
X |
an |
feat |
an |
vcov.func |
a function which takes an object of class |
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. |
weights |
an optional |
Jmat |
an optional |
Gmat |
an optional |
Details
Suppose that the expectation of -vector
is linear
in the
-vector
, but the covariance of
is
stationary and independent of
. The 'Markowitz Coefficient'
is the
matrix
such that,
conditional on observing
, the portfolio
maximizes
Sharpe. When
is the constant 1, the Markowitz Coefficient
is the traditional Markowitz Portfolio.
Given observations of the returns and features, given
as matrices
, this code computes the Markowitz Coefficient
along with the variance-covariance matrix of the Coefficient and the
precision matrix. One may give optional weights, which are inverse
conditional volatility. One may also give optional matrix
which define subspace and hedging constraints. Briefly, they constrain
the portfolio optimization problem to portfolios in the row space of
and with zero covariance with the rows of
. It must
be the case that the rows of
span the rows of
.
defaults to the
identity matrix,
and
defaults to a null matrix.
One may use the default method for computing covariance,
via the vcov
function, or via a 'fancy' estimator,
like sandwich:vcovHAC
, sandwich:vcovHC
, etc.
Value
a list containing the following components:
mu |
Letting |
Ohat |
The |
W |
The estimated Markowitz coefficient, a
|
What |
The estimated variance covariance matrix of |
widxs |
The indices into |
n |
The number of rows in |
ff |
The number of features plus |
p |
The number of assets. |
Note
Should also modify to include the theta estimates.
Author(s)
Steven E. Pav shabbychef@gmail.com
References
Pav, S. E. "Asymptotic Distribution of the Markowitz Portfolio." 2013 https://arxiv.org/abs/1312.0557
Pav, S. E. "Portfolio Inference with this One Weird Trick." R in Finance, 2014 http://past.rinfinance.com/agenda/2014/talk/StevenPav.pdf
See Also
Examples
set.seed(1001)
X <- matrix(rnorm(1000*3),ncol=3)
ism <- mp_vcov(X,fit.intercept=TRUE)
walds <- ism$W / sqrt(diag(ism$What))
print(t(walds))
# subspace constraint
Jmat <- matrix(rnorm(6),ncol=3)
ism <- mp_vcov(X,fit.intercept=TRUE,Jmat=Jmat)
walds <- ism$W / sqrt(diag(ism$What))
print(t(walds))
# hedging constraint
Gmat <- matrix(1,nrow=1,ncol=3)
ism <- mp_vcov(X,fit.intercept=TRUE,Gmat=Gmat)
walds <- ism$W / sqrt(diag(ism$What))
# now conditional expectation:
# generate data with given W, Sigma
Xgen <- function(W,Sigma,Feat) {
Btrue <- Sigma %*% W
Xmean <- Feat %*% t(Btrue)
Shalf <- chol(Sigma)
X <- Xmean + matrix(rnorm(prod(dim(Xmean))),ncol=dim(Xmean)[2]) %*% Shalf
}
n.feat <- 2
n.ret <- 8
n.obs <- 10000
set.seed(101)
Feat <- matrix(rnorm(n.obs * n.feat),ncol=n.feat)
Wtrue <- 10 * matrix(rnorm(n.feat * n.ret),ncol=n.feat)
Sigma <- cov(matrix(rnorm(100*n.ret),ncol=n.ret))
Sigma <- Sigma + diag(seq(from=1,to=3,length.out=n.ret))
X <- Xgen(Wtrue,Sigma,Feat)
ism <- mp_vcov(X,feat=Feat,fit.intercept=TRUE)
Wcomp <- cbind(0,Wtrue)
errs <- ism$W - Wcomp
dim(errs) <- c(length(errs),1)
Zerr <- solve(t(chol(ism$What)),errs)