Skip to content
All library documents

Pricing a Stock Option Conditional on Outperforming an Index

Article Quant Q&A · Author: jacob

Summary

The document studies a payoff that delivers the stock’s terminal price only when its return relative to an index clears a threshold. It first sketches Monte Carlo simulation using geometric Brownian motion, then gives a risk-neutral derivation. The derivation changes measure using the stock as numeraire, so the relative stock-to-index price has a lognormal distribution under the resulting measure. Its variance depends on both volatilities and their correlation; the resulting probability of crossing the threshold, multiplied by a discounted stock expectation, yields the value under the stated assumptions.

A separate simulation example describes a different, graduated payoff that is zero below one relative-performance level, increases linearly over a band, and equals the stock price above the band. Its code estimates the expected payoff from simulated paths. These formulations should not be conflated: the closed-form expression addresses a binary threshold payoff. Both approaches assume specified diffusion dynamics and inputs; the Monte Carlo sketch also needs careful joint simulation and payoff averaging, while neither treatment addresses calibration, jumps, or model risk.

Key ideas

  • The binary payoff depends on whether the stock-to-index price ratio exceeds a threshold.
  • Under a stock-numeraire measure, the relative price is lognormal in the correlated geometric Brownian motion model.
  • The relative-price volatility combines stock volatility, index volatility, and their correlation.
  • Monte Carlo can estimate expected payoffs, but the example code uses a graduated payoff distinct from the binary payoff.
  • The pricing results depend on risk-neutral drifts and the assumed diffusion model.

Tags

Full text
# Option: payout if you beat index


# Option: payout if you beat index












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$)

## Answer by Antoine Conze (score 3)

https://quant.stackexchange.com/a/38640

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) } $$

## Answer by jacob (score 0)

https://quant.stackexchange.com/a/38353

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
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.