https://github.com/cran/fOptions
Raw File
Tip revision: 9c58bb98a62fa8226a1f41c6fb1f98485b101250 authored by Rmetrics Core Team on 08 August 1977, 00:00:00 UTC
version 270.74
Tip revision: 9c58bb9
HestonNandiOptions.R

# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU Library General 
# Public License along with this library; if not, write to the 
# Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
# MA  02111-1307  USA

# Copyrights (C)
# for this R-port: 
#   1999 - 2004, Diethelm Wuertz, GPL
#   Diethelm Wuertz <wuertz@itp.phys.ethz.ch>
#   info@rmetrics.org
#   www.rmetrics.org
# for the code accessed (or partly included) from other R-ports:
#   see R's copyright and license files
# for the code accessed (or partly included) from contributed R-ports
# and other sources
#   see Rmetrics's copyright file


################################################################################
# FUNCTION:           DESCRIPTION:
#  HNGOption           Computes Option Price from the HN-GARCH Formula
#  HNGGreeks           Calculates one of the Greeks of the HN-GARCH Formula
#  HNGCharacteristics  Computes Option Price and all Greeks of HN-GARCH Model
################################################################################

    
HNGOption = 
function(TypeFlag = c("c", "p"), model, S, X, Time.inDays, r.daily) 
{   # A function implemented by Diethelm Wuertz
    
    # Description:
    #   Calculates the price of a HN-GARCH option.
    
    # Details:
    #   The function calculates the price of a Heston-Nandi GARCH(1,1)
    #   call or put option. 

    # FUNCTION:
    
    # Option Type:
    TypeFlag = TypeFlag[1]
                
    # Integrate:
    call1 = integrate(.fstarHN, 0, Inf, const = 1, model = model, 
        S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily)
    # For SPlus Compatibility:
    if (is.null(call1$value)) call1$value = call1$integral
    call2 = integrate(.fstarHN, 0, Inf, const = 0, model = model, 
        S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily)
    # For SPlus Compatibility:
    if (is.null(call2$value)) call2$value = call2$integral
        
    # Compute Call Price:
    call.price = S/2 + exp(-r.daily*Time.inDays) * call1$value - 
        X * exp(-r.daily*Time.inDays) * ( 1/2 + call2$value )
    
    # Select Option Price:
    price = NA
    if (TypeFlag == "c" ) price = call.price
    if (TypeFlag == "p" ) price = call.price + X*exp(-r.daily*Time.inDays) - S
        
    # Return Value:
    option = list(
        price = price, 
        call = match.call())
    class(option) = "option"
    option
}


.fstarHN <- 
function(phi, const, model, S, X, Time.inDays, r.daily) 
{          
    # Internal Function:

    # Model Parameters:
    lambda = -1/2 
    omega = model$omega
    alpha = model$alpha 
    gamma = model$gamma + model$lambda + 1/2
    beta = model$beta   
    sigma2 = (omega + alpha)/(1 - beta - alpha * gamma^2)   
    # Function to be integrated:
    cphi0 = phi*complex(real = 0, imag = 1) 
    cphi = cphi0 + const   
    a = cphi * r.daily
    b = lambda*cphi + cphi*cphi/2           
    for (i in 2:Time.inDays) {
        a = a + cphi*r.daily + b*omega - log(1-2*alpha*b)/2
        b = cphi*(lambda+gamma) - gamma^2/2 + beta*b + 
            0.5*(cphi-gamma)^2/(1-2*alpha*b) }
    f = Re(exp(-cphi0*log(X)+cphi*log(S)+a+b*sigma2 )/cphi0)/pi 
    
    # Return Value:
    f 
}


