Price European put option on bonds using Black model
PutPrice = bkput(Strike, ZeroData, Sigma, BondData, Settle, Expiry,
Period, Basis, EndMonthRule, InterpMethod, StrikeConvention)
Scalar or number of options (NOPT)-by-1 vector of strike prices.
Two-column (optionally three-column) matrix containing zero (spot) rate information used to discount future cash flows.
Scalar or NOPT-by-1 vector of annualized price volatilities required by Black's model.
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] where:
Settlement date of the options. May be a serial date number or date string. Settle also represents the starting reference date for the input zero curve.
Scalar or NOPT-by-1 vector of option maturity dates. May be a serial date number or date string.
(Optional) Number of coupons per year for the underlying bond. Default = 2 (semiannual). Supported values are 0, 1, 2, 3, 4, 6, and 12.
(Optional) Day-count basis of the bond. A vector of integers.
For more information, see basis.
(Optional) End-of-month rule. This rule applies only when Maturity is an end-of-month date for a month having 30 or fewer days. 0 = ignore rule, meaning that a bond's coupon payment date is always the same numerical day of the month. 1 = set rule on (default), meaning that a bond's coupon payment date is always the last actual day of the month.
(Optional) Scalar integer zero curve interpolation method. For cash flows that do not fall on a date found in the ZeroData spot curve, indicates the method used to interpolate the appropriate zero discount rate. Available methods are (0) nearest, (1) linear, and (2) cubic. Default = 1. See interp1 for more information.
(Optional) Scalar or NOPT-by-1 vector of option contract strike price conventions.
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. The accrued interest of the bond at option expiration is added to the input strike price when evaluating Black's model.
PutPrice = bkput(Strike, ZeroData, Sigma, BondData, Settle, Expiry, Period, Basis, EndMonthRule, InterpMethod, StrikeConvention) using Black's model, derives an NOPT-by-1 vector of prices of European put options on bonds.
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 Financial Instruments Toolbox™ 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.
This example is based on example 22.2, page 514, of Hull. (See References below.)
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); % Finally, 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 = 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.
 Hull, John C., Options, Futures, and Other Derivatives, Prentice Hall, 5th edition, 2003, pp. 287-288, 508-515.