Class FDMSabrModel

java.lang.Object
net.finmath.finitedifference.assetderivativevaluation.models.FDMSabrModel
All Implemented Interfaces:
FiniteDifferenceBoundary, FiniteDifferenceEquityModel, FiniteDifferenceModel, Model

public class FDMSabrModel extends Object implements FiniteDifferenceEquityModel
Finite difference model for option pricing under the SABR stochastic volatility model.

The state variables are (S, alpha) where

  • S is the spot,
  • alpha is the stochastic volatility factor.

Under the risk-neutral dynamics with dividend yield, the model is given by

  dS = (r - q) S dt + alpha S^beta dW_1
  d alpha = nu alpha ( rho dW_1 + sqrt(1-rho^2) dW_2 ).

The methods getDrift(double, double...) and getFactorLoading(double, double...) follow the conventions used in FiniteDifferenceEquityModel.

Although one may formulate the PDE in transformed coordinates such as log(S), this class deliberately works in the variables (S, alpha) so that payoff functions can continue to use the spot directly.

Boundary conditions are delegated through FDBoundaryFactory.

Author:
Alessandro Gnoatto
  • Constructor Details

    • FDMSabrModel

      public FDMSabrModel(double initialSpot, double initialAlpha, DiscountCurve riskFreeCurve, DiscountCurve dividendYieldCurve, double beta, double nu, double rho, SpaceTimeDiscretization spaceTimeDiscretization)
      Constructs a SABR finite difference model from discount curves.
      Parameters:
      initialSpot - Initial spot price.
      initialAlpha - Initial volatility factor.
      riskFreeCurve - Risk-free discount curve.
      dividendYieldCurve - Dividend yield discount curve.
      beta - SABR elasticity parameter.
      nu - SABR volatility-of-volatility parameter.
      rho - Correlation between spot and volatility Brownian motions.
      spaceTimeDiscretization - Space-time discretization.
    • FDMSabrModel

      public FDMSabrModel(double initialSpot, double initialAlpha, DiscountCurve riskFreeCurve, double beta, double nu, double rho, SpaceTimeDiscretization spaceTimeDiscretization)
      Constructs a SABR finite difference model with zero dividend yield.
      Parameters:
      initialSpot - Initial spot price.
      initialAlpha - Initial volatility factor.
      riskFreeCurve - Risk-free discount curve.
      beta - SABR elasticity parameter.
      nu - SABR volatility-of-volatility parameter.
      rho - Correlation between spot and volatility Brownian motions.
      spaceTimeDiscretization - Space-time discretization.
    • FDMSabrModel

      public FDMSabrModel(double initialSpot, double initialAlpha, double riskFreeRate, double dividendYieldRate, double beta, double nu, double rho, SpaceTimeDiscretization spaceTimeDiscretization)
      Constructs a SABR finite difference model from constant rates.
      Parameters:
      initialSpot - Initial spot price.
      initialAlpha - Initial volatility factor.
      riskFreeRate - Constant risk-free rate.
      dividendYieldRate - Constant dividend yield rate.
      beta - SABR elasticity parameter.
      nu - SABR volatility-of-volatility parameter.
      rho - Correlation between spot and volatility Brownian motions.
      spaceTimeDiscretization - Space-time discretization.
    • FDMSabrModel

      public FDMSabrModel(double initialSpot, double initialAlpha, double riskFreeRate, double beta, double nu, double rho, SpaceTimeDiscretization spaceTimeDiscretization)
      Constructs a SABR finite difference model from a constant risk-free rate and zero dividend yield.
      Parameters:
      initialSpot - Initial spot price.
      initialAlpha - Initial volatility factor.
      riskFreeRate - Constant risk-free rate.
      beta - SABR elasticity parameter.
      nu - SABR volatility-of-volatility parameter.
      rho - Correlation between spot and volatility Brownian motions.
      spaceTimeDiscretization - Space-time discretization.
  • Method Details

    • getRiskFreeCurve

      public DiscountCurve getRiskFreeCurve()
      Description copied from interface: FiniteDifferenceEquityModel
      Returns the risk-free discount curve used for pricing.
      Specified by:
      getRiskFreeCurve in interface FiniteDifferenceEquityModel
      Returns:
      The risk-free discount curve.
    • getDividendYieldCurve

      public DiscountCurve getDividendYieldCurve()
      Description copied from interface: FiniteDifferenceEquityModel
      Returns the dividend-yield discount curve.

      This is the legacy single-asset accessor and remains part of the interface to preserve backward compatibility with the current code base.

      For true multi-asset models with one dividend curve per underlying, prefer FiniteDifferenceEquityModel.getDividendYieldCurves(). Such models may override this method with a convention suitable for backward compatibility.

      Specified by:
      getDividendYieldCurve in interface FiniteDifferenceEquityModel
      Returns:
      The dividend-yield discount curve.
    • getInitialValue

      public double[] getInitialValue()
      Returns the initial value of the state vector (S, alpha).
      Specified by:
      getInitialValue in interface FiniteDifferenceEquityModel
      Returns:
      The initial state vector.
    • getInitialSpot

      public double getInitialSpot()
      Returns the initial spot.
      Returns:
      The initial spot.
    • getInitialAlpha

      public double getInitialAlpha()
      Returns the initial volatility factor.
      Returns:
      The initial volatility factor.
    • getBeta

      public double getBeta()
      Returns the SABR elasticity parameter.
      Returns:
      The parameter beta.
    • getNu

      public double getNu()
      Returns the SABR volatility-of-volatility parameter.
      Returns:
      The parameter nu.
    • getRho

      public double getRho()
      Returns the correlation between spot and volatility Brownian motions.
      Returns:
      The parameter rho.
    • getSpaceTimeDiscretization

      public SpaceTimeDiscretization getSpaceTimeDiscretization()
      Description copied from interface: FiniteDifferenceModel
      Returns the space-time discretization used by this finite difference model.

      The discretization defines the grid in both time and space on which the PDE approximation is constructed.

      Specified by:
      getSpaceTimeDiscretization in interface FiniteDifferenceModel
      Returns:
      The SpaceTimeDiscretization used by this model.
    • getDrift

      public double[] getDrift(double time, double... stateVariables)
      Description copied from interface: FiniteDifferenceEquityModel
      Returns the drift vector of the model state variables.

      The returned coefficients must be expressed in the same coordinates as the PDE state variables used by the finite-difference solver.

      If the state vector is X = (X1, ..., Xn), then this method returns the vector mu(t, X) in

      dX_i(t) = mu_i(t, X_t) dt + ....

      Specified by:
      getDrift in interface FiniteDifferenceEquityModel
      Parameters:
      time - The evaluation time.
      stateVariables - The current values of the model state variables.
      Returns:
      The drift vector.
    • getFactorLoading

      public double[][] getFactorLoading(double time, double... stateVariables)
      Description copied from interface: FiniteDifferenceEquityModel
      Returns the factor-loading matrix of the model state variables.

      The returned coefficients must be expressed in the same coordinates as the PDE state variables used by the finite-difference solver.

      If the state vector is X = (X1, ..., Xn), then this method returns the matrix b(t, X) in

      dX_i(t) = mu_i(t, X_t) dt + sum_j b_{i,j}(t, X_t) dW_j(t).

      Specified by:
      getFactorLoading in interface FiniteDifferenceEquityModel
      Parameters:
      time - The evaluation time.
      stateVariables - The current values of the model state variables.
      Returns:
      The factor-loading matrix.
    • getCovariance

      public double[][] getCovariance(double time, double... stateVariables)
      Convenience method returning the covariance matrix a = B B^T, derived from getFactorLoading(double, double...).
      Parameters:
      time - Evaluation time.
      stateVariables - State variables.
      Returns:
      The covariance matrix.
    • getBoundaryConditionsAtLowerBoundary

      public BoundaryCondition[] getBoundaryConditionsAtLowerBoundary(FiniteDifferenceEquityProduct product, double time, double... riskFactors)
      Description copied from interface: FiniteDifferenceBoundary
      Returns the boundary conditions at the lower boundary.

      The returned array is indexed by state-variable dimension.

      Specified by:
      getBoundaryConditionsAtLowerBoundary in interface FiniteDifferenceBoundary
      Parameters:
      product - The product being valued.
      time - The running time.
      riskFactors - The state variables specifying the boundary location.
      Returns:
      The lower-boundary conditions by dimension.
    • getBoundaryConditionsAtUpperBoundary

      public BoundaryCondition[] getBoundaryConditionsAtUpperBoundary(FiniteDifferenceEquityProduct product, double time, double... riskFactors)
      Description copied from interface: FiniteDifferenceBoundary
      Returns the boundary conditions at the upper boundary.

      The returned array is indexed by state-variable dimension.

      Specified by:
      getBoundaryConditionsAtUpperBoundary in interface FiniteDifferenceBoundary
      Parameters:
      product - The product being valued.
      time - The running time.
      riskFactors - The state variables specifying the boundary location.
      Returns:
      The upper-boundary conditions by dimension.
    • getCloneWithModifiedSpaceTimeDiscretization

      public FiniteDifferenceEquityModel getCloneWithModifiedSpaceTimeDiscretization(SpaceTimeDiscretization newSpaceTimeDiscretization)
      Description copied from interface: FiniteDifferenceEquityModel
      Returns a clone of this model with a modified space-time discretization.

      The returned model should represent the same stochastic dynamics and market data as the original one, but on the provided discretization.

      Specified by:
      getCloneWithModifiedSpaceTimeDiscretization in interface FiniteDifferenceEquityModel
      Parameters:
      newSpaceTimeDiscretization - The new space-time discretization.
      Returns:
      A clone of this model with the modified discretization.