# floorbyblk

Price floors using Black option pricing model

## Syntax

``````[FloorPrice,Floorlets] = floorbyblk(RateSpec,Strike,Settle,Maturity,Volatility)``````
``````[FloorPrice,Floorlets] = floorbyblk(___,Name,Value)``````

## Description

example

``````[FloorPrice,Floorlets] = floorbyblk(RateSpec,Strike,Settle,Maturity,Volatility)``` price floors using the Black option pricing model. `floorbyblk` computes prices of vanilla floors and amortizing floors.```

example

``````[FloorPrice,Floorlets] = floorbyblk(___,Name,Value)``` adds optional name-value pair arguments.```

## Examples

collapse all

This example shows how to price a floor using the Black option pricing model. Consider an investor who gets into a contract that floors the interest rate on a \$100,000 loan at 6% quarterly compounded for 3 months, starting on January 1, 2009. Assuming that on January 1, 2008 the zero rate is 6.9394% continuously compounded and the volatility is 20%, use this data to compute the floor price.

```ValuationDate = 'Jan-01-2008'; EndDates ='April-01-2010'; Rates = 0.069394; Compounding = -1; Basis = 1; % calculate the RateSpec RateSpec = intenvset('ValuationDate', ValuationDate, ... 'StartDates', ValuationDate,'EndDates', EndDates, ... 'Rates', Rates,'Compounding', Compounding,'Basis', Basis); Settle = 'Jan-01-2009'; % floor starts in a year Maturity = 'April-01-2009'; Volatility = 0.20; FloorRate = 0.06; FloorReset = 4; Principal=100000; FloorPrice = floorbyblk(RateSpec, FloorRate, Settle, Maturity, Volatility,... 'Reset',FloorReset,'ValuationDate',ValuationDate,'Principal', Principal,... 'Basis', Basis)```
```FloorPrice = 37.4864 ```

Define the OIS and Libor rates.

```Settle = datenum('15-Mar-2013'); CurveDates = daysadd(Settle,360*[1/12 2/12 3/12 6/12 1 2 3 4 5 7 10],1); OISRates = [.0018 .0019 .0021 .0023 .0031 .006 .011 .017 .021 .026 .03]'; LiborRates = [.0045 .0047 .005 .0055 .0075 .0109 .0162 .0216 .0262 .0309 .0348]';```

Create an associated `RateSpec` for the OIS and Libor curves.

```OISCurve = intenvset('Rates',OISRates,'StartDate',Settle,'EndDates',CurveDates,'Compounding',2,'Basis',1); LiborCurve = intenvset('Rates',LiborRates,'StartDate',Settle,'EndDates',CurveDates,'Compounding',2,'Basis',1);```

Define the Floor instruments.

```Maturity = {'15-Mar-2018';'15-Mar-2020'}; Strike = [.04;.05]; BlackVol = .2;```

Price the floor instruments using the term structure `OISCurve` both for discounting the cash flows and generating future forward rates.

`[Price, Floorlets] = floorbyblk(OISCurve, Strike, Settle, Maturity, BlackVol)`
```Price = 2×1 9.9808 16.9057 ```
```Floorlets = 2×7 3.6783 3.0706 1.8275 0.7280 0.6764 NaN NaN 4.6753 4.0587 2.7921 1.4763 1.3442 1.4130 1.1462 ```

Price the floor instruments using the term structure `LiborCurve` to generate future forward rates. The term structure `OISCurve` is used for discounting the cash flows.

`[PriceLC, FloorletsLC] = floorbyblk(OISCurve, Strike, Settle, Maturity, BlackVol,'ProjectionCurve',LiborCurve)`
```PriceLC = 2×1 8.0524 14.3184 ```
```FloorletsLC = 2×7 3.2385 2.5338 1.2895 0.5889 0.4017 NaN NaN 4.2355 3.5219 2.2286 1.2751 0.9169 1.1698 0.9706 ```

Define the `RateSpec`.

```Rates = [0.0358; 0.0421; 0.0473; 0.0527; 0.0543]; ValuationDate = '15-Nov-2011'; StartDates = ValuationDate; EndDates = {'15-Nov-2012';'15-Nov-2013';'15-Nov-2014' ;'15-Nov-2015';'15-Nov-2016'}; Compounding = 1; RateSpec = intenvset('ValuationDate', ValuationDate,'StartDates', StartDates,... 'EndDates', EndDates,'Rates', Rates, 'Compounding', Compounding)```
```RateSpec = struct with fields: FinObj: 'RateSpec' Compounding: 1 Disc: [5x1 double] Rates: [5x1 double] EndTimes: [5x1 double] StartTimes: [5x1 double] EndDates: [5x1 double] StartDates: 734822 ValuationDate: 734822 Basis: 0 EndMonthRule: 1 ```

Define the floor instrument.

```Settle ='15-Nov-2011'; Maturity = '15-Nov-2015'; Strike = 0.05; Reset = 2; Principal ={{'15-Nov-2012' 100;'15-Nov-2013' 70;'15-Nov-2014' 40;'15-Nov-2015' 10}};```

Price the amortizing floor.

```Volatility = 0.20; Price = floorbyblk(RateSpec, Strike, Settle, Maturity, Volatility,... 'Reset',Reset,'Principal', Principal)```
```Price = 1.9315 ```

Create the `RateSpec`.

