Suppose you have in-sample (IS) and out-of-sample (OOS) daily returns of N stocks (IS and OOS dates are the same for each stock). Suppose you want to calculate return captured each day as x * ret.

How would you scale x (or put it another way, normalize return) for each stock so that each stock’s risk (or put it another way, std dev of x * ret) is more or less equal? Suppose you’re first looking at your IS results (you can use out-of sample data also but only using the past i.e. oos date < is date to prevent lookahead)

I had tried:

  • calculating a rolling sd(ret) [realized vol] of all-sample ret and on each day scaling x by that but the problem with this method is that if somewhere in OOS there is a big move that stock will either dominate or diminish its representation in the portfolio so this doesn’t work.
  • $\begingroup$ well, if you construct a portfolio of stocks, with weights $w_i$, can you calculate the volatility each individual stock contributes to the whole basket? what if you try to equalise these contributions? $\endgroup$
    – will
    Commented Mar 15, 2020 at 17:49
  • $\begingroup$ Your problem is to some extent unavoidable (the future is never exactly like the past). You can improve the situation by having better estimates of vol: (1) Use more past data to estimate vol (2) Use a Shrinkage method so that vol estimates that are very high or very low are brought back towards the typical vol (mean or median of all stock vols) before being used for portfolio allocation. (3) Use implied vol from the option market rather than historical vol. $\endgroup$
    – nbbo2
    Commented Mar 15, 2020 at 21:28
  • $\begingroup$ Are you trying to compute the portfolio weights ? What is x ? $\endgroup$
    – Malick
    Commented Mar 16, 2020 at 16:37

1 Answer 1


We're going to assume that we have $N$ assets in our portfolio with weights $w$ and prices $x$. The variance of your portfolio is given by: \begin{equation} V\left( w'x \right) = w' E\left((x-E(X))(x-E(x))'\right) w = \sum_{i,j=1}^N w_i w_j Cov(x_i, x_j). \end{equation} So, the contribution of one asset is given by: \begin{equation} s_i := \frac{w_i^2 V(x_i) + \sum_{j=1, j \neq i}^N w_iw_j Cov(x_i,x_j) }{\sum_{i,j=1}^N w_i w_j Cov(x_i, x_j)}. \end{equation}

So, your problem of equalizing the variance contribution is to find a weight vector so that all the $(s_i)_{i=1}^N$ are equal which implies \begin{align} &w_i^2 V(x_i) + \sum_{k=1, k \neq i}^N w_i w_k Cov(x_i,x_k) = w_j^2 V(x_j) + \sum_{k=1, k \neq j}^N w_j w_k Cov(x_j, x_k) \end{align}

Now, this is a system of nonlinear equations. To solve it, you need to choose a normalization. Say, $w_1 = 1$ and then you just have to remember that all other weights are expressed as $w_i^* = w_i/w_1$, i.e. in units of $w_1$. Of course, without the covariances, the solution would be simple: \begin{equation} w_i = \sqrt{\frac{V(x_1)}{V(x_i)}} w_1 \end{equation} so you could use this as a starting value for a numerical solution algorithm.

Once you have code to do this, it becomes a matter of how do you estimate the covariance matrix. Several problems emerge: (1) depending on the reasons behind your equalizing strategy, you might want to use something else than the square loss of maximum likelihood and the like; (2) the conditional covariance matrix might evolve through time; (3) outside of a Gaussian world, higher moments do matter and the intuition you have about volatility (that variance is subadditive) doesn't apply; (4) even if you tweak your problem to take all of this explicitly into account, you will have to remember you are working from models and not from the data generating process.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.