Main Content

Bates

Create Bates model object for Vanilla, Asian, Barrier, DoubleBarrier, Lookback, PartialLookback, Touch, DoubleTouch, Cliquet, or Binary instrument

Since R2020a

Description

Create and price a Vanilla, Asian, Barrier, DoubleBarrier, Lookback, PartialLookback, Touch, DoubleTouch, Cliquet, or Binary instrument object with a Bates model using this workflow:

  1. Use fininstrument to create a Vanilla, Barrier, Lookback, PartialLookback, Asian, DoubleBarrier, Cliquet, Binary, Touch, or DoubleTouch instrument object.

  2. Use finmodel to specify a Bates model object for the Vanilla, Asian, Barrier, DoubleBarrier, Lookback, PartialLookback, Touch, DoubleTouch, Cliquet, or Binary instrument object.

  3. Use finpricer to specify a FiniteDifference, NumericalIntegration, or FFT pricing method for the Vanilla instrument object.

    Use finpricer to specify an AssetMonteCarlo pricing method for the Vanilla, Asian, Barrier, DoubleBarrier, Lookback, PartialLookback, Touch, DoubleTouch, Cliquet, or Binary instrument object.

For more information on this workflow, see Get Started with Workflows Using Object-Based Framework for Pricing Financial Instruments.

For more information on the available pricing methods for a Vanilla, Asian, Barrier, DoubleBarrier, Lookback, PartialLookback, Touch, DoubleTouch, or Binary instrument, see Choose Instruments, Models, and Pricers.

Creation

Description

BatesObj = finmodel(ModelType,'V0',V0_value,'ThetaV',thetav_value,'Kappa',kappa_value,'SigmaV',sigmav_value,'RhoSV',rhosv_value, 'MeanJ',meanj_value, 'JumpVol',jumpvol_value,'JumpFreq',jumpfreq_value) creates an Bates object by specifying ModelType and the required name-value pair arguments V0, ThetaV, Kappa, SigmaV, RhoSV, MeanJ, JumpVol, and JumpFreq. The required name-value pair arguments set properties. For example, BatesObj = finmodel("Bates",'V0',0.032,'ThetaV',0.1,'Kappa',0.003,'SigmaV',0.2,'RhoSV',0.9,'MeanJ',0.11,'JumpVol',.023,'JumpFreq',0.02) creates a Bates model object.

example

Input Arguments

expand all

Model type, specified as a string with the value of "Bates" or a character vector with the value of 'Bates'.

Data Types: char | string

Name-Value Arguments

Specify required pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: Bates = finmodel("Bates",'V0',0.032,'ThetaV',0.1,'Kappa',0.003,'SigmaV',0.2,'RhoSV',0.9,'MeanJ',0.11,'JumpVol',.023,'JumpFreq',0.02)

Initial variance of the underlying asset, specified as the comma-separated pair consisting of 'V0' and a scalar numeric value.

Data Types: double

Long-term variance of the underlying asset, specified as the comma-separated pair consisting of 'ThetaV' and a scalar numeric value.

Data Types: double

Mean revision speed for the underlying asset, specified as the comma-separated pair consisting of 'Kappa' and a scalar numeric value.

Data Types: double

Volatility of the variance of the underlying asset, specified as the comma-separated pair consisting of 'SigmaV' and a scalar numeric value.

Data Types: double

Correlation between the Wiener processes for the underlying asset and its variance, specified as the comma-separated pair consisting of 'RhoSV' and a scalar numeric value.

Data Types: double

Mean of the random percentage jump size (J), specified as the comma-separated pair consisting of 'MeanJ' and a scalar decimal value where log(1+J) is normally distributed with mean (log(1+MeanJ)-0.5*JumpVol^2) and the standard deviation JumpVol.

Data Types: double

Standard deviation of log(1+J), where J is the random percentage jump size, specified as the comma-separated pair consisting of 'JumpVol' and a scalar decimal value.

Data Types: double

Annual frequency of the Poisson jump process, specified as the comma-separated pair consisting of 'JumpFreq' and a scalar numeric value.

Data Types: double

Properties

expand all

Initial variance of the underlying asset, returned as a scalar numeric value.

Data Types: double

Long-term variance of the underlying asset, returned as a scalar numeric value.

Data Types: double

Mean revision speed for the underlying asset, returned as a scalar numeric value.

Data Types: double

Volatility of the variance of the underlying asset, returned as a scalar numeric value.

Data Types: double

Correlation between the Wiener processes for the underlying asset and its variance, returned as a scalar numeric value.

Data Types: double

Mean of the random percentage jump size (J), returned as a scalar decimal value.

Data Types: double

Standard deviation of log(1+J), where J is the random percentage jump size, returned as a scalar decimal value.

Data Types: double

Annual frequency of the Poisson jump process, returned as a scalar numeric value.

Data Types: double

Examples

collapse all

This example shows the workflow to price a Vanilla instrument when you use a Bates model and a NumericalIntegration pricing method.

Create Vanilla Instrument Object

Use fininstrument to create a Vanilla instrument object.

VanillaOpt = fininstrument("Vanilla",'ExerciseDate',datetime(2022,9,15),'Strike',105,'OptionType',"put",'ExerciseStyle',"european",'Name',"vanilla_option")
VanillaOpt = 
  Vanilla with properties:

       OptionType: "put"
    ExerciseStyle: "european"
     ExerciseDate: 15-Sep-2022
           Strike: 105
             Name: "vanilla_option"

