Compute the implied correlation of a Portfolio

You didn't respond, so I'll follow up...

In case you're thinking I'm some sort of noob, au contraire...

Apparently you (and many others) see trading the markets as a complicated endeavor rather than a simple one... like chess vs. checkers.

Price TA, KISS is more like checkers. And because it's simple a trader is more likely to understand and better able to execute.

As to your jab about "implied correlation", KISS doesn't address that at all.... so neither do I. In fact, there are no calculations of any kind required or even used in KISS.

Good luck with your "complicatin' things up" with your formulae.

:)
If you suck at chess...don't play chess
 
That is probably close to correct.... for your inputs. Do you have the ICJ white paper. It is based on Jan 22 component vols (top 50 stocks in sp500 only), and some calc of Dec 2021 vix30. I haven't looked up the 50 Jan 2022 component vols but let's assume flat vol and that they are the same as current iv30d. And don't forget to normalized w so it sums to one. (w <- w / sum(w)). My current calc for vix30 on Dec 17 is .25, but that is on a sparse chain so it may be higher. Plugging in current top 50 component vols, and top 50 weights normalized and spIV of .25 gives an implied correlation of around 0.6.

Edit: Reading the white paper, it looks like the CBOE is using an atmIV for Dec 2021 SPX. not a VIX calc like I thought.

I guess i should have looked at the prospectus first :p I read over a white to see the formula they were using (my original post), but did not notice the actual holdings.

Last question I have that will really get my head around this. Why is it that the formula
rho <-(iv**2 - crossprod(w**2,v**2)) / sum(outer(v,v) * outer(w,w) - diag(3) * diag(outer(v,v) * outer(w,w))) is equivalent to (basketVol/WeightedComponentVol)^2. This becomes almost exact as number of components increases to infinity. Since we are trading in vols and not vars doesn't it make sense to use sqrt(rho) or (basketVol/WeightedComponentVol) instead of rho?

Code:
#1000 asset portfolio
x<-runif(1000)
w = x/sum(x)
v = rnorm(1000, mean = .35, sd = .09)
vIndex = .21

rho = (vIndex**2 - crossprod(w**2,v**2)) /  sum(outer(v,v) * outer(w,w) - diag(length(v)) * diag(outer(v,v) * outer(w,w)))

.21/sum(v*w) - sqrt(rho)      
#[1,] 0.0007784934
 
Last edited:
Last question I have that will really get my head around this. Why is it that the formula
rho <-(iv**2 - crossprod(w**2,v**2)) / sum(outer(v,v) * outer(w,w) - diag(3) * diag(outer(v,v) * outer(w,w))) is equivalent to (basketVol/WeightedComponentVol)^2. This becomes almost exact as number of components increases to infinity.

Because when n is large sum(w^2 * v^2) is small and because (y - e) / (x - e) ~ y / x when e is small. The term -sum(w^2 * v^2) appears in both the numerator and denominator of the CBOE formula you posted (after some rearrangement). See the slightly reqritten formula in the function in the code section below.

And also because (basketVol/WeightedComponentVol)^2 is the actual correct approximation. In my original post I erred and left off the ^2. I was working from memory and didn't bother to check. Sorry about that.


Code:
impliedIdxCorFromVols <- function(w,v,iv)
{ w <- w / sum(w)
  rho <- (  iv**2  - sum(w^2 * v^2)) / 
  (sum((v*w) %*% t(v*w)) - sum(w^2 * v^2))
  return(rho)
}


Edit: Yes, also because we are working in var and covars to extract the implied correlation
 
Last edited:
Because when n is large sum(w^2 * v^2) is small and because (y - e) / (x - e) ~ y / x when e is small. The term -sum(w^2 * v^2) appears in both the numerator and denominator of the CBOE formula you posted (after some rearrangement). See the slightly reqritten formula in the function in the code section below.

And also because (basketVol/WeightedComponentVol)^2 is the actual correct approximation. In my original post I erred and left off the ^2. I was working from memory and didn't bother to check. Sorry about that.


Code:
impliedIdxCorFromVols <- function(w,v,iv)
{ w <- w / sum(w)
  rho <- (  iv**2  - sum(w^2 * v^2)) /
  (sum((v*w) %*% t(v*w)) - sum(w^2 * v^2))
  return(rho)
}


Edit: Yes, also because we are working in var and covars to extract the implied correlation
thank you for the help kevin!
 
Is this "stock market chess"?

If so, suggest you focus on "checkers".

KISS, baby... as always.
:)

don’t ever throw shots at my homie ever again, especially in his own thread.

this is a warning.

#ETGANGANGANG
 
Code:
rho <-
(iv**2 - crossprod(w**2,v**2)) /  sum(outer(v,v) * outer(w,w) - diag(3) * diag(outer(v,v) * outer(w,w)))


The function eye is non-standard. I replaced it with diag(3) in the code above. With the correct v vector, v <- c(.25,.35,.18). it returns .3609, same number you got/

Your vIndex/sum(w*v) is the same as basket-vol over weighted-component-vol as mentioned in my post. For a 500 stock index or for your 100 stock random index, it is going to be pretty close.

you’re so smart is pisses me tf off.

time to get back in the books
 
don’t ever throw shots at my homie ever again, especially in his own thread.

this is a warning.

#ETGANGANGANG

Whaddya mean, "throw shots"? I was handing out a "pearl of trading wisdom".

Sometimes the pinnacle of sophistication is simplicity. Especially true in trading, though not many players catch on.
 
Whaddya mean, "throw shots"? I was handing out a "pearl of trading wisdom".

Sometimes the pinnacle of sophistication is simplicity. Especially true in trading, though not many players catch on.
Nah...I highly doubt that players like Ren Tech or Citadel are finding alpha in simplicity. But whatever...keep paying their yachts
 
Back
Top