European call

When solving the PDE for the value $V$ of a European call option under the Black-Scholes model using a finite difference scheme, we have that

  • Initial/terminal condition. $V(S_T,T) = \text{payoff}(S_T) = \max(S_T-K,0)$ (initial since the scheme is solved backward, terminal since it holds at the final time $T$)
  • Left end boundary condition. If $S_0=0$ then $S_t=0$ for all $t$ and the option will surely be out of the money with payoff $\max(0-K,0)=0$ and $V(0,t)=0$ for all $t$
  • Right end boundary condition. If $S_0$ is large enough (w.r.t. to $K$) then $S_t>K$ for all $t$ and the option will end up in the money with payoff $\max(S_t-K,0)=S_t-K$ and $V(S_t,t)=S_t-Ke^{-r(T-t)}$ for all $t$

Forward contract

How to deduce the boundary conditions in a similar manner when solving the PDE for the value of a forward contract whose underlying follows the Schwartz mean reverting model? What I understand until now about forwards is

  • There is no money exchanged when signing a forward contract so, using the notation below, I think that the value of the forward at time 0 is $F(S_0,0)=0$
  • The payoff (of the option equivalent to this forward contract) is $S_T-K$ since the holder is obliged to buy the underlying at expiry

The Schwartz model is $dS = \alpha(\mu-\log S)Sdt + \sigma S dW$ with $\alpha$ speed of mean reversion. From this eq it is possible to derive the PDE for the value of the forward

$$\tag1 \frac{\partial F}{\partial t} + \alpha\Big(\mu-\lambda -\log S\Big)S\frac{\partial F}{\partial S}+\frac12\sigma^2S^2\frac{\partial^2F}{\partial S^2} = 0, \qquad \text{with }\lambda = \sigma\frac{\mu-r}\alpha $$

whose solution is, letting $\tau=T-t$

$$\tag2 F(S_t,\tau) = \mathbb E[S_t] = \exp\bigg(e^{-\alpha\tau}\log S_t +\Big(\mu-\frac{\sigma^2}{2\alpha}-\lambda\Big)(1-e^{-\alpha\tau})+\frac{\sigma^2}{4\alpha}(1-e^{-2\alpha\tau})\bigg) $$

  • Initial/terminal condition. Plugging $\tau=0$ (ie $t=T$) in $(2)$ we get $F(S_T,0) = \exp(\log S_T) = S_T$. This value appears also in the original paper by Schwartz (at page 5), so it is correct.
  • Left end boundary condition. As in the European call case, if $S_0=0$ then $S_t=0$ for all $t$ and from $(1)$ we get $\dfrac{\partial F}{\partial t}=0$ ie $F$ does not change in time, and since as said before $F(S_0,0)=0$ (not sure though) it follows $F(0,t)=0$ for all $t$. But this means that the payoff of the option would be $0-K$ that is negative, since prices cannot be negative how to deal with this fact?
  • Right end boundary condition. If $S_0$ is large enough (w.r.t. to $K$) then $S_t>K$ for all $t$ and the payoff of the option will be $F(S_t,t)-K$ and $V(S_t,t)=(F(S_t,t)-K)e^{-r(T-t)}$ for all $t$, but what can we say about the value of $F(S_t,t)$?

At the end of the finite difference scheme, to obtain the value of the option at time 0 we compute $V(S_0,0) = (F(S_0,0)-K)e^{-rT}$ which in general is not 0, in contrast with what I said above about $F$ being 0 at time 0. What is wrong in the reasoning?


What follows is the Matlab code that computes the exact value of the option at time 0 (V_exact) and the value approximated by the Euler explicit finite difference scheme (V_euler). The initial/terminal condition is applied at line 26 (F = ST), the next two lines are for the left end condition (F(1) = 0) and the right end condition (I don't know what to put here).

Moreover, I'm not sure that V_exact is computed correctly, should be (F-K)*exp(-r*T) or F-K*exp(-r*T)?

S0 = 22.93; % spot price at time 0
r = .1; % risk-free interest rate
T = 1/2; % expiry time
K = 18; % strike price

alpha = 0.069217; %
sigma = 0.087598; % estimated from data
mu = 3.058244;    %

tau = T-0; % time to expiry
F = exp( exp(-alpha*tau)*log(S0) + (mu-sigma^2/2/alpha-sigma*(mu-r)/alpha)*(1-exp(-alpha*tau)) + sigma^2/4/alpha*(1-exp(-2*alpha*tau)) );
V_exact = (F-K)*exp( -r*tau ); % or is it V_exact = F - K*exp( -r*tau ) ?

%% Euler Explicit Finite Difference Scheme

n = 3000; % number of time steps
dt = T/n; % delta t
domain = [0 3*K];  % truncation of the domain [0,inf)
m = 100; % number of spot prices
ST = linspace(domain(1),domain(2),m); % spot prices at time T (0, 0+dx, 0+2*dx 0+3*dx and so on)
dx = ST(2)-ST(1); % delta x
fprintf('dt/dx^2 = %f\n',dt/dx^2) % should be <= 0.5 to have stability

S = ST(2:end-1); % exclude first and last
F = ST; % initial/terminal condition
F(1) = 0; % left end condition, correct?
% F(end) = ; % right end condition, what to put here?
for m = 1:n
    F(2:end-1) = S*dt/2/dx.*( -alpha*mu+sigma*(mu-r)+alpha*log(S)+sigma^2*S/dx).*F(1:end-2) ...
               +                                       (1-sigma^2*S.^2*dt/dx^2).*F(2:end-1) ...
               + S*dt/2/dx.*(  alpha*mu-sigma*(mu-r)-alpha*log(S)+sigma^2*S/dx).*F(3:end);
V_euler = interp1(ST,(F-K)*exp(-r*T),S0 , 'spline');
fprintf( 'V_exact = %f\nV_euler = %f\n  error = %f\n' , V_exact , V_euler , abs(V_euler-V_exact) )


This is the plot with spot prices at time T (vector ST in the code) on x-axis and option prices at time 0 ((F-K)*exp(-r*T) in the code) on y-axis. As you can see the there is a problem when the option price approaches the biggest value of the spot price, since the curve goes from linear to exponential, I guess this is due to the fact that the right end condition is missing

enter image description here


Your Answer

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

Browse other questions tagged or ask your own question.