First Baruch Workshop

Session 5: Variance swaps, gamma swaps, VIX, and VVIX

Instructor: Jim Gatheral

Outline of Session 5

Spanning generalized European payoffs The log contract Variances swaps and gamma swaps The VIX index VIX futures and options VVIX Joint modeling of SPX and VIX

Volatility derivatives

In this session, we will investigate the pricing and hedging of claims that have realized volatility or variance (quadratic variation) as .

We might expect volatility derivatives be very exotic and therefore hard to price and It turns out that in some respects, they are amongst the safest and easiest.

In our survey of volatility derivatives, we will encounter some of the most elegant constructions in financial mathematics.

Spanning generalized European payoffs

As usual, we assume that European options with all possible strikes and expirations are traded.

We will show that any twice-differentiable payoff at time T may be statically hedged using a portfolio of European options expiring at time T . Proof from [Carr and Madan][2]

The value of a claim with a generalized payoff g(ST ) at time T is given by ∞ g(ST ) = g(K) δ(ST − K) dK ∫0 F ∞ = g(K) δ(ST − K) dK + g(K) δ(ST − K) dK ∫0 ∫F Integrating by parts gives F ∞ ′ ′ g(ST ) = g(F) − g (K) θ(K − ST ) dK + g (K) θ(ST − K) dK ∫0 ∫F

... and integrating by parts again gives

(1) F ∞ ″ + ″ + g(ST ) = g (K) (K − ST ) dK + g (K) (ST − K) dK ∫0 ∫F ′ + + + g(F) − g (F) [(F − ST ) − (ST − F) ] F ∞ ″ + ″ + = g (K) (K − ST ) dK + g (K) (ST − K) dK ∫0 ∫F ′ + g(F) + g (F) (ST − F)

Then, with F = �[ST ] ,

(2) F ∞ ″ ″ � [g(ST )] = g(F) + dK P̃ (K) g (K) + dK C̃ (K) g (K) ∫0 ∫F Equation (1) shows how to build any curve using hockey-stick payoffs (if g(⋅) is twice- differentiable). Remarks on spanning of European-style payoffs

From equation (1) we see that any European-style twice-differentiable payoff may be replicated using a portfolio of European options with strikes from 0 to ∞. The weight of each equal to the second of the payoff at the of the option.

This portfolio of European options is a static hedge because the weight of an option with a particular strike depends only on the strike price and the form of the payoff function and not on time or the level of the price.

Note further that equation (1) is completely model-independent (except that there should be no jumps).

Example: European options

In fact, using Dirac delta-functions, we can extend the above result to payoffs which are not twice- differentiable.

