Main Content

Barrier

Barrier instrument object

Description

Create and price a Barrier instrument object for one or more Barrier instruments using this workflow:

  1. Use fininstrument to create a Barrier instrument object for one or more Barrier instruments.

  2. Use finmodel to specify a BlackScholes, Heston, Bates, or Merton model for the Barrier instrument object.

  3. Choose a pricing method.

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 models and pricing methods for a Barrier instrument, see Choose Instruments, Models, and Pricers.

Creation

Description

example

BarrierOpt = fininstrument(InstrumentType,'Strike',strike_value,'ExerciseDate',exercise_date,'BarrierValue',barrier_value) creates a Barrier instrument object for one or more Barrier instruments by specifying InstrumentType and sets the properties for the required name-value pair arguments Strike, ExerciseDate, and BarrierValue.

example

BarrierOpt = fininstrument(___,Name,Value) sets optional properties using additional name-value pairs in addition to the required arguments in the previous syntax. For example, BarrierOpt = fininstrument("Barrier",'Strike',100,'ExerciseDate',datetime(2019,1,30),'BarrierValue',110,'OptionType',"put",'ExerciseStyle',"European",'BarrierType',"DO",'Name',"barrier_option") creates a Barrier put option with an European exercise. You can specify multiple name-value pair arguments.

Input Arguments

expand all

Instrument type, specified as a string with the value of "Barrier", a character vector with the value of 'Barrier', an NINST-by-1 string array with values "Barrier", or an NINST-by-1 cell array of character vectors with values of 'Barrier'.

Data Types: char | string | cell

Barrier 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: BarrierOpt = fininstrument("Barrier",'Strike',100,'ExerciseDate',datetime(2019,1,30),'BarrierValue',110,'OptionType',"put",'ExerciseStyle',"European",'BarrierType',"DO",'Name',"barrier_option")
Required Barrier Name-Value Pair Arguments

expand all

Option strike value, specified as the comma-separated pair consisting of 'Strike' and a scalar nonnegative value or an NINST-by-1 vector of nonnegative values.

Data Types: double

Option exercise date, specified as the comma-separated pair consisting of 'ExerciseDate' and a scalar datetime, serial date number, date character vector, date string or an NINST-by-1 vector of datetimes, serial date numbers, cell array of date character vectors, or date string array.

Note

For a European option, there is only one ExerciseDate on the option expiry date.

If you use date character vectors or date strings, the format must be recognizable by datetime because the ExerciseDate property is stored as a datetime.

Data Types: double | char | cell | string | datetime

Barrier level, specified as the comma-separated pair consisting of 'BarrierLevel' and a scalar numeric or an NINST-by-1 numeric vector.

Data Types: double

Optional Barrier Name-Value Pair Arguments

expand all

Option type, specified as the comma-separated pair consisting of 'OptionType' and a scalar character vector or string or an NINST-by-1 cell array of character vectors or string array.

Data Types: char | cell | string

Option exercise style, specified as the comma-separated pair consisting of 'ExerciseStyle' and a scalar string or character vector or an NINST-by-1 cell array of character vectors or string array.

Note

For a Barrier option, the BlackScholes pricer supports only "European" exercise and the FiniteDifference pricer supports an "American" or "European" exercise.

Data Types: string | char | cell

Barrier option type, specified as the comma-separated pair consisting of 'BarrierType' and a scalar string or character vector or an NINST-by-1 cell array of character vectors or string array with one of the following values:

  • "UI" — Up knock-in

    This option becomes effective when the price of the underlying asset passes above the barrier level. If the underlying asset goes above the barrier level during the life of the option, the option holder has the right, but not the obligation, to buy or sell (call or put) the underlying security at the strike price.

  • "UO" — Up knock-out

    This option gives the option holder the right, but not the obligation, to buy or sell (call or put) the underlying security at the strike price as long as the underlying asset does not go above the barrier level during the life of the option. This option terminates when the price of the underlying security passes above the barrier level. If the spot price of the underlying asset reaches or exceeds the barrier level with an up-and-out option, the rebate is paid.

  • "DI" — Down knock-in

    This option becomes effective when the price of the underlying stock passes below the barrier level. If the underlying security goes below the barrier level during the life of the option, the option holder has the right, but not the obligation, to buy or sell (call or put) the underlying security at the strike price. With a down-and-in option, the rebate is paid if the spot price of the underlying does not reach the barrier level during the life of the option. Note that a Barrier instrument using the FiniteDifference pricer does not support American knock-in barrier options.

  • "DO" — Down knock-up

    This option gives the option holder the right, but not the obligation, to buy or sell (call or put) the underlying asset at the strike price as long as the underlying asset does not go below the barrier level during the life of the option. This option terminates when the price of the underlying security passes below the barrier level. If the option is worthless when it expires, the option holder receives a rebate amount.

