Main Content

RoughBergomi

Create RoughBergomi model object for Vanilla, Asian, Cliquet, or Binary instrument

Since R2024a

Description

Create and price a Vanilla, Asian, Cliquet, or Binary instrument object with a RoughBergomi model using this workflow:

  1. Use fininstrument to create a Vanilla, Asian, Binary, or Cliquet instrument object.

  2. Use finmodel to specify a RoughBergomi model object for the Vanilla, Asian, Cliquet, or Binary instrument object.

  3. Use finpricer to specify a RoughVolMonteCarlo pricing method for the Vanilla, Asian, 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, Cliquet, or Binary instrument, see Choose Instruments, Models, and Pricers.

Creation

Description

RoughBergomiModelObj = finmodel(ModelType,Alpha=alpha_value,Xi=xi_value,Eta=eta_value,RhoSV=rhosv_value) creates a RoughBergomi model object by specifying ModelType and the required name-value arguments Alpha, Xi, Eta, and RhoSV to set properties. For example, RoughBergomiModelObj = finmodel("RoughBergomi",Alpha=0.032,Xi=0.1,Eta=0.003,RhoSV=0.9) creates a RoughBergomi model object.

example

Input Arguments

expand all

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

Data Types: string | char

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.

Example: RoughBergomiModelObj = finmodel("RoughBergomi",Alpha=0.032,Xi=0.1,Eta=0.003,RhoSV=0.9)

Kernel function parameter in a Volterra process representing the roughness index, specified as a nonpositive numeric scalar.

The value of Alpha must be in the range (-0.5 to 0). The Volterra process behaves locally like a fractional Brownian motion (fBm) with the Hurst index H = Alpha + 0.5. A Hurst index value of 0.5 indicates a random walk or no autocorrelation.

Data Types: double

Forward variance curve, specified as a numeric scalar > 0.

Data Types: double

Volterra fBm parameter, specified as numeric scalar > 0.

Unlike the standard Brownian motion used in traditional models, the fractional Brownian motion (fBm) allows for long memory and roughness in the volatility dynamics. This roughness captures the empirical observation that volatility tends to exhibit slow decay and high-frequency irregularities.

Data Types: double

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

Data Types: double

Properties

expand all

Kernel function parameter in Volterra process representing the roughness index, returned as a numeric scalar.

Data Types: double

Forward variance curve, returned as a numeric scalar ≥ 0.

Data Types: double

Volterra fBm parameter, returned as a numeric scalar > 0.

Data Types: double

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

Data Types: double

Examples

collapse all

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

Create Vanilla Instrument Object

Use fininstrument to create a Vanilla instrument object.

VanillaOpt = fininstrument("Vanilla",ExerciseDate=datetime(2019,1,30),Strike=105,ExerciseStyle="european",Name="vanilla_option")
VanillaOpt = 
  Vanilla with properties:

       OptionType: "call"
    ExerciseStyle: "european"
     ExerciseDate: 30-Jan-2019
           Strike: 105
             Name: "vanilla_option"

Create RoughBergomi Model Object

Use finmodel to create a RoughBergomi model object.

RoughBergomiModel = finmodel("RoughBergomi",Alpha=-0.032,Xi=0.1,Eta=0.003,RhoSV=0.9)
RoughBergomiModel = 
  RoughBergomi with properties:

    Alpha: -0.0320
       Xi: 0.1000
      Eta: 0.0030
    RhoSV: 0.9000

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 RoughVolMonteCarlo Pricer Object

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

outPricer = finpricer("RoughVolMonteCarlo",DiscountCurve=myRC,Model=RoughBergomiModel,SpotPrice=100,SimulationDates=datetime(2019,1,30))
outPricer = 
  RoughBergomiMonteCarlo with properties:

           DiscountCurve: [1x1 ratecurve]
               SpotPrice: 100
         SimulationDates: 30-Jan-2019
               NumTrials: 1000
           RandomNumbers: []
                   Model: [1x1 finmodel.RoughBergomi]
            DividendType: "continuous"
           DividendValue: 0
        MonteCarloMethod: "standard"
    BrownianMotionMethod: "standard"

Price Vanilla Instrument

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

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

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

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

    7.7862    0.50369    0.012632    6.469     15.947    1.0273    30.741

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

Create Asian Instrument Object

Use fininstrument to create an Asian instrument object.

AsianOpt = fininstrument("Asian",ExerciseDate=datetime(2019,1,30),Strike=1000,OptionType="put",Name="asian_option")
AsianOpt = 
  Asian with properties:

          OptionType: "put"
              Strike: 1000
         AverageType: "arithmetic"
        AveragePrice: 0
    AverageStartDate: NaT
       ExerciseStyle: "european"
        ExerciseDate: 30-Jan-2019
                Name: "asian_option"

Create RoughBergomi Model Object

Use finmodel to create a RoughBergomi model object.

RoughBergomiModel = finmodel("RoughBergomi",Alpha=-0.32,Xi=0.1,Eta=0.003,RhoSV=0.9)
RoughBergomiModel = 
  RoughBergomi with properties:

    Alpha: -0.3200
       Xi: 0.1000
      Eta: 0.0030
    RhoSV: 0.9000

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 RoughVolMonteCarlo Pricer Object

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

outPricer = finpricer("RoughVolMonteCarlo",DiscountCurve=myRC,Model=RoughBergomiModel,SpotPrice=900,simulationDates=datetime(2019,1,30))
outPricer = 
  RoughBergomiMonteCarlo with properties:

           DiscountCurve: [1x1 ratecurve]
               SpotPrice: 900
         SimulationDates: 30-Jan-2019
               NumTrials: 1000
           RandomNumbers: []
                   Model: [1x1 finmodel.RoughBergomi]
            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 = 
103.0639
outPR = 
  priceresult with properties:

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

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

    103.06    -0.77793    0.0024128    -6.7932    -166.05    -1.4838    88.272

Algorithms

The rough Bergomi model is a type of stochastic volatility model, which means it assumes that the volatility of the underlying asset is not constant but varies over time and is not necessarily correlated with the asset price.

dX1t=B(t)X1tdt+X2tX1tdW1tX2t=ξ0(t)eη2a+1Ytαη22t2α+1Yt=0t(ts)αdWs

The first and second equations represent a geometric Brownian motion (GBM) model with a stochastic volatility function.

The third equation represents the process describing the evolution of the variance rate of the coupled GBM process, where Yt is a Volterra process. In a Volterra process, the increments are dependent not only on the current state of the process but also on the entire history of the process. This dependency means that the current state of the process is determined by integrating a function over the entire past trajectory of the process, as opposed to just the most recent state.

References

[1] Bayer, C., P. Friz, and J. Gatheral, J. “Pricing Under Rough Volatility.” Quantitative Finance. Vol. 16, No. 6 , 2016, pp. 887–904.

Version History

Introduced in R2024a