Main Content

RoughVolMonteCarlo

Create RolVolMonteCarlo pricer object for equity instruments using RoughBergoni or RoughHeston model

Since R2024a

Description

Create and price a Vanilla, Asian, Cliquet, or Binary instrument object with a RoughBergoni or RoughHeston model and a RoughVolMonteCarlo pricing method using this workflow:

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

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

  3. Use finpricer to specify a RoughVolMonteCarlo pricer object 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 instruments, models, and pricing methods for Vanilla, Asian, Cliquet, or Binary instruments, see Choose Instruments, Models, and Pricers.

Creation

Description

RoughVolMonteCarloPricerObj = finpricer(PricerType,DiscountCurve=discountcurve_value,Model=model_value,SpotPrice=spotprice_value,SimulationDates=simulation_dates) creates a RoughVolMonteCarlo pricer object by specifying PricerType and sets the properties using the required name-value arguments DiscountCurve, Model, SpotPrice, and SimulationDates.

example

RoughVolMonteCarloPricerObj = finpricer(___,Name=Value) sets properties using name-value arguments in addition to the required arguments in the previous syntax. For example, RoughVolMonteCarloPricerObj = finpricer("roughvolmontecarlo",DiscountCurve=ratecurve_obj,Model=roughbergomi_model,SpotPrice=1000,SimulationDates=[datetime(2018,1,30); datetime(2019,1,30)],NumTrials=500,DividendType='continuous',DividendValue=0.3) creates a RoughVolMonteCarlo pricer object using a RoughBergomi model. You can specify multiple name-value arguments.

You can perform quasi-Monte Carlo simulations using the name-value arguments for MonteCarloMethod and BrownianMotionMethod. For more information, see Quasi-Monte Carlo Simulation.

example

Input Arguments

expand all

Pricer type, specified as a string with the value "RoughVolMonteCarlo" or a character vector with the value 'RoughVolMonteCarlo'.

Data Types: string | char

Name-Value Arguments

Specify required and optional 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: RoughVolMonteCarloPricerObj = finpricer("roughvolmontecarlo",DiscountCurve=ratecurve_obj,Model=roughbergomi_model,SpotPrice=1000,SimulationDates=[datetime(2018,1,30); datetime(2019,1,30)],NumTrials=500,DividendType='continuous',DividendValue=0.3)

Required RoughVolMonteCarlo Name-Value Arguments

expand all

ratecurve object for discounting cash flows, specified as the name of a previously created ratecurve object.

Note

Specify a flat ratecurve object for DiscountCurve. If you use a nonflat ratecurve object, the software uses the rate in the ratecurve object at Maturity and assumes that the value is constant for the life of the equity option.

Data Types: object

Model, specified as the name of a previously created RoughBergomi or RoughHeston model object. Create the model object using finmodel.

Data Types: object

Spot price of the underlying asset, specified as a scalar positive real numeric.

Data Types: double

Simulation dates, specified as a scalar or a vector using a datetime array, string array, or date character vectors.

Data Types: datetime | string | char

Optional RoughVolMonteCarlo Name-Value Arguments

expand all

Number of simulation trials, specified as a scalar number of independent sample paths (simulation trials).

Data Types: double

Dependent random variates to generate Brownian motion vector (Wiener processes), specified as an NSimulationDates-by-NBrownians-by-NTrials 3D time series array. The 3D time series array has the following fields:

  • ZNSimulationDates-by-NBrownians-by-NTrials 3D time series array of dependent random variates used to generate the Brownian motion vector (that is, Wiener processes) that drive the simulation.

  • NNSimulationDates-by-NBrownians-by-NTrials 3D time series array of dependent random variates used as the number of jumps.

  • SizeJNSimulationDates-by-NBrownians-by-NTrials 3D time series array of dependent random variates used as the jump sizes.

Data Types: struct

Dividend type, specified as a character vector or string. DividendType must be either "cash" for actual dollar dividends or "continuous" for a continuous dividend yield.

Data Types: char | string

Dividend yield for the underlying stock, specified as a scalar numeric for a dividend yield or a timetable for a dividend schedule.

