Thursday, June 2, 2011

RUBY: Fast evaluation of European options under the Merton jump diffusion


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
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