# bkput

Price European put option on bonds using Black model

## Syntax

## Description

adds optional input arguments for `PutPrice`

= bkput(___,`Period`

,`Basis`

,`EndMonthRule`

,`InterpMethod`

,`StrikeConvention`

)`Period`

,
`Basis`

, `EndMonthRule`

,
`InterpMethod`

, and
`StrikeConvention`

.

## Examples

### Price European Put Options On Bonds Using the Black Model

This example shows how to price European put options on bonds using the Black model. Consider a European put option on a bond maturing in 10 years. The underlying bond has a clean price of $122.82, a face value of $100, and pays 8% semiannual coupons. Also, assume that the annualized volatility of the forward bond yield is 20%. Furthermore, suppose the option expires in 2.25 years and has a strike price of $115, and that the annualized continuously compounded risk free zero (spot) curve is flat at 5%. For a hypothetical settlement date of March 15, 2004, the following code illustrates the use of Black's model to duplicate the put prices in Example 22.2 of the Hull reference. In particular, it illustrates how to convert a broker's yield volatility to a price volatility suitable for Black's model.

% Specify the option information. Settle = '15-Mar-2004'; Expiry = '15-Jun-2006'; % 2.25 years from settlement Strike = 115; YieldSigma = 0.2; Convention = [0; 1]; % Specify the interest-rate environment. Since the % zero curve is flat, interpolation into the curve always returns % 0.05. Thus, the following curve is not unique to the solution. ZeroData = [datenum('15-Jun-2004') 0.05 -1; datenum('15-Dec-2004') 0.05 -1; datenum(Expiry) 0.05 -1]; % Specify the bond information. CleanPrice = 122.82; CouponRate = 0.08; Maturity = '15-Mar-2014'; % 10 years from settlement Face = 100; BondData = [CleanPrice CouponRate datenum(Maturity) Face]; Period = 2; % semiannual coupons Basis = 1; % 30/360 day-count basis % Convert a broker's yield volatility quote to a price volatility % required by Black's model. To duplicate Example 22.2 in Hull, % first compute the periodic (semiannual) yield to maturity from % the clean bond price. Yield = bndyield(CleanPrice, CouponRate, Settle, Maturity,... Period, Basis); % Compute the duration of the bond at option expiration. Most % fixed-income sensitivity analyses use the modified duration % statistic to examine the impact of small changes in periodic % yields on bond prices. However, Hull's example operates in % continuous time (annualized instantaneous volatilities and % continuously compounded zero yields for discounting coupons). % To duplicate Hull's results, use the second output of BNDDURY, % the Macaulay duration. [Modified, Macaulay] = bnddury(Yield, CouponRate, Expiry,... Maturity, Period, Basis); % Convert the yield-to-maturity from a periodic to a % continuous yield. Yield = Period .* log(1 + Yield./Period); % Convert the yield volatility to a price volatility via % Hull's Equation 22.6 (page 514). PriceSigma = Macaulay .* Yield .* YieldSigma; % Finally, call Black's model. PutPrices = bkput(Strike, ZeroData, PriceSigma, BondData,... Settle, Expiry, Period, Basis, [], [], Convention)

`PutPrices = `*2×1*
1.7838
2.4071

When the strike price is the dirty price (`Convention`

= `0`

), the call option value is $1.78. When the strike price is the clean price (`Convention`

= `1`

), the call option value is $2.41.

## Input Arguments

`Strike`

— Strike price

numeric

Strike price, specified as a scalar numeric or an
`NOPT`

-by-`1`

vector of strike
prices.

**Data Types: **`double`

`ZeroData`

— Zero rate information used to discount future cash flows

matrix

Zero rate information used to discount future cash flows, specified using a two-column (optionally three-column) matrix containing zero (spot) rate information used to discount future cash flows.

Column 1 — Serial maturity date associated with the zero rate in the second column.

Column 2 — Annualized zero rates, in decimal form, appropriate for discounting cash flows occurring on the date specified in the first column. All dates must occur after

`Settle`

(dates must correspond to future investment horizons) and must be in ascending order.Column 3 — (optional) Annual compounding frequency. Values are

`1`

(annual),`2`

(semiannual, default),`3`

(three times per year),`4`

(quarterly),`6`

(bimonthly),`12`

(monthly), and`-1`

(continuous).

If cash flows occur beyond the dates spanned by
`ZeroData`

, the input zero curve, the appropriate zero
rate for discounting such cash flows is obtained by extrapolating the
nearest rate on the curve (that is, if a cash flow occurs before the first
or after the last date on the input zero curve, a flat curve is
assumed).

