Main Content


Price European call option on bonds using Black model


CallPrice = bkcall(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.

  • 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).


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]

CleanPrice is the price excluding accrued interest.

CouponRate is the decimal coupon rate.

Maturity is the bond maturity date in serial date number format.

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


Settlement date of the options, specified as a serial date number or date character vector. Settle also represents the starting reference date for the input zero curve.


Scalar or NOPT-by-1 vector of option maturity dates, specified as a serial date number or date character vector.


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

  • 0 = actual/actual (default)

  • 1 = 30/360 (SIA)

  • 2 = actual/360

  • 3 = actual/365

  • 4 = 30/360 (BMA)

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


(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. When evaluating Black's model, the accrued interest of the bond at option expiration is added to the input strike price.


CallPrice = bkcall(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 call 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 method getZeroRates for an IRDataCurve object with a Dates property to create a vector of dates and data acceptable for bkcall. For more information, see Converting an IRDataCurve or IRFunctionCurve Object.


collapse all

This example shows how to price a European call option on bonds using the Black model. Consider a European call option on a bond maturing in 9.75 years. The underlying bond has a clean price of $935, a face value of $1000, and pays 10% semiannual coupons. Since the bond matures in 9.75 years, a $50 coupon will be paid in 3 months and again in 9 months. Also, assume that the annualized volatility of the forward bond price is 9%. Furthermore, suppose the option expires in 10 months and has a strike price of $1000, and that the annualized continuously compounded risk-free discount rates for maturities of 3, 9, and 10 months are 9%, 9.5%, and 10%, respectively.

% specify the option information
Settle       =  '15-Mar-2004';
Expiry       =  '15-Jan-2005'; % 10 months from settlement
Strike       =  1000;
Sigma        =  0.09;
Convention   =  [0 1]';

% specify the interest-rate environment
ZeroData     = [datenum('15-Jun-2004')  0.09   -1;  % 3 months
                datenum('15-Dec-2004')  0.095  -1;  % 9 months
                datenum(Expiry)         0.10   -1]; % 10 months
% specify the bond information           
CleanPrice   =  935;
CouponRate   =  0.1;
Maturity     = '15-Dec-2013';  % 9.75 years from settlement
Face         =  1000;
BondData     = [CleanPrice CouponRate datenum(Maturity) Face];
Period       =  2;
Basis        =  1;

% call Black's model
CallPrices = bkcall(Strike, ZeroData, Sigma, BondData, Settle,... 
Expiry, Period, Basis, [], [], Convention)
CallPrices = 2×1


When the strike price is the dirty price (Convention = 0), the call option value is $9.49. When the strike price is the clean price (Convention = 1), the call option value is $7.97.


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

Introduced before R2006a