Variance Swaps, Gamma Swaps, VIX, and VVIX
Total Page:16
File Type:pdf, Size:1020Kb
First Baruch Volatility 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 underlying. We might expect volatility derivatives be very exotic and therefore hard to price and hedge 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 option equal to the second derivative of the payoff at the strike price 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 stock 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 replicating portfolio 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 swap 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 variance swap 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 market 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 bank. 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.