If you define VaR as a quantile of the portfolio's
returns distribution about the mean of those returns,
then the minimum-variance portfolio is what you look
for: it minimises the volatility around the mean,
whereever this mean is. When returns are jointly
normal, maximising VaR as just defined does the same.
Regarding my second comment: numerical procedures for VaR
typically directly maximise a given order statistic on a
sample of portfolio returns. But then there is no guarantee
that in the sample the optimal VaR-portfolio will be the
same as the minimum-variance portfolio. Thus, for testing a numerical
procedure, knowing the true distribution and generating data from it may not be enough. Example (using R):
I create 2000 scenarios for 10 assets; each may have a
weight between 0 and 25%. The returns use ridiculously high
mean returns, so that the distribution is shifted away from
zero.
library("NMOF") ## https://github.com/enricoschumann/NMOF
library("neighbours") ## https://github.com/enricoschumann/neighbours
set.seed(32923)
## create random data
na <- 10 ## number of assets
ns <- 2000 ## number of scenarios
k <- ceiling(ns*0.1) ## order statistic to maximise
R <- randomReturns(na = na, ns = ns,
mean = runif(na, 200/100/255, 300/100/255),
sd = runif(na, 0.005, 0.02),
rho = 0.6)
## minimum-variance solution
x.qp <- minvar(cov(R), wmin = 0, wmax = 0.25)
The VaR optimisation. The algorithm I use minimises, so I
put a minus in front of the VaR.
### 1) objective function
of_var <- function(x, R, k, ...)
-(sort(R %*% x, partial = k)[k] - sum(R %*% x)/nrow(R))
### 2) optimisation with Threshold Accepting
x.ta <- TAopt(
OF = of_var, ## SETTINGS
list(nI = 20000, ### number of iterations
neighbour = neighbourfun( ### neighbourhood function
min = 0,
max = 0.25,
stepsize = 1/100),
x0 = rep(1/na, na) ### initial solution: equal weights
),
R = R, k = k)$xbest
We can compare the resulting portfolios and their returns
distributions: the portfolios are very similar.
## compare weights
data.frame(MV = round(100*x.qp, 2),
VaR = round(100*x.ta, 2))
## compare returns distributions under given sample
plot(ecdf(R %*% rep(1/na, na)),
main = "distribution of portfolio returns")
lines(ecdf(R %*% x.qp), col = "blue")
lines(ecdf(R %*% x.ta), col = "darkgreen")
Finally, I evaluate the VaR-objective function at the
minimum-variance and at the minimum-VaR portfolio.
of_var(rep(1/na, na), R, k) ## equal weight
## [1] 0.01316127
of_var(x.qp, R, k) ## minimum variance
## [1] 0.008222392
of_var(x.ta, R, k) ## minimum VaR
## [1] 0.008178637
As you can see, Threshold Accepting found a portfolio that
provides a tiny advantage over the minimum-variance
portfolio in this particular sample. (This could probably be
improved, but it only serves to make the point here.) Under
the true distribution, both portfolios should be the same.
You may also define VaR as a quantile of the returns
distribution, without the centering. You cannot
generally maximise any quantile of the returns
distribution. Just think of the median: if you can use
leverage and the portfolio has a positive return, you
can increase the median (which is the same as the mean under the Gaussian distribution) without bound. So you had better define VaR as a lower
quantile. Maximising it is, in a Gaussian
world, equivalent to maximising
$$\mu'x - \lambda \sqrt{x' \Sigma x}$$
in which $\lambda$ is an appropriate multiplier
for the standard deviation, such as 1.645
for the 5% VaR:
> qnorm(0.05)
## [1] -1.644854
This model should not pose much difficulty to a numeric
solver. (For the median, $\lambda$ would be zero.)