# floorbynormal

Price floors using Normal or Bachelier pricing model

## Syntax

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

## Description

example

``````[FloorPrice,Floorlets] = floorbynormal(RateSpec,Strike,Settle,Maturity,Volatility)``` prices floors using the Normal (Bachelier) pricing model for negative rates. `floorbynormal` computes prices of vanilla floors and amortizing floors. NoteAlternatively, you can use the `Floor` object to price floor instruments. For more information, see Get Started with Workflows Using Object-Based Framework for Pricing Financial Instruments. ```

example

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

## Examples

collapse all

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 .69394% continuously compounded and the volatility is 20%, use this data to compute the floor price. First, calculate the `RateSpec`, and then use `floorbynormal` to compute the `FloorPrice`.

```ValuationDate = datetime(2008,1,1); EndDates = datetime(2010,1,1); Rates = 0.0069394; Compounding = -1; Basis = 1; % calculate the RateSpec RateSpec = intenvset('ValuationDate', ValuationDate, ... 'StartDates', ValuationDate,'EndDates', EndDates, ... 'Rates', Rates,'Compounding', Compounding,'Basis', Basis); Settle = datetime(2009,1,1); % floor starts in a year Maturity = datetime(2009,4,1); Volatility = 0.20; FloorRate = -0.006; FloorReset = 4; Principal=100000; FloorPrice = floorbynormal(RateSpec, FloorRate, Settle, Maturity, Volatility,... 'Reset',FloorReset,'ValuationDate',ValuationDate,'Principal', Principal,... 'Basis', Basis)```
```FloorPrice = 1.8212e+03 ```

Define the `RateSpec`.

```Settle = datetime(2016,1,20); ZeroTimes = [.5 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 = datemnth(Settle,12*ZeroTimes); RateSpec = intenvset('StartDate',Settle,'EndDates',ZeroDates,'Rates',ZeroRates)```
```RateSpec = struct with fields: FinObj: 'RateSpec' Compounding: 2 Disc: [10x1 double] Rates: [10x1 double] EndTimes: [10x1 double] StartTimes: [10x1 double] EndDates: [10x1 double] StartDates: 736349 ValuationDate: 736349 Basis: 0 EndMonthRule: 1 ```

Define the floor instrument and price with `floorbyblk`.

```ExerciseDate = datetime(2026,1,20); [~,ParSwapRate] = swapbyzero(RateSpec,[NaN 0],Settle,ExerciseDate)```
```ParSwapRate = 0.0216 ```
```Strike = .01; BlackVol = .3; NormalVol = BlackVol*ParSwapRate; Price = floorbyblk(RateSpec,Strike,Settle,ExerciseDate,BlackVol)```
```Price = 1.2297 ```

Price the floor instrument using `floorbynormal`.

`Price_Normal = floorbynormal(RateSpec,Strike,Settle,ExerciseDate,NormalVol)`
```Price_Normal = 1.9099 ```

Price the floor instrument using `floorbynormal` for a negative strike.

` Price_Normal = floorbynormal(RateSpec,-.005,Settle,ExerciseDate,NormalVol)`
```Price_Normal = 0.0857 ```

## 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 `NINST`-by-`1` vector using a datetime array, string array, or date character vectors.

To support existing code, `floorbynormal` also accepts serial date numbers as inputs, but they are not recommended.

Maturity date for the floor, specified as a `NINST`-by-`1` vector using a datetime array, string array, or date character vectors.

To support existing code, `floorbynormal` also accepts serial date numbers as inputs, but they are not recommended.

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

For more information on the Normal model, see Work with Negative Interest Rates Using Functions.

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] = floorbynormal(RateSpec,Strike,Settle,Maturity,Volatility,'Reset',CapReset,'Principal',100000,'Basis',7) `

Reset frequency payment per year, specified as the comma-separated pair consisting of `'Reset'` and a `NINST`-by-`1` vector.

Data Types: `double`

Notional principal amount, specified as the comma-separated pair consisting of `'Principal'` and a `NINST`-by-`1` vector or a `NINST`-by-`1` cell array. Each element in the `NINST`-by-`1` cell array is a `NumDates`-by-`2` cell array, where the first column is dates, and the second column is the 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 cap.

Data Types: `double` | `cell`

Day-count basis of instrument representing the basis used when annualizing the input forward rate, specified as the comma-separated pair consisting of `'Basis'` and a `NINST`-by-`1` vector of integers. Values are:

• 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`

Observation date of the investment horizon, specified as the comma-separated pair consisting of `'ValuationDate'` and a scalar datetime, string, or date character vector.

To support existing code, `floorbynormal` also accepts serial date numbers as inputs, but they are not recommended.

The rate curve to be used in projecting the future cash flows, specified as the comma-separated pair consisting of `'ProjectionCurve'` and a rate curve structure. This structure must be created using `intenvset`. Use this optional input if the forward curve is different from the discount curve.

Data Types: `struct`

## 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 caplets, 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)$

## Version History

Introduced in R2017a

expand all