OptionBarrier TypePayoff If Barrier CrossedPayoff If Barrier Not Crossed
Call or PutDown knock-outWorthlessStandard Call or Put
Call or PutDown knock-inCall or PutWorthless
Call or PutUp knock-outWorthlessStandard Call or Put
Call or PutUp knock-inStandard Call or PutWorthless

Data Types: char | cell | string

Rebate value, specified as the comma-separated pair consisting of 'Rebate' and a scalar numeric or an NINST-by-1 numeric vector.

  • For knock-in options, the Rebate is paid at expiry.

  • For knock-out options, the Rebate is paid when BarrierValue is reached.

Data Types: double

User-defined name for the instrument, specified as the comma-separated pair consisting of 'Name' and a scalar string or character vector or an NINST-by-1 cell array of character vectors or string array.

Data Types: char | cell | string

Properties

expand all

Option strike value, returned as a scalar nonnegative value or an NINST-by-1 vector of nonnegative values.

Data Types: double

Option exercise date, returned as a datetime or an NINST-by-1 vector of datetimes.

Data Types: datetime

Option type, returned as a scalar string or an NINST-by-1 string array with the values of "call" or "put".

Data Types: string

Option exercise style, returned as a scalar string or NINST-by-1 string array with the values of "European" or "American".

Data Types: string

Barrier option type, returned as a scalar string or NINST-by-1 string array with the values of "UI", "UO", "DI", or "DO".

Data Types: string

Barrier level, returned as a scalar numeric or an NINST-by-1 numeric vector.

Data Types: double

Rebate value, returned as a scalar numeric or an NINST-by-1 numeric vector.

Data Types: double

User-defined name for the instrument, returned as a string or an NINST-by-1 string array.

Data Types: string

Examples

collapse all

This example shows the workflow to price an Barrier instrument when you use a BlackScholes model and a FiniteDifference pricing method.

Create Barrier Instrument Object

Use fininstrument to create an Barrier instrument object.

BarrierOpt = fininstrument("Barrier",'Strike',45,'ExerciseDate',datetime(2019,1,1),'OptionType',"call",'ExerciseStyle',"american",'BarrierType',"DO",'BarrierValue',40,'Name',"barrier_option")
BarrierOpt = 
  Barrier with properties:

       OptionType: "call"
           Strike: 45
      BarrierType: "do"
     BarrierValue: 40
           Rebate: 0
    ExerciseStyle: "american"
     ExerciseDate: 01-Jan-2019
             Name: "barrier_option"

Create BlackScholes Model Object

Use finmodel to create a BlackScholes model object.

BlackScholesModel = finmodel("BlackScholes",'Volatility',0.30)
BlackScholesModel = 
  BlackScholes with properties:

     Volatility: 0.3000
    Correlation: 1

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

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

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

Create FiniteDifference Pricer Object

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

outPricer = finpricer("FiniteDifference",'Model',BlackScholesModel,'DiscountCurve',myRC,'SpotPrice',50)
outPricer = 
  FiniteDifference with properties:

     DiscountCurve: [1x1 ratecurve]
             Model: [1x1 finmodel.BlackScholes]
         SpotPrice: 50
    GridProperties: [1x1 struct]
      DividendType: "continuous"
     DividendValue: 0

Price Barrier Instrument

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

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

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

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

    8.5014    0.85673    0.0057199    5.0388    -1.8461    26.238    6.1837

This example shows the workflow to price multiple Barrier instruments when you use a BlackScholes model and a FiniteDifference pricing method.

Create Barrier Instrument Object

Use fininstrument to create an Barrier instrument object for three Barrier instruments.

