Question 1 (20 points)

Suppose that a stock price \(S\) folows geometric Brownian motion with expected reutrn \(\mu\) and volatility \(\sigma\). What is the process followed by the variable \(\sqrt{S}\)?

Solution:

Let \(G = \sqrt{S}\). By Ito’s Lemma, \[\begin{align} dG = \left( \frac{\partial G}{\partial S}\mu S + \frac{\partial G}{\partial t} + \frac{1}{2} \frac{\partial^{2}G}{\partial S^{2}}\sigma^{2}S^{2} \right)dt + \frac{\partial G}{\partial S} \sigma S dZ. \end{align}\] Since \(\frac{\partial G}{\partial S} = \frac{1}{2}S^{-\frac{1}{2}}\), \(\frac{\partial G}{\partial t}=0\), and \(\frac{\partial^{2}G}{\partial S^{2}} = -\frac{1}{4}S^{-\frac{3}{2}}\), \[\begin{align} dG = \frac{1}{2}G \left(\mu - \frac{1}{4}\sigma^{2} \right) dt + \frac{1}{2}\sigma GdZ. \end{align}\]

Question 2 (20 points)

Show that the Black-Scholes formulas for call and put options satisfy put-call parity. (Hint: you only need to use the formulas to verify put-call parity).

Solution:

By the formulas, \[\begin{align} C-P = S_{0}(\Phi(d_{1}) + \Phi(-d_{1})) - Xe^{-rT}(\Phi(d_{2}) + \Phi(-d_{2})). \end{align}\] Since \(\Phi(-d) = 1-\Phi(d)\), \[\begin{align} C-P = S_{0} - Xe^{-rT}. \end{align}\]

By rewriting this, we get \(S_{0}+p = c+Xe^{-rT}\), which is the put-call parity relationship.

Question 3 (20 points)

What is the price of a European put option on a non-dividend-paying stock when the stock price is $69, the strike price is $70, the risk-free interest rate is 5% per annum, the volatility is 35% per annum, and the time to maturity is six months?

Solution:

Given the information, \[\begin{align} &d_{1} = \frac{\ln(69/70)+(0.05+0.35^{2}/2)\times 0.5}{0.35\sqrt{0.5}} = 0.1666 \\ &d_{2} = d_{1} - 0.35\sqrt{0.5} = -0.0809. \end{align}\] Thus, the price of European put is \[\begin{align} 70e^{-0.05\times0.5}N(0.0809) -69N(-0.1666) = 70e^{-0.025}\times 0.5323 -69\times 0.4338= 6.4. \end{align}\]

Question 4 (20 points)

Let \(f\) be the price of a call option. Supose that \(rf> \frac{\partial f}{\partial t} + \frac{\partial f}{\partial S}rS + \frac{1}{2}\frac{\partial^{2}f}{\partial S^{2}}\sigma^{2}S^{2}\), which means that the BSM differential equation does not hold. Explain how you can exploit the arbitrage opportunity over period \(dt\).

Solution:

Since \(rf> \frac{\partial f}{\partial t} + \frac{\partial f}{\partial S}rS + \frac{1}{2}\frac{\partial^{2}f}{\partial S^{2}}\sigma^{2}S^{2}\), \[\begin{align} r\left(f-\frac{\partial f}{\partial S}S\right)dt &> \left(\frac{\partial f}{\partial t} + \frac{1}{2}\frac{\partial^{2}f}{\partial S^{2}}\sigma^{2}S^{2}\right)dt \\ \Leftrightarrow \ \ \ r \Pi dt &> d\Pi, \end{align}\]

where \(\Pi\) is the value of the riskless portfolio that consists of (i) a short position of 1 call option and (ii) a long position of \(\frac{\partial f}{\partial S}\) shares of stock. Since the return from this riskless portfolio is lower than the return from a riskless bond, buying a riskless bond and selling the riskless portfolio yields profit without risk.

Question 5 (20 points)

Download the VIX options data posted on the course website, vixOptionsData.csv. The data consists of options prices for VIX call and put options on May 29, 2018, with an expiration for the following day, May 30, 2018 (e.g. \(T=1/252\)). Assume that the continuously-compounded risk-free rate is \(r_f = 0.019\) and that the closing value of the VIX index on May 29th was \(S_0 = 17.02\). Using this information, compute the Black-Scholes-Merton implied volatility for each put option with strike \(X < S_0\) and for each call option with strike \(X > S_0\). Plot the implied volatilities as a function of the strikes on a single plot (calls and puts together). Note: due to discreteness of pricing, some of the implied volatilities will be spuriously large – above 0.98. Plot only the implied vols that are less than 0.98.

Solution:

# Data
S0 = 17.02
rf = 0.019
tt = 1/252
vixData = read.csv('vixOptionsData.csv')
callData = vixData[vixData$option_type=='c',]
putData = vixData[vixData$option_type=='p',]
callDataKeep = callData[callData$strike>S0,]
putDataKeep = putData[putData$strike<S0,]
bsError = function(sigma,price,S0,K,rf,tt,type=c('call','put')){
  d1 = (log(S0/K) + (rf+(sigma^2)/2)*tt)/(sigma*sqrt(tt))
  d2 = d1 - sigma*sqrt(tt)
  if(type=='call'){
    bsPrice = S0*pnorm(d1) - K*exp(-rf*tt)*pnorm(d2)
  } else if(type=='put'){
    bsPrice = K*exp(-rf*tt)*pnorm(-d2) - S0*pnorm(-d1)
  }
  return((price - bsPrice)^2)
}
bsImpliedVol = function(price,S0,K,rf,tt,type=c('call','put')){
  out = optimize(f=bsError, interval=c(0,1),price=price,S0=S0,K=K, rf=rf, tt=tt, type=type)
  return(out$minimum)
}

nCalls = dim(callDataKeep)[1]
nPuts = dim(putDataKeep)[1]
callImpliedVols = rep(NA,nCalls)
putImpliedVols = rep(NA,nPuts)
for(ix in 1:nCalls){
  callImpliedVols[ix] = bsImpliedVol(callDataKeep$close[ix],S0,callDataKeep$strike[ix],rf,tt,'call')
}
for(ix in 1:nPuts){
  putImpliedVols[ix] = bsImpliedVol(putDataKeep$close[ix],S0,putDataKeep$strike[ix],rf,tt,'put')
}
strikes = c(putDataKeep$strike,callDataKeep$strike)
impliedVols = c(putImpliedVols,callImpliedVols)
keep = impliedVols < 0.98
plot(strikes[keep],impliedVols[keep])