Pricing a Stock Option Conditional on Outperforming an Index
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.