BarrierOpt = fininstrument("Barrier",'Strike',45,'ExerciseDate',datetime([2019,1,1; 2019,2,1 ; 2019,3,1]),'OptionType',"call",'ExerciseStyle',"american",'BarrierType',"DO",'BarrierValue', [40; 30; 20],'Name',"barrier_option")
BarrierOpt=3×1 object
  3x1 Barrier array with properties:

    OptionType
    Strike
    BarrierType
    BarrierValue
    Rebate
    ExerciseStyle
    ExerciseDate
    Name

Create BlackScholes Model Object

Use finmodel to create a BlackScholes model object.

BlackScholesModel = finmodel("BlackScholes",'Volatility',0.30)
BlackScholesModel = 
  BlackScholes with properties:

     Volatility: 0.3000
    Correlation: 1

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

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

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

Create FiniteDifference Pricer Object

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

outPricer = finpricer("FiniteDifference",'Model',BlackScholesModel,'DiscountCurve',myRC,'SpotPrice',50)
outPricer = 
  FiniteDifference with properties:

     DiscountCurve: [1x1 ratecurve]
             Model: [1x1 finmodel.BlackScholes]
         SpotPrice: 50
    GridProperties: [1x1 struct]
      DividendType: "continuous"
     DividendValue: 0

Price Barrier Instruments

Use price to compute the prices and sensitivities for the Barrier instruments.

[Price, outPR] = price(outPricer,BarrierOpt,["all"])
Price = 3×1

    8.5014
    9.7112
    9.9901

outPR=3×1 object
  3x1 priceresult array with properties:

    Results
    PricerData

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

    8.5014    0.85673    0.0057199    5.0388    -1.8461    26.238    6.1837

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

    9.7112    0.73186    0.020793    3.7681    -3.2754    29.014    16.885

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

    9.9901    0.7296    0.020326    3.6516    -3.2151    30.872    17.803

This example shows the workflow to price an Barrier instrument when you use a BlackScholes model and an AssetTree pricing method.

Create Barrier Instrument Object

Use fininstrument to create an Barrier instrument object.

BarrierOpt = fininstrument("Barrier",'Strike',45,'ExerciseDate',datetime(2019,1,1),'OptionType',"call",'ExerciseStyle',"american",'BarrierType',"DO",'BarrierValue',40,'Name',"barrier_option")
BarrierOpt = 
  Barrier with properties:

       OptionType: "call"
           Strike: 45
      BarrierType: "do"
     BarrierValue: 40
           Rebate: 0
    ExerciseStyle: "american"
     ExerciseDate: 01-Jan-2019
             Name: "barrier_option"

Create BlackScholes Model Object

Use finmodel to create a BlackScholes model object.

BlackScholesModel = finmodel("BlackScholes",'Volatility',0.30)
BlackScholesModel = 
  BlackScholes with properties:

     Volatility: 0.3000
    Correlation: 1

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

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

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

Create AssetTree Pricer Object

Use finpricer to create an AssetTree pricer object with an EQP equity tree and use the ratecurve object for the 'DiscountCurve' name-value pair argument.

NumPeriods = 15;
EQPPricer = finpricer("AssetTree",'DiscountCurve',myRC,'Model',BlackScholesModel,'SpotPrice',1000,'PricingMethod',"EqualProbability",'Maturity',datetime(2019,1,1),'NumPeriods',NumPeriods)
EQPPricer = 
  EQPTree with properties:

             Tree: [1x1 struct]
       NumPeriods: 15
            Model: [1x1 finmodel.BlackScholes]
    DiscountCurve: [1x1 ratecurve]
        SpotPrice: 1000
     DividendType: "continuous"
    DividendValue: 0
        TreeDates: [25-Jan-2018 08:00:00    18-Feb-2018 16:00:00    ...    ]

EQPPricer.Tree
ans = struct with fields:
    Probs: [2x15 double]
    ATree: {1x16 cell}
     dObs: [01-Jan-2018 00:00:00    25-Jan-2018 08:00:00    ...    ]
     tObs: [0 0.0667 0.1333 0.2000 0.2667 0.3333 0.4000 0.4667 0.5333 ... ]

Price Barrier Instrument

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

[Price, outPR] = price(EQPPricer,BarrierOpt,["all"])
Price = 956.5478
outPR = 
  priceresult with properties:

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

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

    956.55      1      9.3133e-18    -6.8212e-09    1.0454    43.45    -1.5208

