1
$\begingroup$

A stock has a mean and volatility. A stock index has another mean and volatility. What is the value of an option that at time T pays out the stock price at time T if the stock has outperformed the index by 3%? In other words, if $S_T/I_T > 1.03$ then payoff = $S_T$ otherwise the payoff is zero.

One approach would be the monte carlo approach:

  • simulate M=10,000 paths for the stock and index, each path of length 250. Use a GBM with mean and volatility estimated from historical data
  • save the end price of each path, thus having a list of M stock prices and index prices
  • Pr(payoff) = sum the number of times stock/index > 1.03 and divide by M
  • the expected payoff = Pr(payoff) * average($S_T$)
$\endgroup$
  • $\begingroup$ I assume MC would work, are you maybe more interested in an analytical solution? $\endgroup$ – Bob Jansen Feb 20 '18 at 15:15
  • $\begingroup$ I suspect it would be possible to derive an analytical solution, using black scholes. $\endgroup$ – jacob Feb 20 '18 at 15:23
  • $\begingroup$ I guess you meant $S_T/S_0 > 1.03 I_T/I_0$. Estimating mean and volatility from historical data is pretty vague. It's OK if you imply the vols and drifts from option data but not from usual time series (Q vs P). Yes you can use MC but you need to compute the price as: P = discount factor x average payoff The way you did indeed amounts to writing that $ \Bbb{E}[ S_T 1\{A\} ] = \Bbb{E}[S_T] Q(A) $ which is wrong here since the event $A$ triggering the payout and $S_T$ are not indep. $\endgroup$ – Quantuple Feb 20 '18 at 15:23
  • $\begingroup$ PS: I don't think there is a closed form formula in this particular case (there is one for a special kind of spread option paying $(S_T-I_T) 1\{ S_T - I_T \geq K\}$ for $K=0$ known as Magrabe's formula. But not for a general $K$.). Maybe a decent approximation exists though. $\endgroup$ – Quantuple Feb 20 '18 at 15:27
  • $\begingroup$ There is a closed form formula: the payoff is $S_T \times \text{Indicator}(S_T/I_T > 1.03)$ and $e^{-rT}E_P[S_T \times \text{Indicator}(S_T/I_T > 1.03)] = S_0E_Q[\text{Indicator}(S_T/I_T > 1.03)] $ where $Q$ is the stock measure is easily computed. $\endgroup$ – Antoine Conze Feb 26 '18 at 7:56
3
$\begingroup$

Assume under risk neutral measure \begin{eqnarray} dS_t/S_t&=&\alpha_1 dt + \sigma_1 dW^1_t \\ dI_t/I_t&=&\alpha_2 dt + \sigma_2 dW^2_t \end{eqnarray} where $\alpha_1$ and $\alpha_2$ are the risk neutral drifts (containing the information on rate, dividends and repo cost. For instance $\alpha_1 = \alpha_2 = r$ if there is zero dividends and zero repo cost), $\sigma_1$ and $\sigma_2$ are the respective stock and index volatilities, and with correlation $\rho$ between $W^1$ and $W^2$,

Then \begin{eqnarray} \text{option value} &=& e^{-rT} E_P[S_T \times \text{Indicator}(S_T/I_T > 1.03)]\\ &=& e^{-rT} E_P[S_T] E_Q[\text{Indicator}(S_T/I_T > 1.03)] \\ &=& e^{-rT} E_P[S_T] Q(S_T/I_T > 1.03) \\ &=& e^{(\alpha_1-r)T} S_0 Q(S_T/I_T > 1.03) \\ \end{eqnarray}

where $dQ/dP|_{t=0}=S_T/E_P[S_T]$.

From the Girsanov theorem \begin{eqnarray} dS_t/S_t&=&(\alpha_1+\sigma_1^2) dt + \sigma_1 dW'^1_t \\ dI_t/I_t&=&(\alpha_2+\rho\sigma_1\sigma_2) dt + \sigma_2 dW'^2_t \end{eqnarray} with $W'^1$ and $W'^2$ standard Brownian motions under $Q$, with correlation $\rho$.

