Purpose
- The package "Ruby" provides a fast method based on numerical PDEs for evaluating European put options under the Merton's jump diffusion. It uses a new modal spectral element method in the 1-D semi-unbounded space and a Crank-Nicolson Leap-frog scheme in time. The underline space module is inherited from the package "Sea".
Specifications
- Name: Ruby.
- Author: Feng Chen.
- Finishing date: 06/02/2011.
- Languages: Fortran 90, MATLAB.
- Required libraries: BLAS, LAPACK.
Simple Example
- Equation: \begin{equation} v_\tau=\frac{\sigma^2 S^2}{2}v_{SS} +(r-\lambda \kappa) Sv_S -(r+\lambda)v+\lambda\int_0^\infty v(\eta S, \tau)G(\eta)\text{d} \eta, \end{equation} where \begin{equation} (x,\tau) \in (0,\infty)\times (0,T),\quad G(\eta) = \frac{1}{\sqrt{2\pi} \delta \eta} e^{-\frac{(\ln \eta - m)^2}{2\delta^2}}. \end{equation}
- Initial condition: \begin{equation} v(S,0) = \max\{K-S,0\}. \end{equation}
- Parameters: \begin{equation} T = 0.25, \, K = 100, \, r = 0.05, \, \sigma = 0.15, \, \lambda = 0.1, \, \delta = 0.45, \, m = -0.9. \end{equation}
Quick Start
- Compiling and running:
cd ./Ruby make library ifort tst_Ruby.f90 -llibrary -llapack -lblas ./a.out matlab plot_Ruby.m
- Graphics:
The exact solution (blue lines) and the numerical solution (red dots) of the put option,
its gamma, and its delta are shown against the stock price.
References
- Feng Chen, Jie Shen, and Haijun Yu. A new spectral element method for pricing European options under the Black-Scholes and Merton jump diffusion models, Journal of Scientific Computing, Volume 52, Number 3, 499-518, (2012).
Code Highlights
!>
!! Exact evaluation of a Merton put option;
!! For comparing the numerical solution.
!<
function Merton_put(m, tau, s, K, r, &
sigma, lambda, delta, mean) result(y)
! number of evaluations
integer, intent(in) :: m
! terminal time
real(kind=8), intent(in) :: tau
! strike price
real(kind=8), intent(in) :: K
! interest rate
real(kind=8), intent(in) :: r
! dividend
real(kind=8), intent(in) :: sigma
! jump intensity
real(kind=8), intent(in) :: lambda
! jump variance
real(kind=8), intent(in) :: delta
! jump mean
real(kind=8), intent(in) :: mean
! stock prices
real(kind=8), intent(in), dimension(m) :: s
! option prices
real(kind=8), dimension(m) :: y
! shifted mean
real(kind=8) :: kappa
! log kappa
real(kind=8) :: vgamma
! shifted rate
real(kind=8) :: rm
! each BS option in the summatino
real(kind=8) :: each
! shifted jump intensity
real(kind=8) :: lambdap
! shifted jump variance
real(kind=8) :: sigmam
! temporary variables
real(kind=8) :: temp, temp2
integer :: i, n
kappa = exp(mean+delta*delta/2d0)-1d0
vgamma = log(1d0+kappa)
rm = 0d0
each = 0d0
n = 0
sigmam = 0d0
lambdap = lambda * (1d0 + kappa)
temp = 0d0
temp2 = 0d0
y = 0d0
do i = 1, m ! evaluate each option
do n = 0, 30 ! cut the series to item 30
rm = r - lambda*kappa + n*vgamma/tau
sigmam = sqrt(sigma*sigma + n*delta*delta/tau)
temp = -lambdap*tau + n*log(lambdap*tau) - sum_log(n)
each = exp(temp)
! evaluation based on the BS option
each = each * BS_put_generic(tau, s(i), K, rm, sigmam)
! accumulated sum
y(i) = y(i) + each
end do
end do
end function Merton_put
No comments:
Post a Comment