Asian Option Pricing (MATLAB)

From LiteratePrograms

Jump to: navigation, search
Plot of internal values of asiancontinuous


Here is the MATLAB implementation of the pricing of Asian options from the paper Unified Asian Pricing by Jan Vecer (2002), Risk, Vol. 15, No. 6, 113-116 (some minor changes have been made by Charles-Albert Lehalle).

Use of the pricing function

This function is easy to use, it returns the price of the option and the way to plot some internal results.

[price, pde_sol] = asiancontinuous(100, 110, .04, .12, .5)

The result of the last line is quite simple (see figure).

MATLAB function for pricing

Main function

function [price, pde_sol] = asiancontinuous(S0,K,r,vol,T)
% ASIANCONTINUOUS - implementation of Vecer's PDE Method for Asion Option
% Pricing, minor modifications by Charles-Albert Lehalle.
% use:
% [price, pde_sol] = asiancontinuous(100, 110, .04, .12, .5)
% pde_sol.plot()
%Implementation of Vecer's PDE Method
%Vecer, J. (2002): "Unified Asian Pricing",  Risk, Vol. 15, No. 6, 113-116 
mesh building
solve pde
price value
fprintf( '\n\nPrice of Asian Option is %8.6f\n\n', price);
description of PDE
initial condition
boundary condition
plot function

PDE Solving with MATLAB

The MATLAB pdepe function is used to solve parabolic-elliptic initial-boundary value problems.

<<solve pde>>=
m = 0;
sol = pdepe(m, @pdef, @pdeic, @pdebc, x, t);
pde_sol = struct('x', x, 't', t, 'u', sol(:,:,1), 'plot', @plot_sol);

Mesh building

<<mesh building>>=
N = 200;       %number of subintervals in space 
M = 200;       %number of subintervals in time
%more points -> higher precision, but slower
%Xmesh  x
xmin = -1;
xmax = 1;
x = linspace(xmin, xmax, N+1);
t = linspace(0, T, M+1);

Description of PDE

<<description of PDE>>=
function [c, f, s] = pdef(x, t, u, DuDx)
c = 1;
    f = 0.5*vol^2*( (1-exp(-r*t))/(r*T) - x )^2*DuDx;
    s = vol^2*((1-exp(-r*t))/(r*T) - x)*DuDx;

Initial Condition

<<initial condition>>=
function u0 = pdeic(x)
u0 = max(x, 0);

Boundary Condition

<<boundary condition>>=
function [pl, ql, pr, qr] = pdebc(xl, ul, xr, ur, t)
pl = ul;
ql = 0;
pr = ur - xr;
qr = 0;

Compute price value

The MATLAB pdeval function is used here.

<<price value>>=
%Output of the value of the option
X_0 = (1-exp(-r*T))*S0/r/T - exp(-r*T)*K;
x0 = X_0/S0;
uout = pdeval(m,x,sol(M+1,:),x0);
price = uout*S0;

Plot function

You can see here how MATLAB embedded functions can be used to implicitly create some internal variables (here the |pde_sol| variable become implicitly stored into the results of the |asiancontinuous.m| function).

<<plot function>>=
function h = plot_sol
figure('Color',[0.9412 0.9412 0.9412 ]);
surf(pde_sol.x, pde_sol.t, pde_sol.u, 'edgecolor', 'none');
axis([min(pde_sol.x) max(pde_sol.x) min(pde_sol.t) max(pde_sol.t) min(min(pde_sol.u)) max(max(pde_sol.u))]);