After integrating the SDE for $S_t$ and $I_t$, \begin{eqnarray} S_T&=&S_0\exp\left((\alpha_1+\frac{1}{2}\sigma_1^2) T+\sigma_1W'^1_T\right) \\ I_T&=&I_0\exp\left((\alpha_2-\frac{1}{2}\sigma_2^2+\rho\sigma_1\sigma_2) T+\sigma_2W'^2_T\right) \end{eqnarray} hence \begin{eqnarray} \frac{S_T}{I_T}&=&\frac{S_0}{I_0}\exp\left((\alpha_1+\frac{1}{2}\sigma_1^2) T-(\alpha_2-\frac{1}{2}\sigma_2^2+\rho\sigma_1\sigma_2) T+\sigma_1W'^1_T-\sigma_2W'^2_T\right) \\ &=& \frac{S_0}{I_0}\exp\left((\alpha_1-\alpha_2+\frac{1}{2}(\sigma_1^2+\sigma_2^2-2\rho\sigma_1\sigma_2)) T+\sigma_1W'^1_T-\sigma_2W'^2_T\right) \\ &=& \frac{S_0}{I_0}\exp\left((\alpha_1-\alpha_2+\frac{1}{2}\Sigma^2) T + \Sigma W'_T\right) \end{eqnarray} with $\boxed{\Sigma=\sqrt{\sigma_1^2+\sigma_2^2-2\rho\sigma_1\sigma_2}}$ and $W'$ a standard Brownian motion under $Q$.

Finally $$ Q(S_T/I_T > 1.03) =N\left(\frac{\ln(\frac{S_0}{1.03 I_0})+(\alpha_1-\alpha_2+\frac{1}{2}\Sigma^2) T}{\Sigma\sqrt{T}}\right) $$ and $$ \boxed{\text{option value} = e^{(\alpha_1-r)T} S_0 N\left(\frac{\ln(\frac{S_0}{1.03 I_0})+(\alpha_1-\alpha_2+\frac{1}{2}\Sigma^2) T}{\Sigma\sqrt{T}}\right) } $$

$\endgroup$
0
$\begingroup$

I get (with the params below) that the option is worth 58% of the stock's current value (which looks high to me).

## libraries

library(PerformanceAnalytics)
library(quantmod)
library(TTR)
library(xts)
library(sde) # needs fda.  https://cran.r-project.org/web/packages/sde/sde.pdf
library(dfa)
library(fOptions) 

## params 

y = 1 # year 
rf <- 0 # risk free rate 
M <- 1000 # number of simulations 
S_0 <- 100 # current price 
I_0 <- S_0 
ret_i <- 0.07 # yearly return 
ret_s <- 0.09
vol_i <- 0.10 # yearly vol
vol_s <- 0.22

## get list of retunrs, vols, end of ear stockprices 

path_i <- NULL
path_s <- NULL
vols_i <- NULL
vols_s <- NULL
prices_i <- NULL
prices_s <- NULL
returns_i <- NULL
returns_s <- NULL

for (k in 1:M){
  # an entire path  
  path_i[[k]] <- GBM(x = S_0, r = ret_i, sigma = vol_i, T = y, N = 250*y)
  path_s[[k]] <- GBM(x = I_0, r = ret_s, sigma = vol_s, T = y, N = 250*y)
  # returns of a path 
  returns_i[[k]] <- CalculateReturns(ts(path_i[[k]]))
  returns_s[[k]] <- CalculateReturns(ts(path_s[[k]]))
  # vol of a path, first day is NA 
  vols_i[[k]] <- sqrt(250)*stdev(returns_i[[k]][2:250])
  vols_s[[k]] <- sqrt(250)*stdev(returns_s[[k]][2:250]) 
  # price after 1 year:
  prices_i[[k]] <- path_i[[k]][250]
  prices_s[[k]] <- path_s[[k]][250] 
}

## check 

# check numerically::
length(path_i)
length(vols_i)
length(returns_i)
length(prices_i)

## index vs stock: 

prices_q <- prices_s / prices_i

payoffs <- NULL
# if stock beats index by 1% then payoff = 0
# if stock beats index by >3% then payoff = stock price 
# the payoff grows linearly between 1% and 3%
# so if stock beats index by 2% the payoff = half the stock price 
for (p in 1:M){
  pay <- NULL
  endprice = prices_q[[p]]
  pay <- ifelse(endprice < 1.01, 0, 
           ifelse(endprice > 1.03, prices_s[[p]], 
                  50*(endprice - 1.01) * prices_s[[p]]))
  payoffs[[p]] <- pay
}

(option_value <- mean(payoffs)/(1+rf)^y )
option_value / S_0
$\endgroup$
  • $\begingroup$ Does your sim match @AntoineConze 's analytical solution? $\endgroup$ – vonjd Mar 6 '18 at 16:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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