# ------------------------------------------------------------------------------
    
    
HNGGreeks = 
function(Selection = c("Delta", "Gamma"), TypeFlag = c("c", "p"), model, 
S, X, Time.inDays, r.daily) 
{   # A function implemented by Diethelm Wuertz
    
    # Description:
    #   Calculates the Greeks of a HN-GARCH option.
    
    # Details:
    #   The function calculates the delta and gamma Greeks of 
    #   a Heston Nandi GARCH(1,1) call or put option. 
    
    # FUNCTION:
    
    # Type Flags:
    Selection = Selection[1]
    TypeFlag = TypeFlag[1]
            
    # Delta:
    if (Selection == "Delta") {
        # Integrate:
        delta1 = integrate(.fdeltaHN, 0, Inf, const = 1, model = model, 
            S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily)
        # For SPlus Compatibility:
        if (is.null(delta1$value)) delta1$value = delta1$integral   
        delta2 = integrate(.fdeltaHN, 0, Inf, const = 0, model = model, 
            S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily) 
        # For SPlus Compatibility:
        if (is.null(delta2$value)) delta2$value = delta2$integral   
        # Compute Call and Put Delta :
        greek = 1/2 + exp(-r.daily*Time.inDays) * delta1$value - 
            X * exp(-r.daily*Time.inDays) * delta2$value 
        if (TypeFlag == "p") greek = greek - 1 }
    
    # Gamma:
    if (Selection == "Gamma") {
        # Integrate:    
        gamma1 = integrate(.fgammaHN, 0, Inf, const = 1, model = model, 
            S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily)
        # For SPlus Compatibility:
        if (is.null(gamma1$value)) gamma1$value = gamma1$integral    
        gamma2 = integrate(.fgammaHN, 0, Inf, const = 0, model = model, 
            S = S, X = X, Time.inDays = Time.inDays, r.daily = r.daily)
        # For SPlus Compatibility:
        if (is.null(gamma2$value)) gamma2$value = gamma2$integral   
        # Compute Call and Put Gamma :
        greek = put.gamma = exp(-r.daily*Time.inDays) * gamma1$value - 
            X * exp(-r.daily*Time.inDays) * gamma2$value }
        
    # Return Value: 
    greek
}


.fdeltaHN <- 
function(phi, const, model, S, X, Time.inDays, r.daily) 
{          
    # Function to be integrated:
    cphi0 = phi * complex(real = 0, imag = 1) 
    cphi = cphi0 + const
    fdelta = cphi * 
        .fHN(phi, const, model, S, X, Time.inDays, r.daily) / S
    
    # Return Value:
    Re(fdelta) 
}


.fgammaHN <- 
function(phi, const, model, S, X, Time.inDays, r.daily) 
{          
    # Function to be integrated:
    cphi0 = phi * complex(real = 0, imag = 1) 
    cphi = cphi0 + const
    fgamma = cphi * ( cphi - 1 ) *
        .fHN(phi, const, model, S, X, Time.inDays, r.daily) / S^2
    
    # Return Value:
    Re(fgamma) 
}



.fHN <- 
function(phi, const, model, S, X, Time.inDays, r.daily) 
{           
    # Internal Function:
    
    # Model Parameters:
    lambda = -1/2 
    omega = model$omega
    alpha = model$alpha 
    gamma = model$gamma + model$lambda + 1/2
    beta = model$beta   
    sigma2 = (omega + alpha)/(1 - beta - alpha * gamma^2)   
    # Function to be integrated:
    cphi0 = phi*complex(real = 0, imag = 1) 
    cphi = cphi0 + const   
    a = cphi * r.daily
    b = lambda*cphi + cphi*cphi/2           
    for (i in 2:Time.inDays) {
        a = a + cphi*r.daily + b*omega - log(1-2*alpha*b)/2
        b = cphi*(lambda+gamma) - gamma^2/2 + beta*b + 
            0.5*(cphi-gamma)^2/(1-2*alpha*b) }
    fun = exp(-cphi0*log(X)+cphi*log(S)+a+b*sigma2)/cphi0/pi
    
    # Return Value:
    fun 
}


# ------------------------------------------------------------------------------


HNGCharacteristics = 
function(TypeFlag = c("c", "p"), model, S, X, Time.inDays, r.daily)
{   # A function implemented by Diethelm Wuertz
     
    # Description:
    #   The function calculates the option price for the Heston 
    #   Nandi Garch(1,1) option model together with the delta 
    #   and gamma option sensitivies.

    # FUNCTION: 
    
    # Premium and Function Call to all Greeks
    TypeFlag = TypeFlag[1]
    premium = HNGOption(TypeFlag, model, S, X, Time.inDays, r.daily)  
    delta = HNGGreeks("Delta", TypeFlag, model, S, X, Time.inDays, r.daily)  
    gamma = HNGGreeks("Gamma", TypeFlag, model, S, X, Time.inDays, r.daily)  
    
    # Return Value:
    list(premium = premium, delta = delta, gamma = gamma)   
} 


################################################################################

back to top