```ValuationDate = 'Mar-01-2016'; EndDates = {'Mar-01-2017';'Mar-01-2018';'Mar-01-2019';'Mar-01-2020';'Mar-01-2021'}; Rates = [-0.21; -0.12; 0.01; 0.10; 0.20]/100; Compounding = 1; Basis = 1; RateSpec = intenvset('ValuationDate',ValuationDate,'StartDates',ValuationDate, ... 'EndDates',EndDates,'Rates',Rates,'Compounding',Compounding,'Basis',Basis)```
```RateSpec = struct with fields: FinObj: 'RateSpec' Compounding: 1 Disc: [5x1 double] Rates: [5x1 double] EndTimes: [5x1 double] StartTimes: [5x1 double] EndDates: [5x1 double] StartDates: 736390 ValuationDate: 736390 Basis: 1 EndMonthRule: 1 ```

Price the floor with a negative strike using the Shifted Black model.

```Settle = 'Jun-01-2016'; % Floor starts in 3 months. Maturity = 'Sep-01-2016'; ShiftedBlackVolatility = 0.31; FloorRate = -0.001; % -0.1 percent strike. FloorReset = 4; Principal = 100000; Shift = 0.01; % 1 percent shift. FloorPrice = floorbyblk(RateSpec,FloorRate,Settle,Maturity,ShiftedBlackVolatility,... 'Reset',FloorReset,'ValuationDate',ValuationDate,'Principal',Principal,... 'Basis',Basis,'Shift',Shift)```
```FloorPrice = 31.2099 ```

## Input Arguments

collapse all

Interest-rate term structure (annualized and continuously compounded), specified by the `RateSpec` obtained from `intenvset`. For information on the interest-rate specification, see `intenvset`.

Data Types: `struct`

Rate at which floor is exercised, specified as a `NINST`-by-`1` vector of decimal values.

Data Types: `double`

Settlement date for the floor, specified as a serial date number or a date character vector.

Data Types: `double` | `char`

Maturity date for the floor, specified as a serial date number or date character vector.

Data Types: `double` | `char`

Volatilities values, specified as a `NINST`-by-`1` vector of numeric values.

The `Volatility` input is not intended for volatility surfaces or cubes. If you specify a matrix for the `Volatility` input, `floorbyblk` internally converts it into a vector. `floorbyblk` assumes that the volatilities specified in the `Volatility` input are flat volatilities, which are applied equally to each of the floorlets.

Data Types: `double`

### Name-Value Arguments

Specify 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.

Before R2021a, use commas to separate each name and value, and enclose `Name` in quotes.

Example: `[FloorPrice,Floorlets] = floorbyblk(RateSpec,Strike,Settle,Maturity,Volatility,'Reset',CapReset,'Principal',100000,'Basis',7) `

Reset frequency payment per year, specified as a `NINST`-by-`1` vector.

Data Types: `double`

Notional principal amount, specified as a `NINST`-by-`1` of notional principal amounts, or a `NINST`-by-`1` cell array. When `Principal` is a `NINST`-by-`1` cell array, each element is a `NumDates`-by-`2` cell array, where the first column is dates and the second column is associated principal amount. The date indicates the last day that the principal value is valid.

Use `Principal` to pass a schedule to compute the price for an amortizing floor.

Data Types: `double` | `cell`

Day-count basis representing the basis used when annualizing the input forward rate, specified as a `NINST`-by-`1` vector of integers.

• 0 = actual/actual

• 1 = 30/360 (SIA)

• 2 = actual/360

• 3 = actual/365

• 4 = 30/360 (PSA)

• 5 = 30/360 (ISDA)

• 6 = 30/360 (European)

• 7 = actual/365 (Japanese)

• 8 = actual/actual (ICMA)

• 9 = actual/360 (ICMA)

• 10 = actual/365 (ICMA)

• 11 = 30/360E (ICMA)

• 12 = actual/365 (ISDA)

• 13 = BUS/252

Data Types: `double`

The rate curve to be used in generating the future forward rates. This structure must be created using `intenvset`. Use this optional input if the forward curve is different from the discount curve.

Data Types: `struct`

Shift in decimals for the shifted Black model, specified using a scalar or `NINST`-by-`1` vector of rate shifts in positive decimals. Set this parameter to a positive rate shift in decimals to add a positive shift to the forward rate and strike, which effectively sets a negative lower bound for the forward rate. For example, a `Shift` of `0.01` is equal to a 1% shift.

Data Types: `double`

## Output Arguments

collapse all

Expected price of the floor, returned as a `NINST`-by-`1` vector.

Floorlets, returned as a `NINST`-by-`NCF` array of floorlets, padded with `NaN`s.

collapse all

### Floor

A floor is a contract that includes a guarantee setting the minimum interest rate to be received by the holder, based on an otherwise floating interest rate.

The payoff for a floor is:

$\mathrm{max}\left(FloorRate-CurrentRate,0\right)$

### Shifted Black

The Shifted Black model is essentially the same as the Black’s model, except that it models the movements of (F + Shift) as the underlying asset, instead of F (which is the forward rate in the case of floorlets).

This model allows negative rates, with a fixed negative lower bound defined by the amount of shift; that is, the zero lower bound of Black’s model has been shifted.

## Algorithms

collapse all

### Black Model

Where F is the forward value and K is the strike.

### Shifted Black Model

Where F+Shift is the forward value and K+Shift is the strike for the shifted version.

## Version History

Introduced in R2009a