Main Content

RoughHeston

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

Since R2024b

Description

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

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

  2. Use finmodel to specify a RoughHeston 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

RoughHestonModelObj = finmodel(ModelType,V0=V0_value,ThetaV=thetaV_value,Kappa=kappa_value,SigmaV=sigmaV_value,Alpha=alpha_value,RhoSV=rhosv_value) creates a RoughHeston model object by specifying ModelType and the required name-value arguments V0, ThetaV, Kappa, SigmaV, Alpha, and RhoSV to set properties. For example, RoughHestonModelObj = finmodel("RoughHeston",V0=0.4,ThetaV=0.3,Kappa=0.2,SigmaV=0.1,Alpha=-0.02,RhoSV=0.3) creates a RoughHeston model object.

example

Input Arguments

expand all

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

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: RoughHestonModelObj = finmodel("RoughHeston",V0=0.4,ThetaV=0.3,Kappa=0.2,SigmaV=0.1,Alpha=-0.02,RhoSV=0.3)

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

Initial variance of the underlying asset, specified as a scalar numeric value > 0.

Data Types: double

Long-term variance of the underlying asset, specified as a scalar numeric value > 0.

Data Types: double

Mean revision speed for the variance of the underlying asset, specified as a scalar numeric value > 0.

Data Types: double

Volatility of the variance of the underlying asset, specified as a scalar numeric value > 0.

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

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 variance of 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

Examples

collapse all

This example shows the workflow to price a Vanilla instrument when you use a RoughHeston 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 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=100,SimulationDates=datetime(2019,1,30))
outPricer = 
  RoughHestonMonteCarlo with properties:

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

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

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

    13.939    0.54193    0.011253    3.8878    15.143    -22.098    24.539      0   

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   

Algorithms

The rough Heston 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.

dXt=B(t)Xtdt+YtXtdWtYt=Y0+1Γ(α+1)0t(ts)ακ(θYs)ds+1Γ(α+1)0t(ts)ασYsdWs

where ɑ = – ½ and H is the Hurst exponent.

The first equation is a geometric Brownian motion model with a stochastic volatility function. By adding the Volterra kernel, the Heston stochastic volatility model allows for a rough behavior of the volatility.

The Brownian semistationary process (Yt in the general rough volatility model) has W as a two-sided Brownian motion providing the fundamental noise innovations where the amplitude is modulated by a stochastic volatility process that depends on W. This driving noise is then convolved with a deterministic kernel function g that specifies the dependence structure of Yt. The process Yt is also viewed as a moving average of volatility modulated Brownian noise and when setting the volatility of volatility = 1, the stationary Brownian moving averages are nested in this class of processes.

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 R2024b