Create Bates Model Object

Use finmodel to create a Bates model object.

BatesModel = finmodel("Bates",'V0',0.032,'ThetaV',0.1,'Kappa',0.003,'SigmaV',0.2,'RhoSV',0.9,'MeanJ',0.11,'JumpVol',.023,'JumpFreq',0.02)
BatesModel = 
  Bates with properties:

          V0: 0.0320
      ThetaV: 0.1000
       Kappa: 0.0030
      SigmaV: 0.2000
       RhoSV: 0.9000
       MeanJ: 0.1100
     JumpVol: 0.0230
    JumpFreq: 0.0200

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

Settle = datetime(2018,9,15);
Maturity = datetime(2023,9,15);
Rate = 0.035;
myRC = ratecurve('zero',Settle,Maturity,Rate,'Basis',12)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 12
                Dates: 15-Sep-2023
                Rates: 0.0350
               Settle: 15-Sep-2018
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create NumericalIntegration Pricer Object

Use finpricer to create a NumericalIntegration pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.

outPricer = finpricer("numericalintegration",'DiscountCurve',myRC,'Model',BatesModel,'SpotPrice',100)
outPricer = 
  NumericalIntegration with properties:

                Model: [1x1 finmodel.Bates]
        DiscountCurve: [1x1 ratecurve]
            SpotPrice: 100
         DividendType: "continuous"
        DividendValue: 0
               AbsTol: 1.0000e-10
               RelTol: 1.0000e-10
     IntegrationRange: [1.0000e-09 Inf]
    CharacteristicFcn: @characteristicFcnBates
            Framework: "heston1993"
       VolRiskPremium: 0
           LittleTrap: 1

Price Vanilla Instrument

Use price to compute the price and sensitivities for the Vanilla instrument.

[Price, outPR] = price(outPricer,VanillaOpt,["all"])
Price = 
6.4007
outPR = 
  priceresult with properties:

       Results: [1x7 table]
    PricerData: []

outPR.Results
ans=1×7 table
    Price      Delta       Gamma     Theta      Rho       Vega     VegaLT
    ______    ________    _______    _____    _______    ______    ______

    6.4007    -0.53541    0.02006    1.106    -239.77    94.257    1.3059

This example shows the workflow to price a fixed-strike Asian instrument when you use a Bates model and an AssetMonteCarlo pricing method.

Create Asian Instrument Object

Use fininstrument to create an Asian instrument object.

AsianOpt = fininstrument("Asian",'ExerciseDate',datetime(2022,9,15),'Strike',100,'OptionType',"put",'Name',"asian_option")
AsianOpt = 
  Asian with properties:

          OptionType: "put"
              Strike: 100
         AverageType: "arithmetic"
        AveragePrice: 0
    AverageStartDate: NaT
       ExerciseStyle: "european"
        ExerciseDate: 15-Sep-2022
                Name: "asian_option"

Create Bates Model Object

Use finmodel to create a Bates model object.

BatesModel = finmodel("Bates",'V0',0.032,'ThetaV',0.1,'Kappa',0.003,'SigmaV',0.02,'RhoSV',0.9,'MeanJ',0.11,'JumpVol',.023,'JumpFreq',0.02)
BatesModel = 
  Bates with properties:

          V0: 0.0320
      ThetaV: 0.1000
       Kappa: 0.0030
      SigmaV: 0.0200
       RhoSV: 0.9000
       MeanJ: 0.1100
     JumpVol: 0.0230
    JumpFreq: 0.0200

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

Settle = datetime(2018,9,15);
Maturity = datetime(2023,9,15);
Rate = 0.035;
myRC = ratecurve('zero',Settle,Maturity,Rate,'Basis',12)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 12
                Dates: 15-Sep-2023
                Rates: 0.0350
               Settle: 15-Sep-2018
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create AssetMonteCarlo Pricer Object

Use finpricer to create an AssetMonteCarlo pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.

outPricer = finpricer("AssetMonteCarlo",'DiscountCurve',myRC,"Model",BatesModel,'SpotPrice',80,'simulationDates',datetime(2022,9,15))
outPricer = 
  BatesMonteCarlo with properties:

           DiscountCurve: [1x1 ratecurve]
               SpotPrice: 80
         SimulationDates: 15-Sep-2022
               NumTrials: 1000
           RandomNumbers: []
                   Model: [1x1 finmodel.Bates]
            DividendType: "continuous"
           DividendValue: 0
        MonteCarloMethod: "standard"
    BrownianMotionMethod: "standard"

Price Asian Instrument

Use price to compute the price and sensitivities for the Asian instrument.

[Price, outPR] = price(outPricer,AsianOpt,["all"])
Price = 
14.5650
outPR = 
  priceresult with properties:

       Results: [1x8 table]
    PricerData: [1x1 struct]

outPR.Results 
ans=1×8 table
    Price      Delta       Gamma      Lambda       Rho       Theta      Vega     VegaLT 
    ______    ________    ________    _______    _______    _______    ______    _______

    14.565    -0.72501    0.015172    -3.9822    -174.38    0.80043    26.545    0.25296

More About

expand all

References

[1] Bates, D. S. "Jumps and Stochastic Volatility: Exchange Rate Processes Implicit in Deutsche Mark Options." The Review of Financial Studies. Vol. 9, Number 1, 1996.

Version History

Introduced in R2020a