Note

Specify a scalar if DividendType is "continuous" and a timetable if DividendType is "cash".

Data Types: double | timetable

Monte Carlo method to simulate stochastic processes, specified as a string or character vector with one of the following values:

  • "standard" — Monte Carlo using pseudo random numbers.

  • "quasi" — Quasi-Monte Carlo using low-discrepancy sequences.

  • "randomized-quasi" — Randomized quasi-Monte Carlo.

For more information on quasi Monte Carlo simulations, see Quasi-Monte Carlo Simulation and for an example using the 'MonteCarloMethod' name-value argument, see Use AssetMonteCarlo Pricer with Quasi-Monte Carlo Simulation and Heston Model to Price Asian Instrument.

Data Types: string | char

Brownian motion construction method, specified as a string or character vector with one of the following values:

  • "standard" — The Brownian motion path is found by taking the cumulative sum of the Gaussian variates.

  • "brownian-bridge" — The last step of the Brownian motion path is calculated first, followed by any order between steps until all steps have been determined.

  • "principal-components" — The Brownian motion path is calculated by minimizing the approximation error.

The starting point for a Monte Carlo simulation is the construction of a Brownian motion sample path (or Wiener path). Such paths are built from a set of independent Gaussian variates, using either standard discretization, Brownian-bridge construction, or principal components construction.

Both standard discretization and Brownian-bridge construction share the same variance, and therefore, the same resulting convergence when used with the MonteCarloMethod using pseudo random numbers. However, the performance differs between the two when the MonteCarloMethod option "quasi" is introduced, with faster convergence seen for "brownian-bridge" construction option and the fastest convergence when using the "principal-components" construction option.

For more information on quasi Monte Carlo simulations, see Quasi-Monte Carlo Simulation. For an example using the 'BrownianMotionMethod' name-value argument, see Use AssetMonteCarlo Pricer with Quasi-Monte Carlo Simulation and Heston Model to Price Asian Instrument.

Data Types: string | char

Properties

expand all

This property is read-only.

ratecurve object for discounting cash flows, returned as a ratecurve object.

Data Types: object

Model, returned as an object.

Data Types: object

Spot price of the underlying asset, returned as a scalar positive numeric.

Data Types: double

Simulation dates, returned as a datetime array.

Data Types: datetime

Number of simulation trials, returned as a scalar number of independent sample paths.

Data Types: double

Dependent random variates to generate Brownian motion vector, returned as an NSimulationDates-by-NBrownians-by-NTrials 3D time series array.

Data Types: struct

This property is read-only.

Dividend type, returned as a string. DividendType is either "cash" for actual dollar dividends or "continuous" for a continuous dividend yield.

Data Types: string

Dividend yield or dividend schedule for the underlying asset, returned as a scalar numeric for a dividend yield or a timetable for a dividend schedule.

Data Types: double | timetable

Monte Carlo method to simulate stochastic processes, returned as a string or character vector.

Data Types: string | char

Brownian motion construction method, returned as a string or character vector.

Data Types: string | char

Object Functions

priceCompute price for equity instrument with RoughVolMonteCarlo pricer

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

Since R2024b

This example shows the workflow to price a fixed-strike Asian instrument when you use a RoughHeston 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 RoughHeston Model Object

Use finmodel to create a RoughHeston model object.

RoughHestonModel = finmodel("RoughHeston",V0=0.4,ThetaV=0.3,Kappa=0.2,SigmaV=0.1,Alpha=-0.02,RhoSV=0.3)
RoughHestonModel = 
  RoughHeston with properties:

     Alpha: -0.0200
        V0: 0.4000
    ThetaV: 0.3000
     Kappa: 0.2000
    SigmaV: 0.1000
     RhoSV: 0.3000

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=RoughHestonModel,SpotPrice=900,simulationDates=datetime(2019,1,30))
outPricer = 
  RoughHestonMonteCarlo with properties:

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

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

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

    131.22    -0.67246    0.00155    -4.6122    -152.4    -74.841    105.65      0   

More About

expand all

Version History

Introduced in R2024a

expand all