In addition, you can use the method `getZeroRates`

for an
`IRDataCurve`

object with a `Dates`

property to create a vector of dates and data acceptable for
`bkput`

. For more information, see Converting an IRDataCurve or IRFunctionCurve Object.

**Data Types: **`double`

`Sigma`

— Annualized price volatilities required by Black model

numeric

Annualized price volatilities required by the Black model, specified as a
scalar or an `NOPT`

-by-`1`

vector.

**Data Types: **`struct`

`BondData`

— Characteristics of underlying bonds

vector

Characteristics of underlying bonds, specified as a row vector with three
(optionally four) columns or `NOPT`

-by-`3`

(optionally `NOPT`

-by-`4`

) matrix
specifying characteristics of underlying bonds in the form:

`[CleanPrice CouponRate Maturity Face]`

`CleanPrice`

is the price excluding accrued interest.`CouponRate`

is the decimal coupon rate.`Maturity`

is the bond maturity date using a serial date number, date character vector, or string.`Face`

is the face value of the bond. If unspecified, the face value is assumed to be 100.

**Data Types: **`double`

| `char`

| `string`

`Settle`

— Settlement date

string scalar | date character vector | serial date number

Settlement date, specified as a scalar string, date character vector, or
serial date number. `Settle`

also represents the starting
reference date for the input zero curve.

**Data Types: **`char`

| `double`

| `string`

`Expiry`

— Option maturity date

string array | date character vector | serial date number

Option maturity date, specified as an
`NOPT`

-by-`1`

vector using a string
array, date character vectors, or serial date numbers.

**Data Types: **`char`

| `string`

| `double`

`Period`

— Number of coupons per year for underlying bond

`2`

(semiannual) (default) | integer with value `0`

, `1`

,
`2`

, `3`

, `4`

,
`6`

, or `12`

(Optional) Number of coupons per year for the underlying bond, specified
as an integer with supported values of `0`

,
`1`

, `2`

, `3`

,
`4`

, `6`

, and
`12`

.

**Data Types: **`double`

`Basis`

— Day-count basis of underlying bonds

`0`

(actual/actual) (default) | integer from `0`

to `13`

(Optional) Day-count basis of underlying bonds, specified as a scalar or
an `NOPT`

-by-`1`

vector using the
following values:

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

For more information, see Basis.

**Data Types: **`double`

`EndMonthRule`

— End-of-month rule flag

`1`

(in effect) (default) | nonnegative integer `[0,1]`

(Optional) End-of-month rule flag, specified as a scalar or an
`NOPT`

-by-`1`

vector of end-of-month rules.

`0`

= Ignore rule, meaning that a bond coupon payment date is always the same numerical day of the month.`1`

= Set rule on, meaning that a bond coupon payment date is always the last actual day of the month.

**Data Types: **`logical`

`InterpMethod`

— Zero curve interpolation method

`1`

(linear interpolation) (default) | integer with value `0`

, `1`

, or
`2`

(Optional) Zero curve interpolation method for cash flows that do not fall
on a date found in the `ZeroData`

spot curve, specified
as a scalar integer. `InterpMethod`

is used to interpolate
the appropriate zero discount rate. Available interpolation methods are
(`0`

) nearest, (`1`

) linear, and
(`2`

) cubic. For more information on interpolation
methods, see `interp1`

.

**Data Types: **`double`

`StrikeConvention`

— Option contract strike price convention

`0`

(default) | integer with value `0`

or `1`

(Optional) Option contract strike price convention, specified as a scalar
or an `NOPT`

-by-`1`

vector.

`StrikeConvention = 0`

(default) defines the strike price
as the cash (dirty) price paid for the underlying bond.

`StrikeConvention = 1`

defines the strike price as the
quoted (clean) price paid for the underlying bond. When evaluating Black's
model, the accrued interest of the bond at option expiration is added to the
input strike price.

**Data Types: **`double`

## Output Arguments

`PutPrice`

— Price for European put option on bonds derived from Black model

vector

Price for European put option on bonds derived from the Black model,
returned as a `NOPT`

-by-`1`

vector.

## References

[1] Hull, John C.
*Options, Futures, and Other Derivatives.* 5th Edition,
Prentice Hall, 2003, pp. 287–288, 508–515.

## Version History

**Introduced before R2006a**

## Open Example

You have a modified version of this example. Do you want to open this example with your edits?

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

## How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)