Monte Carlo Pricing of Down-and-Out Calls and Barrier Monitoring
Summary
The document examines a Monte Carlo estimate for a down-and-out call that appears higher than a quoted reference value. It explains that discrete path sampling can miss barrier crossings between observation times, so simulation of a continuously monitored barrier may require a Brownian bridge crossing probability adjustment. The payoff must also be zero after knockout and otherwise use the positive part of the terminal stock price minus strike.
An example uses a risk-neutral drift equal to the interest rate and compares a simulated barrier price with a web calculator, while a vanilla call price serves as a basic simulation check. The reported barrier estimates are close but not identical. The example does not fully specify monitoring conventions or establish that the calculator uses matching assumptions; the accepted explanation also cautions that continuous and discrete barriers have different values.
Key ideas
- Discrete monitoring can miss barrier crossings that occur between simulated time steps.
- A Brownian bridge can estimate the probability of crossing the barrier conditional on simulated endpoints.
- A down-and-out call pays zero after knockout and otherwise has a nonnegative call payoff at maturity.
- Risk-neutral pricing uses the risk-free rate as the drift in the illustrated stock simulation.
- Vanilla option pricing provides a useful check of the simulation setup.
Tags
Full text
# Barrier option : Monte carlo simulation
# Barrier option : Monte carlo simulation
I am trying to price a Down-and-Out Call using Monte Carlo simulation. The problem is that I get the right price for the vanilla option (same price as the analytic formula of Black and Scholes) but I do not get the right price for the down-and-out Call.
```
S0 = 105 % Price of underlying
sig = 0.28; % vol
mu = 0.0025; % drift
B = 101 % Barrier
K = 100 % Strike
```
In particular, the right price is 4.14 while I get around 5 with Monte carlo simulation. Can you help me ?
```
nbrsim = 10000;
S = zeros(nbrsim,nbre_step+1);
for j = 1:nbrsim
S(j,1)=S0;
for i = 1:nbrstep
t(i+1)=t(i)+dt;
Z = normrnd(0,1);
S(j,i+1)=S(j,i) + mu*S(j,i)*dt + S(j,i) * sig * sqrt(dt) * Z;
end
ST(j)=S(j,nbrstep+1);
end
K=100
B = 101
for j = 1:nbrsim
if min(S(j,:)) <= B
l(j) = 0;
else
l(j) = 1;
end
vectpayoffs(j) = l(j)*max(ST(j) - K,0);
end
r= 0.0025
DF = exp(- r * T);
Downout = DF * 1/nbrsim * sum(vectpayoffs)
```
I don't understand why I don't get the right price. Is there a mistake here?
Thank you !
## Answer by mxzzzzz (score 2, accepted)
https://quant.stackexchange.com/a/22668
first question, are you talking about continuous or discrete barrier? they difference is very important. when you price cont barrier with MC you actually cannot observe stock continuously you observe it discretely. the latter cause mispricing. so you have to make adjustment to your price. or you can price your barrier with simulation brownian bridge: you simulate terminal stock price then calculate probability that random variable (process) crosses barrier given initial and terminal stock prices, time and vol. there is some nice research paper on this topic, but i dont remember its name and authors. just google pricing barriers with brownian bridge, or the problem continuous vs dicrete
## Answer by mbison (score 1)
https://quant.stackexchange.com/a/22652
why do you have
> vectpayoffs(j) = l(j)*(ST(j) - K);
if it is a knockout call, it should be l(j)*max(ST(j, maturityDate) -K, 0).
I assumed that j indicates which simulation it is, and you have columnwise the dates.
However you have stated before that for ordinary vanilla calls you get the correct solution which is odd. If adding the max does not help, why not post all of your matlab code. We can have a quick look at how all your variables and stuff are really defined.
Code i went over your code. and with the modification of max(ST -K,0) it seems to me that your code produces the correct results (although you coded it up quite inefficient in matlab with your double for loop).
The output of the code below is Downout = 4.9797 and call_vanilla = 14.2127. You can compare that against a barrier option pricer on the web. for example
The webpricer gave me 4.94 which might be explainable by daycount conventions, rounding etc.
http://www.fintools.com/resources/online-calculators/exotics-calculators/exoticscalc-barrier/
```
S0 = 105 % Price of underlying
sig = 0.28; % vol
K=100
B = 101 %
%B = 0.001 %set very low B to pretend to be vanilla.
r= 0.0025
mu = r % you are simulating the risk neutral process. not the real world
T = 1
nbrsim = 10000;
nbre_step = 256
S = zeros(nbrsim,nbre_step+1);
dt = 1 / nbre_step
for j = 1:nbrsim
S(j,1)=S0;
for i = 1:nbre_step
%not needed t(i+1)=t(i)+dt;
Z = normrnd(0,1);
S(j,i+1)=S(j,i) + mu*S(j,i)*dt + S(j,i) * sig * sqrt(dt) * Z;
end
ST(j)=S(j,nbre_step+1);
end
for j = 1:nbrsim
if min(S(j,:)) <= B
l(j) = 0;
else
l(j) = 1;
end
vectpayoffs(j) = l(j)*max(ST(j) - K,0);
end
DF = exp(- r * T);
Downout = DF * 1/nbrsim * sum(vectpayoffs)
%sanity check against black scholes
call_vanilla = blsprice(105, 100, r, T, sig)
```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.