outPR.PricerData.PriceTree
ans = struct with fields:
     PTree: {1x16 cell}
    ExTree: {1x16 cell}
      tObs: [0 0.0667 0.1333 0.2000 0.2667 0.3333 0.4000 0.4667 0.5333 ... ]
      dObs: [01-Jan-2018 00:00:00    25-Jan-2018 08:00:00    ...    ]
     Probs: [2x15 double]

This example shows the workflow to price an Barrier instrument when you use a BlackScholes model and a AssetMonteCarlo pricing method.

Create Barrier Instrument Object

Use fininstrument to create an Barrier instrument object.

BarrierOpt = fininstrument("Barrier",'Strike',45,'ExerciseDate',datetime(2019,1,1),'OptionType',"call",'ExerciseStyle',"american",'BarrierType',"DO",'BarrierValue',40,'Name',"barrier_option")
BarrierOpt = 
  Barrier with properties:

       OptionType: "call"
           Strike: 45
      BarrierType: "do"
     BarrierValue: 40
           Rebate: 0
    ExerciseStyle: "american"
     ExerciseDate: 01-Jan-2019
             Name: "barrier_option"

Create BlackScholes Model Object

Use finmodel to create a BlackScholes model object.

BlackScholesModel = finmodel("BlackScholes",'Volatility',0.30)
BlackScholesModel = 
  BlackScholes with properties:

     Volatility: 0.3000
    Correlation: 1

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

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

                 Type: "zero"
          Compounding: -1
                Basis: 1
                Dates: 01-Jan-2023
                Rates: 0.0350
               Settle: 01-Jan-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",BlackScholesModel,'SpotPrice',200,'simulationDates',datetime(2019,1,1))
outPricer = 
  GBMMonteCarlo with properties:

      DiscountCurve: [1x1 ratecurve]
          SpotPrice: 200
    SimulationDates: 01-Jan-2019
          NumTrials: 1000
      RandomNumbers: []
              Model: [1x1 finmodel.BlackScholes]
       DividendType: "continuous"
      DividendValue: 0

Price Barrier Instrument

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

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

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

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

    156.63    1.0004    -7.6028e-12    1.2774    43.45      0      0.67904

This example shows the workflow to price an Barrier instrument when you use a Heston model and an AssetMonteCarlo pricing method.

Create Barrier Instrument Object

Use fininstrument to create an Barrier instrument object.

BarrierOpt = fininstrument("Barrier",'Strike',45,'ExerciseDate',datetime(2019,1,1),'OptionType',"call",'ExerciseStyle',"american",'BarrierType',"DO",'BarrierValue',40,'Name',"barrier_option")
BarrierOpt = 
  Barrier with properties:

       OptionType: "call"
           Strike: 45
      BarrierType: "do"
     BarrierValue: 40
           Rebate: 0
    ExerciseStyle: "american"
     ExerciseDate: 01-Jan-2019
             Name: "barrier_option"

Create Heston Model Object

Use finmodel to create a Heston model object.

HestonModel = finmodel("Heston",'V0',0.032,'ThetaV',0.1,'Kappa',0.003,'SigmaV',0.2,'RhoSV',0.9)
HestonModel = 
  Heston with properties:

        V0: 0.0320
    ThetaV: 0.1000
     Kappa: 0.0030
    SigmaV: 0.2000
     RhoSV: 0.9000

Create ratecurve Object

Create a flat ratecurve object using ratecurve.

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

                 Type: "zero"
          Compounding: -1
                Basis: 1
                Dates: 01-Jan-2023
                Rates: 0.0350
               Settle: 01-Jan-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",HestonModel,'SpotPrice',200,'simulationDates',datetime(2019,1,1))
outPricer = 
  HestonMonteCarlo with properties:

      DiscountCurve: [1x1 ratecurve]
          SpotPrice: 200
    SimulationDates: 01-Jan-2019
          NumTrials: 1000
      RandomNumbers: []
              Model: [1x1 finmodel.Heston]
       DividendType: "continuous"
      DividendValue: 0

Price Barrier Instrument

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

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

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

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

     157     1.0022    -1.08e-12    1.2768    43.45      0      2.7882    0.0013677

More About

expand all

Introduced in R2020a