+ ″ For example with g(ST ) = (ST − L) , g (K) = δ(K − L) and equation (2) gives: F + + ̃ � [(ST − L) ] = (F − L) + dK P(K) δ(K − L) ∫0 ∞ = + dK C̃ (K) δ(K − L) ∫F (F − L) + P̃ (L) L < F = { C̃ (L) L ≥ F = C̃ (L) with the last step following from put-call parity as before.

The for a European option is just the option itself. The log contract

″ 2 Now consider a contract whose payoff at time T is log(ST /F) . Then g (K) = −1/ST ∣ and it follows ∣ST =K from equation (2) that F ∞ ST dK ̃ dK ̃ � log = − 2 P(K) − 2 C(K) [ ( F )] ∫0 K ∫F K Rewriting this equation in terms of the log-strike variable k := log (K/F), we get the promising-looking expression

(3) S 0 ∞ � log T = − dk p(k) − dk c(k) [ ( F )] ∫−∞ ∫0 with C̃ (Fey ) P̃ (Fey ) c(y) := ; p(y) := Fey Fey representing option prices expressed in terms of percentage of the strike price.

Variance swaps

Assume zero interest rates and dividends. Then F = S0 and applying Itô’s Lemma, path-by-path

(4) T T T 2 ST ST dSt σt log = log = d log (St) = − dt ( F ) ( S0 ) ∫0 ∫0 St ∫0 2

The second term on the RHS of equation (4) is immediately recognizable as half the total variance

(or quadratic variation) WT := ⟨x⟩T over the interval [0, T].

The first term on the RHS represents the payoff of a hedging strategy which involves maintaining a constant dollar amount in stock (if the stock price increases, sell stock; if the stock price decreases, buy stock so as to maintain a constant dollar value of stock).

Since the log payoff on the LHS can be hedged using a portfolio of European options as noted

earlier, it follows that the total variance WT may be replicated in a completely model-independent way so long as the stock price process is a diffusion. In particular, volatility may be stochastic or deterministic and equation (4) still applies. The log-strip hedge for a variance

Now taking the risk-neutral expectation of (4) and comparing with equation (3), we obtain

(5) T 0 ∞ 2 ST � σt dt = −2 � log = 2 dk p(k) + dk c(k) [∫0 ] [ ( S0 )] {∫−∞ ∫0 } We see that the fair value of total variance is given by the value of an infinite strip of European options in a completely model-independent way so long as the underlying process is a diffusion.

Setup R environment

In [1]:

%load_ext rpy2.ipython In [2]:

%%R download.file(url="http://mfe.baruch.cuny.edu/wp-content/uploads/2015/05/VW5.zip ", destfile="VW5.zip") unzip(zipfile="VW5.zip") library(quantmod) source("BlackScholes.R") source("Heston2.R") source("plotIvols.R") source("svi.R") source("sviVarSwap.R")

# Read in SPX and VIX options data from 15-Sep-2011 load("spxVix20110915.rData") load("fitQR110915.rData") trying URL 'http://mfe.baruch.cuny.edu/wp-content/uploads/2015/05/VW5.zip' Content type 'application/zip' length 97054 bytes (94 KB) opened URL ======downloaded 94 KB

Loading required package: xts Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

as.Date, as.Date.numeric

Loading required package: TTR Version 0.4-0 included new data defaults. See ?getSymbols.

R-code to implement the log-strip In [3]:

%%R sviVarSwap <- function(sviMatrix,texp){

nSlices <- length(texp) varRes <- numeric(nSlices)

for (slice in 1:nSlices){

t <- texp[slice] volBS <- function(k){sqrt(svi(sviMatrix[slice,],k)/t)} cTilde <- function(y){BSFormula(1, 1/y, t, r=0, volBS(-log(y)))} pTilde <- function(y){BSFormulaPut(1, y, t, r=0, volBS(log(y)))/y^2} callIntegral <- integrate(cTilde,lower=0,upper=1)$value putIntegral <- integrate(pTilde,lower=0,upper=1)$value varRes[slice] <- 2*(callIntegral+putIntegral)/t # Equation (11.4) of TVS } return(varRes) # Returns vector of variance swaps in variance (vol. squared) terms }

SPX volatility smiles as of 15-Sep-2011

In [4]:

%%R res <- plotIvols(spxOptData,sviMatrix=fitQR ) texp <- res$expiries Figure 1: Implied volatility smiles of SPX options as of 15-Sep-2011. SVI fits are in orange.

Variance swap curve (from log-strip) as of 15-Sep-2011

In [5]:

%%R sviVarSwap(sviMatrix=fitQR,texp=texp)

[1] 0.08712946 0.12799535 0.11242498 0.10350108 0.11393807 0.11066689 [7] 0.11035351 0.11055505 0.11046477 0.11040482 0.11145298 0.11029756 [13] 0.10708404 0.10740658

Comparison of log-strip with variance swap quotes In [6]:

%%R sviVS <- sqrt(sviVarSwap(fitQR,texp=res$expiries)) plot(texp,sviVS,ylab="Variance swap level", xlab="Expiry",type="p",pch=20,cex=2, col="dark green") points(mktVarSwapData$texp,mktVarSwapData$vsBid,col="blue",type="b",lty=2, pch=2 0,cex=1) points(mktVarSwapData$texp,mktVarSwapData$vsAsk,col="red",type="b",lty=2,pch=20, cex=1)

Figure 2: Green dots are computed using the log-strip of SPX options. Blue and red points are bid and ask variance swap quotes from a friendly investment . Weighted variance swaps

Consider the weighted variance swap with payoff T α(St ) vt dt. ∫0 An application of Itô’s Lemma to x y α(z) A(x) = 2 dy 2 dz. ∫1 ∫1 z gives the quasi-static hedge:

(6) T T ′ α(St ) vt dt = A(ST ) − A(S0 ) − A (Su ) dSu ∫0 ∫0

The LHS of (6) is the payoff to be hedged.

The last term on the RHS of (6) corresponds to rebalancing in the underlying.

The first term on the RHS corresponds to a static position in options given by the spanning formula (1).

Example: Gamma swaps

The payoff of a gamma swap is 1 T St vt dt. S0 ∫0 Thus α(x) = x and 2 x y z 2 A(x) = dy 2 dz = {1 − x + x log x} . S0 ∫1 ∫1 z S0 2 The static options hedge is the spanning strip for ST log ST . S0

Gamma swaps are marketed as “less dangerous” because higher variances are associated with lower stock prices. Variance swaps and gamma swaps as traded assets

Denote the time t value of the option strip for a variance swap maturing at T by t(T). That is T ∣ ST ∣ t(T) = −2 � log = � vu du∣ t . [ St ] [∫t ∣ ] Similarly, for a gamma swap T ∣ ST ST Su ∣ t (T) = 2 � log = � vu du∣ t . [ St St ] [∫t St ∣ ]

Both t(T) and t (T) are random variables representing the prices of traded assets. Specifically, values of portfolios of options appropriately weighted by strike.

t(T) is given by the expectation �t[log ST ] of the log contract. t (T) is given by the expectation �t[ST log ST ] of the entropy contract.

R-code to implement the gamma swap log-strip

In [7]:

%%R sviGammaSwap <- function(sviMatrix,texp){

nSlices <- length(texp) varRes <- numeric(nSlices)

for (slice in 1:nSlices){

t <- texp[slice] volBS <- function(k){sqrt(svi(sviMatrix[slice,],k)/t)} cTilde <- function(y){BSFormula(1, 1/y, t, r=0, volBS(-log(y)))/y} pTilde <- function(y){BSFormulaPut(1, y, t, r=0, volBS(log(y)))/y} possibleError <- tryCatch(callIntegral <- integrate(cTilde,lower=0,upper=1)$ value,error=function(e) e) possibleError <- tryCatch(putIntegral <- integrate(pTilde,lower=0,upper=1)$v alue,error=function(e) e) if(!inherits(possibleError,"error")){ varRes[slice] <- 2*(callIntegral+putIntegral)/t } else {varRes[slice] <- NA} } return(varRes) # Returns vector of variance swaps in variance (vol. squared) terms }

Comparison of variance swap and gamma swap curves In [8]:

%%R sviVS <- sqrt(sviVarSwap(fitQR,texp=res$expiries)) sviGS <- sqrt(sviGammaSwap(fitQR,texp=res$expiries)) plot(texp,sviVS,ylab="Variance swap level", xlab="Expiry",type="p",pch=20,cex=2, col="red",ylim=c(.25,.36)) points(texp,sviGS,type="p",pch=20,cex=2,col="dark green")

Figure 3: Red dots are computed using the log-strip of SPX options (variance swaps). Dark green dots are from the entropy strip of SPX options (gamma swaps). Note that with negative correlation between underlying and volatility moves (or alternatively with negative skew), the gamma swap has to be lower than the variance swap. The leverage swap

Following [Fukasawa][4], consider the expected quadratic covariation of the underlying and the variance swap: T � [⟨S, (T)⟩T] := � dSt dt(T) . [∫0 ] Itô’s Lemma gives

d(St t(T)) = St dt(T) + t(T) dSt + dSt dt(T) so T � [⟨S, (T)⟩T] = �[ST T(T)] − S0 0(T) − � St dt(T) . [∫0 ]

Noting that T(T) = 0 and that dt(T) = −vt dt, we obtain (7) T � [⟨S, (T)⟩T] = � St vt dt − S0 0(T) = S0 (0(T) − 0(T)) = S0 0(T) [∫0 ] where 0(T) = 0(T) − 0(T) is the leverage swap. Thus the leverage swap gives us the expected quadratic covariation between the underlying and the variance swap.

This result is completely model independent (assuming diffusion), just as in the variance swap and gamma swap cases.

Expression in terms of log and entropy contracts

Going back to the expression of the variance and gamma swaps in terms of log and entropy contracts respectively, ST ST t(T) = t (T) − t(T) = 2 � + 1 log . [( St ) St ]

Leverage swap term structure In [9]:

%%R sviVS2 <- sviVarSwap(fitQR,texp=res$expiries) sviGS2 <- sviGammaSwap(fitQR,texp=res$expiries) sviLevSwap <- (sviGS2 - sviVS2)/sviVS2 # We normalized here plot(texp,sviLevSwap,ylab="Variance swap level", xlab="Expiry",type="p",pch=20,c ex=2,col="red")

Figure 4: Red dots are normalized leverage swaps as of 15-Sep-2011 computed using the log and entropy SPX option strips. Variance swap contracts in practice

A variance swap is not really a swap at all but a on the realized annualized variance. The payoff at time T is

N 2 2 1 Si 1 SN N × A × ∑ {log ( )} − { log ( )} − N × Kvar { N i=1 Si−1 N S0 }

where N is the notional amount of the swap, A is the annualization factor and Kvar is the strike price.

Annualized variance may or may not be defined as mean-adjusted in practice.

From a theoretical perspective, the beauty of a variance swap is that it may be replicated perfectly assuming a diffusion process for the stock price as shown in the previous section.

From a practical perspective, traders may express views on volatility using variance swaps without having to delta hedge.

History of variance swaps

Variance swaps took off as a product in the aftermath of the LTCM meltdown in late 1998 when implied stock index volatility levels rose to unprecedented levels.

Hedge funds took advantage of this by paying variance in swaps (selling the realized volatility at high implied levels). The key to their willingness to pay on a variance swap rather than sell options was that a variance swap is a pure play on realized volatility – no labor-intensive delta hedging or other path dependency is involved.

Dealers were happy to buy vega at these high levels because they were structurally vega (in the aggregate) through sales of guaranteed equity-linked investments to retail investors and were getting badly hurt by high levels. Variance swaps in the

Recall that instantaneous variance follows the process: dvt = −λ(vt − v¯) dt + η √‾v‾t dZt Then T ∣ ∣ t(T) = � vu du∣ t [∫t ∣ ] T −λ (u−t) = {v¯ + (vt − v¯) e } du ∫t 1 − e−λ τ = (vt − v¯) + v¯ τ λ where τ = T − t.

−λ τ Expected annualized variance is then given by 1−e . λ τ (vt − v¯) + v¯

Model-independence of variance swap

Expected variance in the Heston model depends only on v, v¯ and λ. It does not depend on the volatility of volatility η. Since the value of a variance swap depends only on the prices of European options, it cannot depend on the specific dynamics assumed (local or for example).

Dependence of variance swap on skew and curvature

In practice, we start with a strip of European options of a given and we would like to know how we should expect the price of a variance swap to relate to the at-the-money-forward implied volatility, the volatility skew and the volatility curvature (smile). A cool formula for the variance swap

Define

k σBS (k)√T‾‾ z(k) = d2 = − − σBS (k)√T‾‾ 2 Intuitively, z measures the log- of an option in implied standard deviations. Then,

(8) ∞ ST ′ 2 �[WT ] = −2 � log = dz N (z) σ (z, T)T [ F ] ∫ BS −∞

To see this formula is plausible, it is obviously correct in the flat-volatility Black-Scholes case. A proof is given in [The Volatility Surface][6]

A generalization due to Fukusawa

[Fukasawa][4] derives an expression for the value of a generalized European payoff in terms of implied volatilities.

As one application, he derives an expression for the value of a gamma swap. Define

k σBS (k)√T‾‾ z(k) = d1 = − + σBS (k)√T‾‾ 2

(note d1 instead of d2 before). Then,

(9) ∞ S S 2 � T log T = dz N ′ (z) σ2 (z)T [ F F ] ∫ BS −∞

In particular, if we have a parameterization of the (such as SVI), computing the fair value of the leverage swap is straightforward. Dependence on skew and curvature again

Now consider the following simple parameterization of the BS implied variance skew: 2 2 2 σBS (z) = σ0 + α z + β z Substituting into equation (8) and integrating, we obtain 2 �[WT ] = σ0 T + βT Skew makes no contribution to this expression, only the curvature contributes.

The intuition for this is simply that increasing the skew does not change the average level of volatility but increasing the curvature β increases the prices of puts and calls in equation (3) and always increases the fair value of variance.

The effect of jumps

It can be shown that the error introduced by valuing a variance swap using the log-strip of equation (5) is of the order of the jump-size cubed.

Thus, in practice, if the log price change between resets is less than 5% or so (as it is for stock indices), the effect of jumps is negligible. If there are no jumps of course, the log-strip values the variance swap correctly.

The VIX index (http://www.cboe.com/micro/vix/vixintro.aspx (http://www.cboe.com/micro/vix/vixintro.aspx))

In 2004, the CBOE listed futures on the VIX - an implied volatility index.

Originally, the VIX computation was designed to mimic the implied volatility of an at-the-money 1 month option on the OEX index. It did this by averaging volatilities from 8 options (puts and calls from the closest to ATM strikes in the nearest and next to nearest months).

The CBOE changed the VIX computation: “CBOE is changing VIX to provide a more precise and robust measure of expected market volatility and to create a viable underlying index for tradable volatility products.” The new VIX formula

Here is the later VIX definition (converted to our notation) as specified in the CBOE white paper:

(10) 2 ΔK 1 F 2 VIX 2 = i Q (K ) − − 1 ∑ 2 i i [ ] T i Ki T K0 where Qi is the price of the out-of-the-money option with strike Ki and K0 is the highest strike below the F .

We recognize (10) as a straightforward discretization of the log-strip and makes clear the reason why the CBOE implies that the new index permits replication of volatility.

Specifically, (with obvious notation) VIX 2 T F dK ∞ dK = 2 P(K) + 2 C(K) 2 ∫0 K ∫F K K0 dK ∞ dK F dK = 2 P(K) + 2 C(K) + 2 (P(K) − C(K)) ∫0 K ∫K0 K ∫K0 K ∞ dK F dK =: 2 Q(K) + 2 (K − F) ∫0 K ∫K0 K ∞ dK 1 F ≈ Q(K) + dK (K − F) ∫ 2 2 ∫ 0 K K0 K0 ∞ dK 1 (K − F)2 = Q(K) − 0 . ∫ 2 2 0 K K0 2 One possible discretization of this last expression is 2 ΔK 1 F 2 VIX 2 = i Q (K ) − − 1 ∑ 2 i i [ ] T i Ki T K0 as in the VIX specification (3). Full details of the CBOE VIX computation are given in https://www.cboe.com/micro/vix/vixwhite.pdf (https://www.cboe.com/micro/vix/vixwhite.pdf). VIX as of 15-Sep-2011

To proxy the VIX index, we interpolate the log-strips of SPX options. The near and far SPX option strips are computed and disseminated by the CBOE with tickers VIN and VIF respectively. Here is a screenshot from Bloomberg:

The near and far slices are the third and fourth expirations as of 15-Sep-2015:

In [10]:

%%R print(texp[3:4]*365.25) sqrt(sviVS2[3:4])

[1] 14 36 [1] 0.3352983 0.3217158

Computations are very close! VIX futures and options

A time-T VIX future is valued at time t as ‾‾‾‾‾‾‾‾T‾+‾Δ‾‾‾‾‾‾‾ ∣ � � v ds ∣ T ∫ s ∣ t [{√ [ T ]}∣ ] where Δ is around one month (or Δ ≈ 1/12).

A VIX option expiring at time T with strike KVIX is valued at time t as + ⎡ ‾‾‾‾‾‾‾‾T‾+‾Δ‾‾‾‾‾‾‾ ∣ ⎤ ⎢ ∣ ⎥ � �T vs ds − KVIX t . ⎢ [∫ ] ∣ ⎥ ⎣(√ T ) ∣ ⎦

Remarks on VIX futures and options

Initially, the options were much more liquid and actively traded than the futures. Now however, volume in both futures and options is huge.

Both futures and synthetic futures (from put-call parity) used to at a substantial premium to the forward-starting variance swap. This has come and gone over time.

Apparently, since the second quarter of 2013, there has been more vega traded in VIX than on SPX, which is now only the second biggest global market for volatility.

VIX futures and options

Note that we can span the payoff of a forward starting variance swap T+Δ using VIX �t [∫T vs ds] options.

Recall the spanning formula: F ∞ ″ ″ � [g(ST )] = g(F) + dK P̃ (K) g (K) + dK C̃ (K) g (K). ∫0 ∫F In this case, g(x) = x2 so T+Δ FVIX ∞ 2 ̃ ̃ �t vs ds = FVIX + 2 P(K) dK + 2 C(K) dK. [∫T ] ∫0 ∫FVIX

FVIX can be computed using put-call parity or observed directly as the VIX futures price. We need to interpolate and extrapolate out-of-the-money option prices to get the convexity adjustment. Forward variance swaps from SPX and VIX options

Once again, we can compute the fair value of forward starting variance swaps in three ways: Using variance swaps from the SPX log-strip We just computed these variance swaps. From the linear strip of VIX options. By interpolating market variance swap quotes.

We now compute the linear VIX strip and compare the three computations as of September 15, 2011.

The VIX volatility smile as of 15-Sep-2011

In [11]:

%%R res <- plotIvols(vixOptData) Figure 5: Implied volatility smiles of VIX options as of 15-Sep-2011. Note that all smiles are upward sloping.

Interpolation and extrapolation of VIX smiles

We can’t use SVI because VIX smiles are often concave.

We choose the simplest possible interpolation/ extrapolation. Monotonic spline interpolation of mid-vols. Extrapolation at constant level.

Figure 6: The VIX one month smile with monotonic spline interpolation/ extrapolation.

First we code a function to return VIX implied volatilities with the above interpolation/ extrapolation scheme. In [12]:

%%R

# Idea is for each slice, comopute midvols, use stinterp to interpolate and then extrapolate at constant above and below. library(stinepack) vixVol <- function(ivolData, slice){

bidVols <- as.numeric(ivolData$Bid); askVols <- as.numeric(ivolData$Ask); expDates <- unique(ivolData$Texp);

############################################################################## ################################# # Interpolate and extrapolate vols for this slice at requested output points

t <- expDates[slice] texp <- ivolData$Texp bidVol <- bidVols[texp==t] askVol <- askVols[texp==t] midVol <- (bidVol+askVol)/2 f <- (ivolData$Fwd[texp==t])[1] k <- log(ivolData$Strike[texp==t]/f) # Plot vs log-strike include <- !is.na(bidVol) kmin <- min(k[include]) kmax <- max(k[include])

# Compute and store interpolated and extrapolated vols kIn <- k[!is.na(midVol)] volIn <- midVol[!is.na(midVol)] volInterp <- function(kout){ if (kout < kmin){res <- midVol[which(k==kmin)] } else if( kout > kmax){res <- midVol[which(k==kmax)] } else res <- stinterp(x=kIn,y=volIn, kout)$y return(res) } return(function(x){sapply(x,volInterp)}) }

Now compute forward-starting variance swaps from the linear strip of VIX options: In [13]:

%%R vix2 <- function(ivolData, slice){

bidVols <- as.numeric(ivolData$Bid) askVols <- as.numeric(ivolData$Ask) expDates <- unique(ivolData$Texp)

############################################################################## ################################# # Interpolate and extrapolate vols for this slice at requested output points

t <- expDates[slice] texp <- ivolData$Texp bidVol <- bidVols[texp==t] askVol <- askVols[texp==t] midVol <- (bidVol+askVol)/2 f <- (ivolData$Fwd[texp==t])[1] k <- log(ivolData$Strike[texp==t]/f) # Plot vs log-strike include <- !is.na(bidVol) kmin <- min(k[include]) kmax <- max(k[include])

# Compute and store interpolated and extrapolated vols kIn <- k[!is.na(midVol)] volIn <- midVol[!is.na(midVol)] volInterp <- function(kout){ if (kout < kmin){res <- midVol[which(k==kmin)] } else if( kout > kmax){res <- midVol[which(k==kmax)] } else res <- stinterp(x=kIn,y=volIn, kout)$y return(res) } vixVol <- function(x){sapply(x,volInterp)} # Now we use the vectorized function vixVol to compute the convexity adjustemn t cTilde <- function(y){exp(y)*BSFormula(1, exp(y), t, r=0, vixVol(y))} pTilde <- function(y){exp(y)*BSFormulaPut(1, exp(y), t, r=0, vixVol(y))} callIntegral <- integrate(cTilde,lower=0,upper=10)$value putIntegral <- integrate(pTilde,lower=-10,upper=0)$value res <- f^2*(1+2*(callIntegral+putIntegral)) return(res) }

In [14]:

%%R print(vix2n <- sapply(1:6,function(x){sqrt(vix2(vixOptData,x))})/100)

[1] 0.3349440 0.3458554 0.3413275 0.3280392 0.3424179 0.3449045 Compute forward variance swaps from market variance swap quotes.

In [15]:

%%R mv <- mktVarSwapData

# Now compute forward-starting variance swaps from var swaps vsMid <- (mv$vsBid+mv$vsAsk)/2 tVS <- mv$texp vsT <- function(tout){stinterp(tVS,vsMid,tout)$y}

# VIX dates vixDates <- sort(unique(vixOptData$Texp)) # We need varswaps to vixDates and varswaps to vixDates + 1/12 year wi <- vsT(vixDates)^2*vixDates wf <- vsT(vixDates+1/12)^2*(vixDates+1/12) vfs <- (wf-wi)*12 sqrt(vfs)

[1] NA NA 0.3453583 0.3393008 0.3402110 0.3392514

Finally, compute forward-starting variance swaps from the log-strip of SPX options

In [16]: %%R spxDates <- unique(spxOptData$Texp) vsTstrip <- function(tout){stinterp(spxDates,sviVS,tout)$y} wis <- vsTstrip(vixDates)^2*vixDates wfs <- vsTstrip(vixDates+1/12)^2*(vixDates+1/12) vfstrip <- (wfs-wis)*12 sqrt(vfstrip)

[1] 0.3141559 0.3540109 0.3225969 0.3310889 0.3339823 0.3327148

Forward variance swaps as of 15-Sep-2011¶ In [17]:

%%R plot(vixDates,sqrt(vfs),ylim=c(.3,.4),xlab="VIX option expiry", ylab="Forward va riance swap",type="p",col="dark green",pch=20, cex=2) points(vixDates, vix2n,col="blue",pch=20,cex=2) points(vixDates, sqrt(vfstrip),col="red",pch=20,cex=2)

Figure 7: Red dots are from interpolation of the SPX log-strip; green dots are forward variance swap estimates from SPX variance swap quotes; blue dots are forward variance swap estimates from the linear VIX option strip. Consistency of forward variance swap estimates

Forward variance swap estimates from SPX and VIX are very consistent on this date.

Sometimes, VIX futures trade inconsistently with the forward-starting variance swap, typically at a premium. This arbitrage has come and gone over time.

Taking advantage as a proprietary is difficult because you need to cross the bid-ask so often. Buy the long dated variance swap, sell the shorter-dated variance swap. Sell the linear strip of VIX options.

However, the practical consequence is that end users should determine whether SPX options or VIX futures are richer and buy or sell accordingly.

Another date: 14-Aug-2014

In [18]:

%%R load("spxVix20140814.rData") load("fitQR140814.rData")

SPX smiles with SVI fits as of 14-Aug-2014 In [19]:

%%R res <- plotIvols(spxOptData,sviMatrix=fitQR) texp <- res$expiries

Variance swap curve (from log-strips) as of 14-Aug-2014 In [20]:

%%R sviVS <- sqrt(sviVarSwap(fitQR,texp=res$expiries)) plot(texp,sviVS,ylab="Variance swap level", xlab="Expiry",type="p",pch=20,cex=2, col="dark green")

VIX smiles as of 14-Aug-2014 In [21]:

%%R res <- plotIvols(vixOptData)

Forward starting variance swaps from interpolation of the SPX log-strips

In [22]: %%R spxDates <- unique(spxOptData$Texp) vsTstrip <- function(tout){stinterp(spxDates,sviVS,tout)$y} wis <- vsTstrip(vixDates)^2*vixDates wfs <- vsTstrip(vixDates+1/12)^2*(vixDates+1/12) vfstrip <- (wfs-wis)*12 sqrt(vfstrip)

[1] 0.1315106 0.1577442 0.1634686 0.1790174 0.1929564 0.1852402 Forward starting variance swaps from linear strip of VIX options

In [23]:

%%R print(vix2n <- sapply(1:6,function(x){sqrt(vix2(vixOptData,x))/100}))

[1] 0.1303533 0.1445451 0.1567063 0.1653059 0.1710279 0.1810889

In [24]: %%R plot(vixDates,vix2n,xlab="VIX option expiry", ylab="Forward variance swap",type= "p",col="blue",pch=20, cex=2,ylim=c(.12,.2)) points(vixDates, sqrt(vfstrip),col="red",pch=20,cex=2)

Figure 6: Red dots are from interpolation of the SPX log-strips; Blue dots are forward variance swap estimates from the linear VIX option strip. Consistency of forward variance swap estimates

It seems as if variance swaps were trading at a premium to VIX options on 14-Aug-2014. However, the front VIX options, which are the most liquid, seem to be in line.

The VVIX index (http://www.cboe.com/micro/vvix/ (http://www.cboe.com/micro/vvix/))

Recall that we may compute the fair value of quadratic variation of log S from the log-strip of SPX options:

�[⟨log S⟩T] = −2 �[log ST ]. We may also compute the fair value of quadratic variation of log VIX from the log-strip of VIX options:

�[⟨log VIX⟩T] = −2 �[log VIXT ].

The VVIX index (VIX of VIX) is computed from the log-strip of VIX options in exactly the same way that VIX is computed from SPX options. Roughly speaking, the VVIX index is the fair value of one-month quadratic variation of VIX.

We then, again roughly speaking, also have a measure of the volatility of volatility. If VIX is a measure of volatility, VVIX should be a measure of volatility of volatility.

Full details of the CBOE VVIX computation are given in http://www.cboe.com/micro/vvix/vvixwhitepaper.aspx (http://www.cboe.com/micro/vvix/vvixwhitepaper.aspx). VVIX as of 14-Aug-2014

Here is another screenshot from Bloomberg:

The fair value of VIX futures

As before, we have FVIX = �[VIX] and 2 2 2 2 �[VIX ] − (�[VIX]) = �[VIX ] − FVIX = Var(VIX). Recall that �[VIX 2] may be computed from a constant strip of VIX options. As for Var(VIX), we have 2 2 Var(VIX) ≈ FVIX VVIX T so 2 2 2 �[VIX ] ≈ FVIX (1 + VVIX T) which gives yet another way of assessing the fair value of VIX futures.

VIX and VVIX as of 14-Aug-2014

The nearest VIX future contract (Sep-2014) closed at 13.90. In [25]:

%%R print(vixDates*365.25) vix2n

[1] 6 34 62 97 125 153 [1] 0.1303533 0.1445451 0.1567063 0.1653059 0.1710279 0.1810889

Thus our linear strip computation gives � [VIX 2] ≈ 14.452 . Compare this with 0.78482 F 2 (1 + VVIX 2 T) ≈ 13.92 × 1 + = 14.252. VIX ( 12 )

In other words, VVIX proxies for the convexity adjustment in the comparison of the forward-starting SPX variance swap with the VIX future.

Joint modeling of SPX and VIX

We had so much success with model-free computations, why should we want to model SPX and VIX jointly? We may want to value exotic options that are sensitive to the precise dynamics of the underlying such as barrier options, lookbacks or cliquets.

But is it possible to come up with a parsimonious, realistic model that fits SPX and VIX jointly? And even if we could, would it be possible to calibrate such a model efficiently?

This is still a hot research topic.

Information in VIX options

As with options on the underlying, knowledge of the following is equivalent: The VIX implied volatility smile VIX option prices The VIX density The VIX characteristic function

The VIX option smile thus encodes information about the dynamics of volatility in a stochastic volatility model. For example, under stochastic volatility, a very long-dated VIX smile would give us the stable distribution of VIX (should it exist). Modeling forward variance

As mentioned earlier in Session 1, forward variances are natural fundamental objects to consider for volatility modeling.

Denote the variance curve as of time by T ∣ . The forward variance t t(T) = � [∫t vs ds∣ t ] is given by . ξt(T) := � [vT | t ] ξt(T) = ∂T t(T) A natural way of satisfying the martingale constraint whilst ensuring positivity is to impose lognormal dynamics as in Dupire’s (1993) example: dξt(u) = σ(u − t) dWt ξt(u) for some volatility function σ(⋅).

Most approaches to joint modeling of SPX and VIX are effectively extensions of this idea to n- factors.

Variance curve models

The idea (similar to the stochastic implied volatility idea) is to obtain a factor model for forward variance swaps. That is,

ξt(u) = G(z; u − t)

with z = {z1, z2, . . . , zn} for some factors zj and some variance curve functional G(⋅). Specifically, we want z to be a diffusion so that

(4) d j j dzt = μ(zt ) dt + ∑ σ (zt) dWt j

Note that both μ and σ are n −dimensional vectors.

Buehler’s affine variance curve functional

Consider the following variance curve functional: −κ τ κ −c τ −κ τ G(z; τ) = z3 + (z1 − z3) e + (z2 − z3) (e − e ) κ − c This looks like the Svensson parametrization of the .

The short end of the curve is given by z1 and the long end by z3 . The middle level z2 adds flexibility permitting for example a hump in the curve. Double mean-reverting (DMR) dynamics

One model consistent with Buehler’s affine variance curve functional, is the double mean reverting (DMR) model explored in [Bayer, Gatheral and Karlsmark] which takes the form:

(5)

dS α β = z1 dW dz1 = − κ (z1 − z2) dt + ξ1 z1 dZ1 dz2 = − c (z2 − z3) dt + ξ2 z2 dZ2 S √‾‾ for any choice of α, β ∈ [1/2, 1].

All such models involve a short term variance level z1 that reverts to a moving level z2 at rate κ. z2 reverts to the long-term level z3 at the slower rate c < κ.

Discriminating between SV models using VIX options

We now use the DMR model to demonstrate how VIX options enable us to restrict modeling choices. Again the idea is that VIX option prices should allow us to discriminate between models.

Fit of Double Lognormal model to VIX options

As of 03-Apr-2007, from Monte Carlo simulation with parameters

z1 = 0.0137; z2 = 0.0208; z3 = 0.0421; κ = 12; ξ1 = 7; c = 0.34; ξ2 = 0.94; α = β = 1; we get the following fits (orange lines):

Fit of Double Heston model to VIX options

As of 03-Apr-2007, from Monte Carlo simulation with parameters

z1 = 0.0137; z2 = 0.0208; z3 = 0.0421; κ = 12; ξ1 = 0.7; c = 0.34; ξ2 = 0.14; α = β = 1/2; we get the following fits (orange lines):

Pros and cons of the DMR model

On the pro side, the DMR model fits both SPX and VIX smiles remarkably well.

On the other hand, there is no closed-form solution for European options so calibration is slow (read impractical). Other modeling approaches

[Bergomi][1] uses effectively a sum of lognormals to replicate the upwards sloping smile in the VIX. Pro: More realistic diffusion dynamics. Con: Tractability even worse than DMR; Monte Carlo is required for all computations.

[Cont and Kokholm][3] model SPX and VIX jointly using Lévy processes. Their specification has simultaneous jumps in the price and volatility. Pro: Vanilla options on VIX and variance swaps are easy to price using characteristic function methods. Vanilla options on SPX are computed using a mixing formula. So reasonably tractable. Con: Dynamics are unrealistic.

The Beta SVJ model of [Sepp][8] uses jumps as a proxy for volatility risk premium.

According to Sepp's calibration of the Best SVJ model to the SPX volatility surface, there are simultaneous jumps of down almost 30% in the SPX and up 30% in variance with rate 8.6%. This would make suitably chosen barrier options and binaries (for example) very valuable.

On the other hand, the connection between the statistical measure and the pricing measure is carefully explored.

And there is an accurate approximation for pricing European options.

Quote from Cont and Kokholm

In reference to the empirical success of the variance swap rebalancing strategy (4), Cont and Kokholm make the following comment:

The fact that the tracking error associated with this hedging strategy is found to be small in historical data does not entail that the contribution of jumps to the pricing of variance swaps is negligible. This common fallacy is akin to saying that since crashes occur infrequently, deep out-of-the-money puts should be priced at zero: recent experience shows that such mistaken assertions can be costly. and then also

Moreover, jumps in volatility are also important in order to produce the positive “skew” of implied volatilities of VIX options. We beg to disagree:

Using jumps as a proxy for risk premium can itself be very dangerous.

If there are large jumps under the pricing measure, we should be prepared to pay high prices for contracts that intuitively have little value. Consider a hyphothetical guaranteed stop-loss contract for example.

In our view, the SPX is best modeled using a continuous diffusion process.

More modeling philosophy

There are at least two very different reasons for modeling in general and joint modeling of SPX and VIX in particular:

1. To price and hedge options in a large portfolio of exotic options. 2. To assess the fair value of options in both absolute and relative terms.

Models such as the Karasinski-Sepp model have many parameters and can thus be calibrated to fit not only vanillas but also exotic options such as cliquets. Such models are of interest to book runners. However it is not clear that exotic contracts such as cliquets are being fairly priced.

The rough volatility model that we will explore in Session 6 is an example of the second class of model. Such models are primarily of interest to traders and market makers.

Summary

Volatility derivatives are now very actively traded, not least because from a practical perspective, valuation is well-understood.

We saw that although the relationship between the on variance and European option prices is currently only partially understood, it’s pretty clear from a practical perspective how to value them.

On the theoretical side, connections between the valuation of volatility derivatives and the dynamics of the underlying process continue to be investigated. References

1. ^ Lorenzo Bergomi, Smile dynamics III, Risk Magazine , 90-96 (October 2008). 2. ^ Peter Carr and Dilip Madan, Towards a theory of volatility trading, in Volatility: New estimation techniques for pricing derivatives, Risk Publications, Robert Jarrow, ed., 417–427 (1998). 3. ^ Rama Cont and Thomas Kokholm, A consistent pricing model for index options and volatility derivatives, 23(2) 248–274 (2013). 4. ^ Masaaki Fukaswawa, The normalizing transformation of the implied volatility smile, Mathematical Finance 22(4) 753–762 (2012). 5. ^ Masaaki Fukaswawa, Volatility Derivatives and Model-free Implied Leverage, International Journal of Theoretical and Applied Finance 17(1) 1450002 (2014). 6. ^ Jim Gatheral, The Volatility Surface: A Practitioner's Guide, John Wiley and Sons, Hoboken, NJ (2006). 7. ^ Artur Sepp, Empirical calbration and minimum variance delta under log-normal stochastic volatility dynamics, SSRN 2387845 (2014).

In [ ]: