Main Content

SABRBraceGatarekMusiela

Create SABRBraceGatarekMusiela model object for Cap, Floor, FixedBond, FloatBond, FloatBondOption, FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond instrument

Description

Create and price a Cap, Floor, FloatBond, FloatBondOption, FixedBond, FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond instrument object with a SABRBraceGatarekMusiela model using this workflow:

  1. Use fininstrument to create a Cap, Floor, FixedBond, FloatBond, FloatBondOption FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond instrument object.

  2. Use finmodel to specify a SABRBraceGatarekMusiela model object for the Cap, Floor, FixedBond, FloatBond, FloatBondOption, FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond instrument object.

  3. Use finpricer to specify an IRMonteCarlo pricing method for a Cap, Floor, FixedBond, FloatBond, FloatBondOption, FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond 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 Cap, Floor, FixedBond, FloatBond, FloatBondOption, FixedBondOption, OptionEmbeddedFixedBond, or OptionEmbeddedFloatBond instrument, see Choose Instruments, Models, and Pricers.

Creation

Description

example

SABRBraceGatarekMusielaModelObj = finmodel(ModelType,'Alpha',alpha_value,'Beta',beta_value,'VolatilityofVolatility',volatilityofvolatility_value,'FwdFwdCorrelation',fwdfwdcorrelation_value,'VolVolCorrelation',volvolcorrelation_value) creates a classic SABRBraceGatarekMusiela model object with null forward to volatility correlation by specifying ModelType and the required name-value pair arguments Alpha, Beta, VolatilityofVolatility, FwdFwdCorrelation, and VolVolCorrelation to set properties using name-value pair arguments. For example, SABRBraceGatarekMusielaModelObj = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'FwdFwdCorrelation',FwdFwdCorrelation, 'VolVolCorrelation',VolVolCorrelation) creates a classic SABRBraceGatarekMusiela model object with null forward to volatility correlation.

example

SABRBraceGatarekMusielaModelObj = finmodel(___,Name,Value) sets optional properties using additional name-value pairs in addition to the required arguments in the previous syntax. You can specify multiple name-value pair arguments. For example, you can use name-value pairs to create the following variations of the SABRBraceGatarekMusiela model:

  • To create a classic SABRBraceGatarekMusiela model object, use the FwdVolCorrelation name-value pair argument: SABRBraceGatarekMusielaModelObj = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'FwdFwdCorrelation',FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation,'FwdVolCorrelation',FwdVolCorrelation)

  • To create a classic SABRBraceGatarekMusiela model object in Rebonato parametric form with null forward-to-volatility correlation, use the Volatility name-value pair argument: SABRBraceGatarekMusielaModelObj = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'Volatility',VolFunc,'FwdFwdCorrelation', FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation)

  • To create a classic SABRBraceGatarekMusiela model object in Rebonato parametric form with FwdVolCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.02), use the Volatility and FwdVolCorrelation name-value pair arguments: SABRBraceGatarekMusielaModelObj = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'Volatility',VolFunc,'FwdFwdCorrelation', FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation) .

Input Arguments

expand all

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

Data Types: char | string

SABRBraceGatarekMusiela Name-Value Pair Arguments

Specify required and optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: SABRBraceGatarekMusielaModelObj = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'FwdFwdCorrelation',FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation)

Initial SABR volatilities for each forward rate maturity, specified as the comma-separated pair consisting of 'Alpha' and an (NumRates-1)-by-1 vector of positive numeric values.

Data Types: double

SABR exponent parameters for each forward rate maturity, specified as the comma-separated pair consisting of 'Beta' and an (NumRates-1)-by-1 vector of numeric values between 0 and 1.

Data Types: double

Variation in volatility, specified as the comma-separated pair consisting of 'VolatilityofVolatility' and an (NumRates-1)-by-1 cell array of function handles. Each function handle must take time as an input and return a scalar volatility of volatility that must be positive numeric.

Data Types: double | cell

Correlation matrix for forward rates, specified as a comma-separated pair consisting of 'FwdFwdCorrelation' and a (NumRates-1)-by-(NumRates-1) correlation matrix.

Data Types: double

Correlation matrix for volatilities, specified as a comma-separated pair consisting of 'VolVolFwdCorrelation' and an (NumRates-1)-by-(NumRates-1) correlation matrix.

Data Types: double

Optional SABRBraceGatarekMusiela Name-Value Pair Arguments

expand all

Volatility, specified as the comma-separated pair consisting of 'Volatility' and an (NumRates-1)-by-1 cell array of function handles. Specify these optional volatility function handles to use the Rebonato (2009) parametric form, which simulates stochastic volatilities with deterministic volatility functions and stochastic correction terms. Each function handle must take time as an input and return a scalar volatility that must be positive numeric.

Data Types: double

Correlation matrix between forward rates and volatilities, specified as a comma-separated pair consisting of 'FwdVolCorrelation' and an (NumRates-1)-by-(NumRates-1) correlation matrix. The diagonal elements of the matrix are the SABR Rho parameters.

Data Types: double

Period of forward rates, specified as the comma-separated pair consisting of 'Period' and a scalar numeric. The default is 2, meaning forward rates are spaced at 0, .5, 1, 1.5, and so on.

Data Types: double

Properties

expand all

Initial SABR volatilities for each forward rate maturity, returned as an NumRates-1-by-1 vector of positive numeric values.

Data Types: double

SABR exponent parameters for each forward rate maturity, returned as an NumRates-1-by-1 vector of numeric values between 0 and 1.

Data Types: double

Variation in volatility, returned as an NumRates-1-by-1 cell array of function handles.

Data Types: double | cell

Correlation matrix for forward rates, returned as an (NumRates-1)-by-(NumRates-1) correlation matrix.

Data Types: double

Correlation matrix for volatilities, returned as an (NumRates-1)-by-(NumRates-1) correlation matrix.

Data Types: double

Volatility, returned as an NumRates-1-by-1 cell array of function handles.

Data Types: double

Correlation matrix between forward rates and volatilities, returned as an (NumRates-1)-by-(NumRates-1) correlation matrix.

Data Types: double

Period of forward rates, returned as a scalar numeric.

Data Types: double

Examples

collapse all

This example shows the workflow to price a Cap instrument when you use a SABRBraceGatarekMusiela model with null Forward-Volatility correlation and an IRMonteCarlo pricing method.

Create Cap Instrument Object

Use fininstrument to create a Cap instrument object.

CapOpt = fininstrument("Cap",'Maturity',datetime(2021,7,1),'Strike',0.035,'Name',"cap_option")
CapOpt = 
  Cap with properties:

                      Strike: 0.0350
                    Maturity: 01-Jul-2021
                 ResetOffset: 0
                       Reset: 1
                       Basis: 0
                   Principal: 100
             ProjectionCurve: [0x0 ratecurve]
    DaycountAdjustedCashFlow: 0
       BusinessDayConvention: "actual"
                    Holidays: NaT
                        Name: "cap_option"

Create Classic SABRBraceGatarekMusiela Model Object with Null Forward-Volatility Correlation

Use finmodel to create a SABRBraceGatarekMusiela model object that is a classic SABR-BGM model with null Forward-Volatility correlation.

Alpha = [0.4;0.34;0.31;0.28];
Beta = [0.5;0.5;0.5;0.5];

SABRBGMVolVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolVolParams = [.3 -.02 .7 .14];

numRates = 5;
VolVolFunc(1:numRates-1,1) = {@(t) SABRBGMVolVolFunc(SABRBGMVolVolParams,t)};

CorrFunc = @(i,j,B) exp(-B*abs(i-j));
FwdFwdCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.08);
VolVolCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.04);

SABRBGM_NF = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'FwdFwdCorrelation',FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation)
SABRBGM_NF = 
  SABRBraceGatarekMusiela with properties:

                    Period: 2
                     Alpha: [4x1 double]
                      Beta: [4x1 double]
                Volatility: {4x1 cell}
    VolatilityofVolatility: {4x1 cell}
         FwdFwdCorrelation: [4x4 double]
         VolVolCorrelation: [4x4 double]
         FwdVolCorrelation: [4x4 double]

Create ratecurve Object

Create a ratecurve object using ratecurve.

Settle = datetime(2019,1,1);
Type = 'zero';
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
 
myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 0
                Dates: [10x1 datetime]
                Rates: [10x1 double]
               Settle: 01-Jan-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create IRMonteCarlo Pricer Object

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

simDates = datetime(2019,7,1)+calmonths(0:6:24);
outPricer = finpricer("IRMonteCarlo",'Model',SABRBGM_NF,'DiscountCurve',myRC,'SimulationDates',simDates)
outPricer = 
  SABRBGMMonteCarlo with properties:

          NumTrials: 1000
      RandomNumbers: []
      DiscountCurve: [1x1 ratecurve]
    SimulationDates: [01-Jul-2019    01-Jan-2020    01-Jul-2020    ...    ]
              Model: [1x1 finmodel.SABRBraceGatarekMusiela]

Price Cap Instrument

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

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

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

outPR.Results
ans=1×3 table
    Price      Delta       Gamma   
    ______    _______    __________

    3.4214    -722.09    5.2843e+05

You can access the simulated interest-rate Paths in the PricerData output.

outPR.PricerData
ans = struct with fields:
    SimulationTimes: [6x1 timetable]
              Paths: [6x8x1000 double]
      RandomNumbers: [1x1 struct]

This example shows the workflow to price a Floor instrument when you use a classic SABRBraceGatarekMusiela model and an IRMonteCarlo pricing method.

Create Floor Instrument Object

Use fininstrument to create a Floor instrument object.

FloorOpt = fininstrument("Floor","Maturity",datetime(2021,7,1),'Strike',0.05,'Reset',1,'Name',"floor_option")
FloorOpt = 
  Floor with properties:

                      Strike: 0.0500
                    Maturity: 01-Jul-2021
                 ResetOffset: 0
                       Reset: 1
                       Basis: 0
                   Principal: 100
             ProjectionCurve: [0x0 ratecurve]
    DaycountAdjustedCashFlow: 0
       BusinessDayConvention: "actual"
                    Holidays: NaT
                        Name: "floor_option"

Create Classic SABRBraceGatarekMusiela Model Object

Use finmodel to create a classic SABRBraceGatarekMusiela model object.

Alpha = [0.4;0.34;0.31;0.28];
Beta = [0.5;0.5;0.5;0.5];

SABRBGMVolVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolVolParams = [.3 -.02 .7 .14];

numRates = 5;
VolVolFunc(1:numRates-1,1) = {@(t) SABRBGMVolVolFunc(SABRBGMVolVolParams,t)};

CorrFunc = @(i,j,B) exp(-B*abs(i-j));
FwdFwdCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.08);
VolVolCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.04);
SABRRho = [0.0005;0.0006;0.0060;0.0055];
FwdVolCorrelation = diag(SABRRho);

SABRBGM_Classic = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'FwdFwdCorrelation',FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation,'FwdVolCorrelation',FwdVolCorrelation)
SABRBGM_Classic = 
  SABRBraceGatarekMusiela with properties:

                    Period: 2
                     Alpha: [4x1 double]
                      Beta: [4x1 double]
                Volatility: {4x1 cell}
    VolatilityofVolatility: {4x1 cell}
         FwdFwdCorrelation: [4x4 double]
         VolVolCorrelation: [4x4 double]
         FwdVolCorrelation: [4x4 double]

Create ratecurve Object

Create a ratecurve object using ratecurve.

Settle = datetime(2019,1,1);
Type = 'zero';
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
 
myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 0
                Dates: [10x1 datetime]
                Rates: [10x1 double]
               Settle: 01-Jan-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create IRMonteCarlo Pricer Object

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

simDates = datetime(2019,7,1)+calmonths(0:6:24);
outPricer = finpricer("IRMonteCarlo",'Model',SABRBGM_Classic,'DiscountCurve',myRC,'SimulationDates',simDates)
outPricer = 
  SABRBGMMonteCarlo with properties:

          NumTrials: 1000
      RandomNumbers: []
      DiscountCurve: [1x1 ratecurve]
    SimulationDates: [01-Jul-2019    01-Jan-2020    01-Jul-2020    ...    ]
              Model: [1x1 finmodel.SABRBraceGatarekMusiela]

Price Floor Instrument

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

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

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

outPR.Results
ans=1×3 table
    Price      Delta     Gamma
    ______    _______    _____

    11.524    -180.89    4299 

You can access the simulated interest-rate Paths in the PricerData output.

outPR.PricerData
ans = struct with fields:
    SimulationTimes: [6x1 timetable]
              Paths: [6x8x1000 double]
      RandomNumbers: [1x1 struct]

This example shows the workflow to price a FixedBond instrument when you use a SABRBraceGatarekMusiela model in Rebonato parametric form with null Forward-Volatility correlation and an IRMonteCarlo pricing method.

Create FixedBond Instrument Object

Use fininstrument to create a FixedBond instrument object.

FixB = fininstrument("FixedBond",'Maturity',datetime(2021,7,1),'CouponRate',0.021,'Period',2,'Basis',1,'Principal',100,'Name',"fixed_bond_instrument")
FixB = 
  FixedBond with properties:

                  CouponRate: 0.0210
                      Period: 2
                       Basis: 1
                EndMonthRule: 1
                   Principal: 100
    DaycountAdjustedCashFlow: 0
       BusinessDayConvention: "actual"
                    Holidays: NaT
                   IssueDate: NaT
             FirstCouponDate: NaT
              LastCouponDate: NaT
                   StartDate: NaT
                    Maturity: 01-Jul-2021
                        Name: "fixed_bond_instrument"

Create Rebonato Form with Null Forward-Volatility Correlation SABRBraceGatarekMusiela Model Object

Use finmodel to create a SABRBraceGatarekMusiela model object that is a SABR-BGM model in Rebonato parametric form with null Forward-Volatility correlation.

Alpha = [0.4;0.34;0.31;0.28];
Beta = [0.5;0.5;0.5;0.5];
numRates = 5;

SABRBGMVolVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolVolParams = [.3 -.02 .7 .14];

SABRBGMVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolParams = [.2 -.01 .8 .16];
VolFunc(1:numRates-1,1) = {@(t) SABRBGMVolFunc(SABRBGMVolParams,t)};

VolVolFunc(1:numRates-1,1) = {@(t) SABRBGMVolVolFunc(SABRBGMVolVolParams,t)};

CorrFunc = @(i,j,B) exp(-B*abs(i-j));
FwdFwdCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.08);
VolVolCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.04);

SABRBGM_Rebonato = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'Volatility', VolFunc,'FwdFwdCorrelation', FwdFwdCorrelation, 'VolVolCorrelation', VolVolCorrelation)
SABRBGM_Rebonato = 
  SABRBraceGatarekMusiela with properties:

                    Period: 2
                     Alpha: [4x1 double]
                      Beta: [4x1 double]
                Volatility: {4x1 cell}
    VolatilityofVolatility: {4x1 cell}
         FwdFwdCorrelation: [4x4 double]
         VolVolCorrelation: [4x4 double]
         FwdVolCorrelation: [4x4 double]

Create ratecurve Object

Create a ratecurve object using ratecurve.

Settle = datetime(2019,1,1);
Type = 'zero';
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
 
myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 0
                Dates: [10x1 datetime]
                Rates: [10x1 double]
               Settle: 01-Jan-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create IRMonteCarlo Pricer Object

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

simDates = datetime(2019,7,1)+calmonths(0:6:24);
outPricer = finpricer("IRMonteCarlo",'Model',SABRBGM_Rebonato,'DiscountCurve',myRC,'SimulationDates',simDates)
outPricer = 
  SABRBGMMonteCarlo with properties:

          NumTrials: 1000
      RandomNumbers: []
      DiscountCurve: [1x1 ratecurve]
    SimulationDates: [01-Jul-2019    01-Jan-2020    01-Jul-2020    ...    ]
              Model: [1x1 finmodel.SABRBraceGatarekMusiela]

Price FixedBond Instrument

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

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

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

outPR.Results
ans=1×3 table
    Price     Delta     Gamma
    ______    ______    _____

    103.54    -253.5    628.2

You can access the simulated interest-rate Paths in the PricerData output.

outPR.PricerData
ans = struct with fields:
    SimulationTimes: [6x1 timetable]
              Paths: [6x8x1000 double]
      RandomNumbers: [1x1 struct]

This example shows the workflow to price a FloatBond instrument when you use a SABRBraceGatarekMusiela model in Rebonato parametric form and an IRMonteCarlo pricing method.

Create FloatBond Instrument Object

Use fininstrument to create a FloatBond instrument object.

