Implicit Finite Differences Method For Pricing Barrier Option[pdf version]<

Fabien Le Floc'h - fabien @ 31416.org



Why?


While trying to price a simple knock down and out barrier option, I encountered several difficulties I did not expect with the implicit finite differences method. The explicit method has less issues with barrier options pricing. I will show here what the tricky parts are and why explicit seems simpler in this case.

I am not the only one to have encountered unexpected problems with the implicit method and barrier options, you can find many posts about it on Wilmott forums without the correct answer.



The problem


Pricing vanilla option under implicit finite difference is not very difficult. It is well presented in many books (including Hull). The only tricky bit is the boundary conditions. But for a vanilla call/put they are trivial.

Wilmott in his book on quantitative finance presents alternative boundary conditions that can be used with more exotic options. One is the null gamma when the asset price is high, another is the rate drift when the asset price is 0 (less useful).


We will consider here a Knock Down and Out Call Barrier Option.

For such an option, the payoff is the rebate R if we are under the barrier level L. It seems natural to just take the vanilla implicit finite difference code and impose price=R when spot<=L.


Unfortunately this won't give the right price. The resulting price won't even be stable. If you have successfully priced a barrier option with the explicit method, you know that your grid has to hit the barrier level L to give a good and stable price. But this is not enough for the implicit method.


Truncating the grid at the barrier level will give a good and stable price. This is the important bit. Now let's find out what's different.




The variables pd, pm, pu are defined such as:


pd*price(M-1,n-1)+pm*price(M-1,n)+pu*price(M-1,n+1) = price(M, n).


We use the log of asset prices, this makes pd,pm,pu constants. The reasoning would be the same in linear asset price scale. This equation is used in M from M-1 equations column to display what the initial (unsolved) equation gives.


Obviously the problem is at the boundary conditions. The delta is not defined at the barrier, this is what creates the instability as the finite differences algorithm assumes the delta is defined everywhere. You can see in bold red the linear equations are not solved properly at the boundary. This is why truncating gives the correct price. The truncated version does not make use of a delta approximation at the barrier level as the equation is not solved there, the boundary condition only is used in the truncated algorithm.


This apparently localized effect actually propagates quite far as you can see with the difference of option prices at time M-2.



Why explicit method has not this problem.



Here pd,pm,pu are different because they follow the explicit equation:

pd*price(M,n-1)+pm*price(M,n)+pu*price(M,n+1) = price(M-1, n).


The equation is already solved for us. The bad point in red is overridden in the next run by the barrier rebate (=0). So it will have no impact.



The fictitious point


There is a way to have implicit method working with a non truncated grid, it is by ensuring the price is correct at the barrier by including some fictitious points.

If we just take table 1 and change the row under the barrier level so that we have the the boundary condition still works linearly (i.e we assume a delta and make it so that price @ L = 0), it means we have:

price(M-1,L-1)=-pu/pd*price(M-1,L+1).


Replacing in our first table gives:




It is almost correct but there is still a problem at L+1. This is because we replaced in the table, we actually need to solve the equation again. Solving the equation will ensure price(L+1) is correct.



We have the same prices as the truncated version.


Of course the price under the barrier will be wrong, because of the fictitious point.

The exact same thing will happen to Crank Nicolson as Crank Nicolson is just a mix of explicit and implicit methods.



Annexe – Parameters used


dividendRate = 0.04;

discountRate = 0.08;

vol = 0.25;

expiryTime = 0.5;

isAmerican = false;

initialSpot = 100;

isCall = true;

strike = 90;

level = 95;

dx = Math.log(initialSpot/level)/2; //very important S0*M*dx hit barrier

timeSteps = 10;