FloatB = fininstrument("FloatBond",'Maturity',datetime(2021,7,1),'Spread',0.025,'Reset',2,'Basis',1,'Principal',100,'EndMonthRule',false,'Name',"float_bond_instrument")
FloatB = 
  FloatBond with properties:

                      Spread: 0.0250
             ProjectionCurve: [0x0 ratecurve]
                 ResetOffset: 0
                       Reset: 2
                       Basis: 1
                EndMonthRule: 0
                   Principal: 100
    DaycountAdjustedCashFlow: 0
       BusinessDayConvention: "actual"
          LatestFloatingRate: NaN
                    Holidays: NaT
                   IssueDate: NaT
             FirstCouponDate: NaT
              LastCouponDate: NaT
                   StartDate: NaT
                    Maturity: 01-Jul-2021
                        Name: "float_bond_instrument"

Create Rebonato Form SABRBraceGatarekMusiela Model Object

Use finmodel to create a SABRBraceGatarekMusiela model object that is a SABR-BGM model in Rebonato parametric form.

Alpha = [0.4;0.34;0.31;0.28];
Beta = [0.5;0.5;0.5;0.5];
numRates = 5;

SABRBGMVolVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolVolParams = [.3 -.02 .7 .14];

SABRBGMVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4);
SABRBGMVolParams = [.2 -.01 .8 .16];
VolFunc(1:numRates-1,1) = {@(t) SABRBGMVolFunc(SABRBGMVolParams,t)};

VolVolFunc(1:numRates-1,1) = {@(t) SABRBGMVolVolFunc(SABRBGMVolVolParams,t)};

CorrFunc = @(i,j,B) exp(-B*abs(i-j));
FwdFwdCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.08);
VolVolCorrelation = CorrFunc(meshgrid(1:numRates-1)',meshgrid(1:numRates-1),.04);
SABRRho = [0.0005;0.0006;0.0060;0.0055];
FwdVolCorrelation = diag(SABRRho);

SABRBGM_Rebonato_param = finmodel("SABRBraceGatarekMusiela",'Alpha',Alpha,'Beta',Beta,'VolatilityofVolatility',VolVolFunc,'Volatility',VolFunc,'FwdFwdCorrelation',FwdFwdCorrelation,'VolVolCorrelation',VolVolCorrelation,'FwdVolCorrelation',FwdVolCorrelation)
SABRBGM_Rebonato_param = 
  SABRBraceGatarekMusiela with properties:

                    Period: 2
                     Alpha: [4x1 double]
                      Beta: [4x1 double]
                Volatility: {4x1 cell}
    VolatilityofVolatility: {4x1 cell}
         FwdFwdCorrelation: [4x4 double]
         VolVolCorrelation: [4x4 double]
         FwdVolCorrelation: [4x4 double]

Create ratecurve Object

Create a ratecurve object using ratecurve.

Settle = datetime(2019,1,1);
Type = 'zero';
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
 
myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 0
                Dates: [10x1 datetime]
                Rates: [10x1 double]
               Settle: 01-Jan-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Create IRMonteCarlo Pricer Object

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

simDates = datetime(2019,7,1)+calmonths(0:6:24);
outPricer = finpricer("IRMonteCarlo",'Model',SABRBGM_Rebonato_param,'DiscountCurve',myRC,'SimulationDates',simDates)
outPricer = 
  SABRBGMMonteCarlo with properties:

          NumTrials: 1000
      RandomNumbers: []
      DiscountCurve: [1x1 ratecurve]
    SimulationDates: [01-Jul-2019    01-Jan-2020    01-Jul-2020    ...    ]
              Model: [1x1 finmodel.SABRBraceGatarekMusiela]

Price FloatBond Instrument

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

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

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

outPR.Results
ans=1×3 table
    Price      Delta     Gamma 
    ______    _______    ______

    106.18    -9.2496    16.927

You can access the simulated interest-rate Paths in the PricerData output.

outPR.PricerData
ans = struct with fields:
    SimulationTimes: [6x1 timetable]
              Paths: [6x8x1000 double]
      RandomNumbers: [1x1 struct]

More About

expand all

References

[1] Brigo, D. and F. Mercurio. Interest Rate Models - Theory and Practice. Springer Finance, 2006.

[2] Crispoldi, C., Wigger, G., and P. Larkin. SABR and SABR LIBOR Market Models in Practice. Palgrave MacMillan, 2015.

[3] Hagan, P. and A. Lesniewski. LIBOR market Model with SABR Style Volatility. Working paper JPMorgan Chase, 2008.

[4] Rebonato, R., McKay, K., and R. White. The SABR/LIBOR Market Model: pricing, Calibration, and Hedging for Complex Interest-Rate Derivatives. Wiley, 2009.

Introduced in R2021b